]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117958: Expose JIT code via method in UOpExecutor (#117959)
authorAnthony Shaw <anthony.p.shaw@gmail.com>
Wed, 1 May 2024 14:11:14 +0000 (00:11 +1000)
committerGitHub <noreply@github.com>
Wed, 1 May 2024 14:11:14 +0000 (07:11 -0700)
Misc/NEWS.d/next/Core and Builtins/2024-04-18-03-49-41.gh-issue-117958.-EsfUs.rst [new file with mode: 0644]
Python/optimizer.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-04-18-03-49-41.gh-issue-117958.-EsfUs.rst b/Misc/NEWS.d/next/Core and Builtins/2024-04-18-03-49-41.gh-issue-117958.-EsfUs.rst
new file mode 100644 (file)
index 0000000..c127786
--- /dev/null
@@ -0,0 +1,2 @@
+Added a ``get_jit_code()`` method to access JIT compiled machine code from the UOp Executor when the experimental JIT is enabled. Patch\r
+by Anthony Shaw.\r
index 6576aa1cddc033c009051dd6f34c7085d8f588fa..9ba8d84a47dcd9d79c1c1bccbd839d050692e4f4 100644 (file)
@@ -393,6 +393,29 @@ executor_traverse(PyObject *o, visitproc visit, void *arg)
     return 0;
 }
 
+static PyObject *
+get_jit_code(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+#ifndef _Py_JIT
+    PyErr_SetString(PyExc_RuntimeError, "JIT support not enabled.");
+    return NULL;
+#else
+    _PyExecutorObject *executor = (_PyExecutorObject *)self;
+    if (executor->jit_code == NULL || executor->jit_size == 0) {
+        Py_RETURN_NONE;
+    }
+    return PyBytes_FromStringAndSize(executor->jit_code, executor->jit_size);
+#endif
+}
+
+static PyMethodDef uop_executor_methods[] = {
+    { "is_valid", is_valid, METH_NOARGS, NULL },
+    { "get_jit_code", get_jit_code, METH_NOARGS, NULL},
+    { "get_opcode", get_opcode, METH_NOARGS, NULL },
+    { "get_oparg", get_oparg, METH_NOARGS, NULL },
+    { NULL, NULL },
+};
+
 static int
 executor_is_gc(PyObject *o)
 {
@@ -407,7 +430,7 @@ PyTypeObject _PyUOpExecutor_Type = {
     .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_HAVE_GC,
     .tp_dealloc = (destructor)uop_dealloc,
     .tp_as_sequence = &uop_as_sequence,
-    .tp_methods = executor_methods,
+    .tp_methods = uop_executor_methods,
     .tp_traverse = executor_traverse,
     .tp_clear = (inquiry)executor_clear,
     .tp_is_gc = executor_is_gc,