|
102 | 102 | import com.oracle.graal.python.builtins.CoreFunctions;
|
103 | 103 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
104 | 104 | import com.oracle.graal.python.builtins.PythonBuiltins;
|
| 105 | +import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins.GetWeakRefsNode; |
105 | 106 | import com.oracle.graal.python.builtins.objects.PEllipsis;
|
106 | 107 | import com.oracle.graal.python.builtins.objects.PNone;
|
107 | 108 | import com.oracle.graal.python.builtins.objects.PNotImplemented;
|
@@ -2257,7 +2258,7 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
|
2257 | 2258 | // takes care of checking if we may_add_dict and adds it if needed
|
2258 | 2259 | addDictIfNative(frame, pythonClass);
|
2259 | 2260 | addDictDescrAttribute(basesArray, getDictAttrNode, pythonClass);
|
2260 |
| - // TODO: tfel - also deal with weaklistoffset |
| 2261 | + addWeakrefDescrAttribute(pythonClass); |
2261 | 2262 | } else {
|
2262 | 2263 | // have slots
|
2263 | 2264 |
|
@@ -2335,13 +2336,24 @@ private void addDictDescrAttribute(PythonAbstractClass[] basesArray, LookupAttri
|
2335 | 2336 | CompilerDirectives.transferToInterpreterAndInvalidate();
|
2336 | 2337 | Builtin dictBuiltin = ObjectBuiltins.DictNode.class.getAnnotation(Builtin.class);
|
2337 | 2338 | BuiltinFunctionRootNode rootNode = new BuiltinFunctionRootNode(getCore().getLanguage(), dictBuiltin, new StandaloneBuiltinFactory<PythonBinaryBuiltinNode>(DictNodeGen.create()), true);
|
2338 |
| - RootCallTarget callTarget = PythonUtils.getOrCreateCallTarget(rootNode); |
2339 |
| - PBuiltinFunction function = getCore().factory().createBuiltinFunction(__DICT__, pythonClass, 1, callTarget); |
2340 |
| - GetSetDescriptor desc = factory().createGetSetDescriptor(function, function, __DICT__, pythonClass, true); |
2341 |
| - pythonClass.setAttribute(__DICT__, desc); |
| 2339 | + setAttribute(__DICT__, rootNode, pythonClass); |
2342 | 2340 | }
|
2343 | 2341 | }
|
2344 | 2342 |
|
| 2343 | + private void addWeakrefDescrAttribute(PythonClass pythonClass) { |
| 2344 | + CompilerDirectives.transferToInterpreterAndInvalidate(); |
| 2345 | + Builtin builtin = GetWeakRefsNode.class.getAnnotation(Builtin.class); |
| 2346 | + BuiltinFunctionRootNode rootNode = new BuiltinFunctionRootNode(getCore().getLanguage(), builtin, WeakRefModuleBuiltinsFactory.GetWeakRefsNodeFactory.getInstance(), true); |
| 2347 | + setAttribute(__WEAKREF__, rootNode, pythonClass); |
| 2348 | + } |
| 2349 | + |
| 2350 | + private void setAttribute(String name, BuiltinFunctionRootNode rootNode, PythonClass pythonClass) { |
| 2351 | + RootCallTarget callTarget = PythonUtils.getOrCreateCallTarget(rootNode); |
| 2352 | + PBuiltinFunction function = getCore().factory().createBuiltinFunction(name, pythonClass, 1, callTarget); |
| 2353 | + GetSetDescriptor desc = factory().createGetSetDescriptor(function, function, name, pythonClass, true); |
| 2354 | + pythonClass.setAttribute(name, desc); |
| 2355 | + } |
| 2356 | + |
2345 | 2357 | private static boolean basesHaveSlots(PythonAbstractClass[] basesArray) {
|
2346 | 2358 | // this is merely based on empirical observation
|
2347 | 2359 | // see also test_type.py#test_dict()
|
|
0 commit comments