Skip to content

Commit eed157f

Browse files
committed
Fix PyWeakRef_GetObject for ProxyType objects
1 parent 620f0cb commit eed157f

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextWeakrefBuiltins.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,26 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules.cext;
4242

43-
import static com.oracle.graal.python.nodes.BuiltinNames.T__WEAKREF;
44-
import static com.oracle.graal.python.nodes.BuiltinNames.T_PROXY_TYPE;
4543
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
44+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PYWEAKREFERENCE_PTR;
4645
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
4746
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
4847
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
49-
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PYWEAKREFERENCE_PTR;
5048
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void;
49+
import static com.oracle.graal.python.nodes.BuiltinNames.T_PROXY_TYPE;
50+
import static com.oracle.graal.python.nodes.BuiltinNames.T__WEAKREF;
5151

5252
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5353
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode;
5454
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
5555
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
5656
import com.oracle.graal.python.builtins.objects.PNone;
5757
import com.oracle.graal.python.builtins.objects.module.PythonModule;
58+
import com.oracle.graal.python.builtins.objects.object.PythonObject;
5859
import com.oracle.graal.python.builtins.objects.referencetype.PReferenceType;
5960
import com.oracle.graal.python.builtins.objects.referencetype.ReferenceTypeBuiltins.ReferenceTypeNode;
6061
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
62+
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode;
6163
import com.oracle.graal.python.runtime.PythonContext;
6264
import com.oracle.truffle.api.dsl.Bind;
6365
import com.oracle.truffle.api.dsl.Cached;
@@ -98,10 +100,19 @@ static Object refType(Object object, Object callback,
98100
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject}, call = Direct)
99101
abstract static class PyWeakref_GetObject extends CApiUnaryBuiltinNode {
100102
@Specialization
101-
static Object call(Object reference) {
103+
static Object call(Object reference,
104+
@Bind Node inliningTarget,
105+
@Cached ReadAttributeFromPythonObjectNode read) {
102106
if (reference instanceof PReferenceType ref) {
103107
return ref.getPyObject();
104108
}
109+
if (reference instanceof PythonObject obj) {
110+
// maybe a _weakref.py proxytype
111+
Object weakref = read.execute(obj, T__WEAKREF);
112+
if (weakref instanceof PReferenceType ref) {
113+
return ref.getPyObject();
114+
}
115+
}
105116
/*
106117
* This weak reference has died in the managed side due to its referent being collected.
107118
*/

0 commit comments

Comments
 (0)