@@ -20,8 +20,8 @@ fn bench_cpython_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchma
20
20
let gil = cpython:: Python :: acquire_gil ( ) ;
21
21
let py = gil. python ( ) ;
22
22
23
- let bench_func = |( globals, locals) | {
24
- let res = py . run ( & bench . code , Some ( & globals) , Some ( & locals) ) ;
23
+ let bench_func = |( code , globals, locals) | {
24
+ let res = cpy_run_code ( py , & code, & globals, & locals) ;
25
25
if let Err ( e) = res {
26
26
e. print ( py) ;
27
27
panic ! ( "Error running microbenchmark" )
@@ -40,7 +40,10 @@ fn bench_cpython_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchma
40
40
e. print ( py) ;
41
41
panic ! ( "Error running microbenchmark setup code" )
42
42
}
43
- ( globals, locals)
43
+ let code = std:: ffi:: CString :: new ( & * bench. code ) . unwrap ( ) ;
44
+ let name = std:: ffi:: CString :: new ( & * bench. name ) . unwrap ( ) ;
45
+ let code = cpy_compile_code ( py, & code, & name) . unwrap ( ) ;
46
+ ( code, globals, locals)
44
47
} ;
45
48
46
49
if bench. iterate {
@@ -61,6 +64,42 @@ fn bench_cpython_code(group: &mut BenchmarkGroup<WallTime>, bench: &MicroBenchma
61
64
}
62
65
}
63
66
67
+ unsafe fn cpy_res (
68
+ py : cpython:: Python < ' _ > ,
69
+ x : * mut python3_sys:: PyObject ,
70
+ ) -> cpython:: PyResult < cpython:: PyObject > {
71
+ cpython:: PyObject :: from_owned_ptr_opt ( py, x) . ok_or_else ( || cpython:: PyErr :: fetch ( py) )
72
+ }
73
+
74
+ fn cpy_compile_code (
75
+ py : cpython:: Python < ' _ > ,
76
+ s : & std:: ffi:: CStr ,
77
+ fname : & std:: ffi:: CStr ,
78
+ ) -> cpython:: PyResult < cpython:: PyObject > {
79
+ unsafe {
80
+ let res =
81
+ python3_sys:: Py_CompileString ( s. as_ptr ( ) , fname. as_ptr ( ) , python3_sys:: Py_file_input ) ;
82
+ cpy_res ( py, res)
83
+ }
84
+ }
85
+
86
+ fn cpy_run_code (
87
+ py : cpython:: Python < ' _ > ,
88
+ code : & cpython:: PyObject ,
89
+ locals : & cpython:: PyDict ,
90
+ globals : & cpython:: PyDict ,
91
+ ) -> cpython:: PyResult < cpython:: PyObject > {
92
+ use cpython:: PythonObject ;
93
+ unsafe {
94
+ let res = python3_sys:: PyEval_EvalCode (
95
+ code. as_ptr ( ) ,
96
+ locals. as_object ( ) . as_ptr ( ) ,
97
+ globals. as_object ( ) . as_ptr ( ) ,
98
+ ) ;
99
+ cpy_res ( py, res)
100
+ }
101
+ }
102
+
64
103
fn bench_rustpy_code ( group : & mut BenchmarkGroup < WallTime > , bench : & MicroBenchmark ) {
65
104
let mut settings = PySettings :: default ( ) ;
66
105
settings. path_list . push ( "Lib/" . to_string ( ) ) ;
0 commit comments