Skip to content

Commit e6f0618

Browse files
committed
Unify/simplify code-paths around __new__/__init__.
1 parent 039b5bb commit e6f0618

File tree

2 files changed

+8
-17
lines changed

2 files changed

+8
-17
lines changed

vm/src/builtins.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -646,15 +646,5 @@ pub fn builtin_build_class_(vm: &mut VirtualMachine, mut args: PyFuncArgs) -> Py
646646

647647
let bases = vm.context().new_tuple(bases);
648648

649-
// Special case: __new__ must be looked up on the metaclass, not the meta-metaclass as
650-
// per vm.call(metaclass, "__new__", ...)
651-
let new = metaclass.get_attr("__new__").unwrap();
652-
let wrapped = vm.call_get_descriptor(new, metaclass)?;
653-
vm.invoke(
654-
wrapped,
655-
PyFuncArgs {
656-
args: vec![name_arg, bases, namespace],
657-
kwargs: vec![],
658-
},
659-
)
649+
vm.call_method(&metaclass, "__call__", vec![name_arg, bases, namespace])
660650
}

vm/src/obj/objtype.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,17 @@ pub fn type_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
114114

115115
pub fn type_call(vm: &mut VirtualMachine, mut args: PyFuncArgs) -> PyResult {
116116
debug!("type_call: {:?}", args);
117-
let typ = args.shift();
118-
let new = typ.get_attr("__new__").unwrap();
119-
let obj = vm.invoke(new, args.insert(typ.clone()))?;
117+
let cls = args.shift();
118+
let new = cls.get_attr("__new__").unwrap();
119+
let new_wrapped = vm.call_get_descriptor(new, cls)?;
120+
let obj = vm.invoke(new_wrapped, args.clone())?;
120121

121-
if let Some(init) = obj.typ().get_attr("__init__") {
122-
let res = vm.invoke(init, args.insert(obj.clone()))?;
122+
if let Ok(init) = vm.get_method(obj.clone(), "__init__") {
123+
let res = vm.invoke(init, args)?;
123124
// TODO: assert that return is none?
124125
if !isinstance(&res, &vm.get_none()) {
125126
// panic!("__init__ must return none");
126-
// return Err(vm.new_type_error("__init__ must return None".to_string()));
127+
// return Err(vm.new_type_error("__init__ must return None".to_string()));
127128
}
128129
}
129130
Ok(obj)

0 commit comments

Comments
 (0)