|
2 | 2 | mod jit; |
3 | 3 |
|
4 | 4 | use super::{ |
5 | | - PyAsyncGen, PyCode, PyCoroutine, PyDictRef, PyGenerator, PyStr, PyStrRef, PyTuple, PyTupleRef, |
6 | | - PyType, |
| 5 | + PyAsyncGen, PyCode, PyCoroutine, PyDictRef, PyGenerator, PyModule, PyStr, PyStrRef, PyTuple, |
| 6 | + PyTupleRef, PyType, |
7 | 7 | }; |
8 | 8 | #[cfg(feature = "jit")] |
9 | 9 | use crate::common::lock::OnceCell; |
@@ -67,9 +67,15 @@ impl PyFunction { |
67 | 67 | if let Some(frame) = vm.current_frame() { |
68 | 68 | frame.builtins.clone().into() |
69 | 69 | } else { |
70 | | - vm.builtins.clone().into() |
| 70 | + vm.builtins.dict().into() |
71 | 71 | } |
72 | 72 | }); |
| 73 | + // If builtins is a module, use its __dict__ instead |
| 74 | + let builtins = if let Some(module) = builtins.downcast_ref::<PyModule>() { |
| 75 | + module.dict().into() |
| 76 | + } else { |
| 77 | + builtins |
| 78 | + }; |
73 | 79 |
|
74 | 80 | let qualname = vm.ctx.new_str(code.qualname.as_str()); |
75 | 81 | let func = Self { |
@@ -679,19 +685,19 @@ pub struct PyFunctionNewArgs { |
679 | 685 | #[pyarg(any, optional)] |
680 | 686 | name: OptionalArg<PyStrRef>, |
681 | 687 | #[pyarg(any, optional)] |
682 | | - defaults: OptionalArg<PyTupleRef>, |
| 688 | + argdefs: Option<PyTupleRef>, |
683 | 689 | #[pyarg(any, optional)] |
684 | | - closure: OptionalArg<PyTupleRef>, |
| 690 | + closure: Option<PyTupleRef>, |
685 | 691 | #[pyarg(any, optional)] |
686 | | - kwdefaults: OptionalArg<PyDictRef>, |
| 692 | + kwdefaults: Option<PyDictRef>, |
687 | 693 | } |
688 | 694 |
|
689 | 695 | impl Constructor for PyFunction { |
690 | 696 | type Args = PyFunctionNewArgs; |
691 | 697 |
|
692 | 698 | fn py_new(_cls: &Py<PyType>, args: Self::Args, vm: &VirtualMachine) -> PyResult<Self> { |
693 | 699 | // Handle closure - must be a tuple of cells |
694 | | - let closure = if let Some(closure_tuple) = args.closure.into_option() { |
| 700 | + let closure = if let Some(closure_tuple) = args.closure { |
695 | 701 | // Check that closure length matches code's free variables |
696 | 702 | if closure_tuple.len() != args.code.freevars.len() { |
697 | 703 | return Err(vm.new_value_error(format!( |
@@ -722,10 +728,10 @@ impl Constructor for PyFunction { |
722 | 728 | if let Some(closure_tuple) = closure { |
723 | 729 | func.closure = Some(closure_tuple); |
724 | 730 | } |
725 | | - if let Some(defaults) = args.defaults.into_option() { |
726 | | - func.defaults_and_kwdefaults.lock().0 = Some(defaults); |
| 731 | + if let Some(argdefs) = args.argdefs { |
| 732 | + func.defaults_and_kwdefaults.lock().0 = Some(argdefs); |
727 | 733 | } |
728 | | - if let Some(kwdefaults) = args.kwdefaults.into_option() { |
| 734 | + if let Some(kwdefaults) = args.kwdefaults { |
729 | 735 | func.defaults_and_kwdefaults.lock().1 = Some(kwdefaults); |
730 | 736 | } |
731 | 737 |
|
|
0 commit comments