Skip to content

Commit 5cb47b8

Browse files
committed
add weakref descriptor when creating a new class
1 parent e947495 commit 5cb47b8

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
import com.oracle.graal.python.builtins.CoreFunctions;
103103
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
104104
import com.oracle.graal.python.builtins.PythonBuiltins;
105+
import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins.GetWeakRefsNode;
105106
import com.oracle.graal.python.builtins.objects.PEllipsis;
106107
import com.oracle.graal.python.builtins.objects.PNone;
107108
import com.oracle.graal.python.builtins.objects.PNotImplemented;
@@ -2257,7 +2258,7 @@ private PythonClass typeMetaclass(VirtualFrame frame, String name, PTuple bases,
22572258
// takes care of checking if we may_add_dict and adds it if needed
22582259
addDictIfNative(frame, pythonClass);
22592260
addDictDescrAttribute(basesArray, getDictAttrNode, pythonClass);
2260-
// TODO: tfel - also deal with weaklistoffset
2261+
addWeakrefDescrAttribute(pythonClass);
22612262
} else {
22622263
// have slots
22632264

@@ -2335,13 +2336,24 @@ private void addDictDescrAttribute(PythonAbstractClass[] basesArray, LookupAttri
23352336
CompilerDirectives.transferToInterpreterAndInvalidate();
23362337
Builtin dictBuiltin = ObjectBuiltins.DictNode.class.getAnnotation(Builtin.class);
23372338
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);
23422340
}
23432341
}
23442342

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+
23452357
private static boolean basesHaveSlots(PythonAbstractClass[] basesArray) {
23462358
// this is merely based on empirical observation
23472359
// see also test_type.py#test_dict()

0 commit comments

Comments
 (0)