@@ -2295,8 +2295,10 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
2295
2295
@ Cached GetLazyClassNode getMetaclassNode ,
2296
2296
@ Cached ("create(__NEW__)" ) LookupInheritedAttributeNode getNewFuncNode ,
2297
2297
@ 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 ,
2300
2302
@ Cached CallNode callInitSubclassNode ,
2301
2303
@ Cached CallNode callNewFuncNode ) {
2302
2304
@@ -2315,7 +2317,13 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
2315
2317
try {
2316
2318
PythonClass newType = typeMetaclass (frame , name , bases , namespace , metaclass );
2317
2319
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
+ }
2319
2327
2320
2328
// Call __init_subclass__ on the parent of a newly generated type
2321
2329
SuperObject superObject = factory ().createSuperObject (PythonBuiltinClassType .Super );
@@ -2336,14 +2344,14 @@ Object type(VirtualFrame frame, LazyPythonClass cls, String name, PTuple bases,
2336
2344
}
2337
2345
2338
2346
// set __class__ cell contents
2339
- Object classcell = getClasscellNode .execute (frame , namespace .getDictStorage (), __CLASSCELL__ );
2347
+ Object classcell = getItemNode .execute (frame , namespace .getDictStorage (), __CLASSCELL__ );
2340
2348
if (classcell != null ) {
2341
2349
if (classcell instanceof PCell ) {
2342
2350
((PCell ) classcell ).setRef (newType );
2343
2351
} else {
2344
2352
raise (TypeError , "__classcell__ must be a cell" );
2345
2353
}
2346
- delClasscellNode .execute (frame , namespace , namespace .getDictStorage (), __CLASSCELL__ );
2354
+ delItemNode .execute (frame , namespace , namespace .getDictStorage (), __CLASSCELL__ );
2347
2355
}
2348
2356
2349
2357
return newType ;
0 commit comments