https://github.com/python/cpython/commit/beb653cc24275025708758d444835db2ddbb74e4
commit: beb653cc24275025708758d444835db2ddbb74e4
branch: main
author: Anthony Shaw <[email protected]>
committer: gvanrossum <[email protected]>
date: 2024-05-01T07:11:14-07:00
summary:

gh-117958: Expose JIT code via method in UOpExecutor (#117959)

files:
A Misc/NEWS.d/next/Core and 
Builtins/2024-04-18-03-49-41.gh-issue-117958.-EsfUs.rst
M 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
index 00000000000000..c127786bc129b1
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and 
Builtins/2024-04-18-03-49-41.gh-issue-117958.-EsfUs.rst 
@@ -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
+by Anthony Shaw.
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 6576aa1cddc033..9ba8d84a47dcd9 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -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,

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to