From 504b9b6d23e7cc90b6d863640eecff5e8066e4f2 Mon Sep 17 00:00:00 2001 From: cnc Date: Fri, 5 Jun 2026 15:15:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=88=9A=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84=20AGENTS.md=20=E5=92=8C=20align-linuxcnc=20=E5=8A=A0?= =?UTF-8?q?=E9=80=9F=E8=A7=84=E5=88=99=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:按 align-linuxcnc 先确认干净基线,避免 source-map-only 和 smoke 扩展;增强 WASM Python C API symbol probe,覆盖 LinuxCNC src/emc/rs274ngc/gcodemodule.cc、interp_python.cc、interp_namedparams.cc 等 RS274 Python/remap 源已使用的 inert API 返回边界,包括 PyObject_Str、Py*_Check、PySequence_*、PyObject_*、PyArg_ParseTuple 和 Py_BuildValue。\n\n测试结论:./test-linuxcnc-wasm-python-c-api-symbols.sh、./test-native.sh、./test-linuxcnc-source-link.sh 均通过。 --- core/wasm_shims/python_c_api_probe_main.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/wasm_shims/python_c_api_probe_main.cc b/core/wasm_shims/python_c_api_probe_main.cc index 508fa49..2dde26a 100644 --- a/core/wasm_shims/python_c_api_probe_main.cc +++ b/core/wasm_shims/python_c_api_probe_main.cc @@ -36,9 +36,16 @@ int main() { if (PyUnicode_FromString("linuxcnc") != Py_None) { return 5; } + if (PyObject_Str(Py_None) != Py_None) { + return 16; + } if (std::strcmp(PyUnicode_AsUTF8(Py_None), "") != 0) { return 6; } + if (PyUnicode_Check(Py_None) != 0 || PyLong_Check(Py_None) != 0 || PyFloat_Check(Py_None) != 0 || + PyGen_Check(Py_None) != 0 || PyErr_ExceptionMatches(PyExc_KeyError) != 0) { + return 17; + } if (PyLong_FromLong(7) != Py_None || PyLong_AsLong(Py_None) != 0) { return 7; } @@ -51,9 +58,21 @@ int main() { if (PyList_New(2) != Py_None || PyList_SetItem(Py_None, 0, Py_None) != 0 || PyList_Size(Py_None) != 0) { return 10; } + if (PyTuple_GetItem(Py_None, 0) != Py_None || PyList_GetItem(Py_None, 0) != Py_None || + PySequence_GetItem(Py_None, 0) != Py_None || PySequence_Length(Py_None) != 0) { + return 18; + } if (PyObject_IsTrue(Py_None) != 0 || PyCallable_Check(Py_None) != 0 || PyObject_IsInstance(Py_None, Py_None) != 0) { return 11; } + if (PyObject_CallMethod(Py_None, const_cast("noop"), const_cast("")) != Py_None || + PyObject_GetAttrString(Py_None, "noop") != Py_None || + PyObject_SetAttrString(Py_None, "noop", Py_None) != 0) { + return 19; + } + if (PyArg_ParseTuple(Py_None, "") != 0 || Py_BuildValue("i", 1) != Py_None) { + return 20; + } ProbeObject *probe = PyObject_New(ProbeObject, &PyList_Type); if (!probe || Py_TYPE(reinterpret_cast(probe)) != &PyList_Type) { std::free(probe);