Skip to content

Commit bd1fdd4

Browse files
committed
Call __set_name__ on descriptors when initializing types
1 parent c1c9631 commit bd1fdd4

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

Lib/functools.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES',
1313
'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial',
14-
'partialmethod', 'singledispatch', 'singledispatchmethod']
14+
'partialmethod', 'singledispatch', 'singledispatchmethod',
15+
"cached_property"]
1516

1617
from abc import get_cache_token
1718
from collections import namedtuple

vm/src/obj/objtype.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,14 +291,33 @@ impl PyClassRef {
291291
}
292292
}
293293

294-
match new(metatype, name.as_str(), base.clone(), bases, attributes) {
295-
Ok(typ) => {
296-
typ.slots.borrow_mut().flags = base.slots.borrow().flags;
297-
vm.ctx.add_tp_new_wrapper(&typ);
298-
Ok(typ.into())
294+
let typ = new(metatype, name.as_str(), base.clone(), bases, attributes)
295+
.map_err(|e| vm.new_type_error(e))?;
296+
297+
typ.slots.borrow_mut().flags = base.slots.borrow().flags;
298+
vm.ctx.add_tp_new_wrapper(&typ);
299+
300+
for (name, obj) in typ.attributes.borrow().iter() {
301+
if let Some(meth) = vm.get_method(obj.clone(), "__set_name__") {
302+
let set_name = meth?;
303+
vm.invoke(
304+
&set_name,
305+
vec![typ.clone().into_object(), vm.new_str(name.clone())],
306+
)
307+
.map_err(|e| {
308+
let err = vm.new_runtime_error(format!(
309+
"Error calling __set_name__ on '{}' instance {} in '{}'",
310+
obj.class().name,
311+
name,
312+
typ.name
313+
));
314+
err.set_cause(Some(e));
315+
err
316+
})?;
299317
}
300-
Err(string) => Err(vm.new_type_error(string)),
301318
}
319+
320+
Ok(typ.into_object())
302321
}
303322

304323
#[pyslot]

0 commit comments

Comments
 (0)