8000 Check downcast to type first · RustPython/RustPython@21ae739 · GitHub
[go: up one dir, main page]

Skip to content

Commit 21ae739

Browse files
morealyouknowone
authored andcommitted
Check downcast to type first
1 parent b1c3c9a commit 21ae739

File tree

1 file changed

+24
-27
lines changed

1 file changed

+24
-27
lines changed

vm/src/builtins/object.rs

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -282,37 +282,34 @@ impl PyBaseObject {
282282

283283
#[pygetset(name = "__class__", setter)]
284284
fn set_class(instance: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
285-
let both_module = instance.class().fast_issubclass(vm.ctx.types.module_type)
286-
&& value.class().fast_issubclass(vm.ctx.types.module_type);
287-
let both_mutable = !instance
288-
.class()
289-
.slots
290-
.flags
291-
.has_feature(PyTypeFlags::IMMUTABLETYPE)
292-
&& !value
293-
.downcast_ref::<PyType>()
294-
.map(|t| t.slots.flags.has_feature(PyTypeFlags::IMMUTABLETYPE))
295-
.unwrap_or(false);
296-
if both_mutable || both_module {
297-
match value.downcast::<PyType>() {
298-
Ok(cls) => {
299-
// FIXME(#1979) cls instances might have a payload
285+
match value.downcast::<PyType>() {
286+
Ok(cls) => {
287+
let both_module = instance.class().fast_issubclass(vm.ctx.types.module_type)
288+
&& cls.fast_issubclass(vm.ctx.types.module_type);
289+
let both_mutable = !instance
290+
.class()
291+
.slots
292+
.flags
293+
.has_feature(PyTypeFlags::IMMUTABLETYPE)
294+
&& !cls.slots.flags.has_feature(PyTypeFlags::IMMUTABLETYPE);
295+
// FIXME(#1979) cls instances might have a payload
296+
if both_mutable || both_module {
300297
instance.set_class(cls, vm);
301298
Ok(())
302-
}
303-
Err(value) => {
304-
let value_class = value.class();
305-
let type_repr = &value_class.name();
306-
Err(vm.new_type_error(format!(
307-
"__class__ must be set to a class, not '{type_repr}' object"
308-
)))
299+
} else {
300+
Err(vm.new_type_error(
301+
"__class__ assignment only supported for mutable types or ModuleType subclasses"
302+
.to_owned(),
303+
))
309304
}
310305
}
311-
} else {
312-
Err(vm.new_type_error(
313-
"__class__ assignment only supported for mutable types or ModuleType subclasses"
314-
.to_owned(),
315-
))
306+
Err(value) => {
307+
let value_class = value.class();
308+
let type_repr = &value_class.name();
309+
Err(vm.new_type_error(format!(
310+
"__class__ must be set to a class, not '{type_repr}' object"
311+
)))
312+
}
316313
}
317314
}
318315

0 commit comments

Comments
 (0)
0