Skip to content

Commit 30b2e54

Browse files
committed
Call __set_name__ on descriptors from type
1 parent b5ba56e commit 30b2e54

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,8 +2295,10 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
22952295
@Cached GetLazyClassNode getMetaclassNode,
22962296
@Cached("create(__NEW__)") LookupInheritedAttributeNode getNewFuncNode,
22972297
@Cached("create(__INIT_SUBCLASS__)") GetAttributeNode getInitSubclassNode,
2298-
@Cached HashingStorageNodes.GetItemNode getClasscellNode,
2299-
@Cached HashingStorageNodes.DelItemNode delClasscellNode,
2298+
@Cached("create(__SET_NAME__)") LookupInheritedAttributeNode getSetNameNode,
2299+
@Cached HashingStorageNodes.GetItemNode getItemNode,
2300+
@Cached HashingStorageNodes.DelItemNode delItemNode,
2301+
@Cached CallNode callSetNameNode,
23002302
@Cached CallNode callInitSubclassNode,
23012303
@Cached CallNode callNewFuncNode) {
23022304

@@ -2315,7 +2317,13 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
23152317
try {
23162318
PythonClass newType = typeMetaclass(frame, name, bases, namespace, metaclass);
23172319

2318-
// TODO: Call __set_name__ on all descriptors in a newly generated type
2320+
for (Object key : namespace.keys()) {
2321+
Object member = getItemNode.execute(frame, namespace.getDictStorage(), key);
2322+
Object setName = getSetNameNode.execute(member);
2323+
if (setName != PNone.NO_VALUE) {
2324+
callSetNameNode.execute(frame, setName, member, newType, key);
2325+
}
2326+
}
23192327

23202328
// Call __init_subclass__ on the parent of a newly generated type
23212329
SuperObject superObject = factory().createSuperObject(PythonBuiltinClassType.Super);
@@ -2336,14 +2344,14 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
23362344
}
23372345

23382346
// set __class__ cell contents
2339-
Object classcell = getClasscellNode.execute(frame, namespace.getDictStorage(), __CLASSCELL__);
2347+
Object classcell = getItemNode.execute(frame, namespace.getDictStorage(), __CLASSCELL__);
23402348
if (classcell != null) {
23412349
if (classcell instanceof PCell) {
23422350
((PCell) classcell).setRef(newType);
23432351
} else {
23442352
raise(TypeError, "__classcell__ must be a cell");
23452353
}
2346-
delClasscellNode.execute(frame, namespace, namespace.getDictStorage(), __CLASSCELL__);
2354+
delItemNode.execute(frame, namespace, namespace.getDictStorage(), __CLASSCELL__);
23472355
}
23482356

23492357
return newType;

0 commit comments

Comments
 (0)