diff --git a/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc b/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc index 6aa9b65..8fdf44c 100644 --- a/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc +++ b/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc @@ -1,4 +1,5 @@ #include "cnc_sim_api.h" +#include "boost/python/object.hpp" #include "hal.h" #include "libnml/nml/stat_msg.hh" @@ -9,6 +10,14 @@ #include #include +extern int _task; + +extern "C" { +extern PyObject *PyInit_interpreter(void); +extern PyObject *PyInit_emccanon(void); +extern struct _inittab builtin_modules[]; +} + // LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc provides read(), // execute(), and wordexp() paths; interp_convert.cc converts G0, G2, and M30. // src/emc/rs274ngc/interp_namedparams.cc calls the HAL lookup functions @@ -129,6 +138,23 @@ bool nml_status_constructors_match_linuxcnc() { status._state == -1; } +bool builtin_modules_match_linuxcnc_preview_runtime() { + // LinuxCNC source basis: src/emc/rs274ngc/gcodemodule.cc defines _task=0 + // for preview and registers interpreter/emccanon builtin module entries; + // src/emc/task/taskclass.cc uses the same builtin module table shape. + return _task == 0 && + builtin_modules[0].name && + std::strcmp(builtin_modules[0].name, "interpreter") == 0 && + builtin_modules[0].initfunc == PyInit_interpreter && + builtin_modules[0].initfunc() == nullptr && + builtin_modules[1].name && + std::strcmp(builtin_modules[1].name, "emccanon") == 0 && + builtin_modules[1].initfunc == PyInit_emccanon && + builtin_modules[1].initfunc() == nullptr && + builtin_modules[2].name == nullptr && + builtin_modules[2].initfunc == nullptr; +} + } // namespace int main() { @@ -147,6 +173,9 @@ int main() { if (!nml_status_constructors_match_linuxcnc()) { return 9; } + if (!builtin_modules_match_linuxcnc_preview_runtime()) { + return 10; + } std::vector events; CncSimHandle *sim = cnc_sim_create();