From df6b670b074555ba841914603e850e05ed579992 Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Mon, 6 Jul 2026 14:07:26 +0200 Subject: [PATCH 1/2] Add pyframe functions to c-api --- .cspell.dict/cpython.txt | 1 + crates/capi/src/lib.rs | 1 + crates/capi/src/pyframe.rs | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 crates/capi/src/pyframe.rs diff --git a/.cspell.dict/cpython.txt b/.cspell.dict/cpython.txt index 47ec7dd60c8..64a2e7479fc 100644 --- a/.cspell.dict/cpython.txt +++ b/.cspell.dict/cpython.txt @@ -191,6 +191,7 @@ pycore pyinner pydecimal pyerrors +pyframe Pyfunc pylifecycle pymain diff --git a/crates/capi/src/lib.rs b/crates/capi/src/lib.rs index eba7de2786d..15632648961 100644 --- a/crates/capi/src/lib.rs +++ b/crates/capi/src/lib.rs @@ -28,6 +28,7 @@ pub mod object; pub mod osmodule; pub mod pycapsule; pub mod pyerrors; +pub mod pyframe; pub mod pylifecycle; pub mod pymem; pub mod pystate; diff --git a/crates/capi/src/pyframe.rs b/crates/capi/src/pyframe.rs new file mode 100644 index 00000000000..ddb1a6ff434 --- /dev/null +++ b/crates/capi/src/pyframe.rs @@ -0,0 +1,24 @@ +use crate::PyObject; +use crate::pystate::with_vm; +use rustpython_vm::frame::Frame; + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyFrame_GetCode(frame: *mut PyObject) -> *mut PyObject { + with_vm(|vm| { + let frame = unsafe { &*frame }.try_downcast_ref::(vm)?; + Ok(frame.code.clone()) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyFrame_GetLineNumber(frame: *mut PyObject) -> core::ffi::c_int { + with_vm(|vm| { + let frame = unsafe { &*frame }.try_downcast_ref::(vm)?; + let lineno = if frame.lasti() == 0 { + frame.code.first_line_number.map_or(1, |n| n.get()) + } else { + frame.current_location().line.get() + }; + Ok(lineno as core::ffi::c_int) + }) +} From adf599537188894ef40edc7afb7fe3631ae6de14 Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Mon, 6 Jul 2026 14:18:50 +0200 Subject: [PATCH 2/2] Review --- crates/capi/src/pyframe.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/crates/capi/src/pyframe.rs b/crates/capi/src/pyframe.rs index ddb1a6ff434..d8e9d124bb0 100644 --- a/crates/capi/src/pyframe.rs +++ b/crates/capi/src/pyframe.rs @@ -6,7 +6,7 @@ use rustpython_vm::frame::Frame; pub unsafe extern "C" fn PyFrame_GetCode(frame: *mut PyObject) -> *mut PyObject { with_vm(|vm| { let frame = unsafe { &*frame }.try_downcast_ref::(vm)?; - Ok(frame.code.clone()) + Ok(frame.f_code()) }) } @@ -14,11 +14,6 @@ pub unsafe extern "C" fn PyFrame_GetCode(frame: *mut PyObject) -> *mut PyObject pub unsafe extern "C" fn PyFrame_GetLineNumber(frame: *mut PyObject) -> core::ffi::c_int { with_vm(|vm| { let frame = unsafe { &*frame }.try_downcast_ref::(vm)?; - let lineno = if frame.lasti() == 0 { - frame.code.first_line_number.map_or(1, |n| n.get()) - } else { - frame.current_location().line.get() - }; - Ok(lineno as core::ffi::c_int) + Ok(frame.f_lineno() as core::ffi::c_int) }) }