|
40 | 40 | */ |
41 | 41 | package com.oracle.graal.python.builtins.modules.cext; |
42 | 42 |
|
43 | | -import static com.oracle.graal.python.nodes.BuiltinNames.T__WEAKREF; |
44 | | -import static com.oracle.graal.python.nodes.BuiltinNames.T_PROXY_TYPE; |
45 | 43 | 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; |
46 | 45 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; |
47 | 46 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; |
48 | 47 | 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; |
50 | 48 | 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; |
51 | 51 |
|
52 | 52 | import com.oracle.graal.python.builtins.PythonBuiltinClassType; |
53 | 53 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; |
54 | 54 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; |
55 | 55 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; |
56 | 56 | import com.oracle.graal.python.builtins.objects.PNone; |
57 | 57 | import com.oracle.graal.python.builtins.objects.module.PythonModule; |
| 58 | +import com.oracle.graal.python.builtins.objects.object.PythonObject; |
58 | 59 | import com.oracle.graal.python.builtins.objects.referencetype.PReferenceType; |
59 | 60 | import com.oracle.graal.python.builtins.objects.referencetype.ReferenceTypeBuiltins.ReferenceTypeNode; |
60 | 61 | import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; |
| 62 | +import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; |
61 | 63 | import com.oracle.graal.python.runtime.PythonContext; |
62 | 64 | import com.oracle.truffle.api.dsl.Bind; |
63 | 65 | import com.oracle.truffle.api.dsl.Cached; |
@@ -98,10 +100,19 @@ static Object refType(Object object, Object callback, |
98 | 100 | @CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject}, call = Direct) |
99 | 101 | abstract static class PyWeakref_GetObject extends CApiUnaryBuiltinNode { |
100 | 102 | @Specialization |
101 | | - static Object call(Object reference) { |
| 103 | + static Object call(Object reference, |
| 104 | + @Bind Node inliningTarget, |
| 105 | + @Cached ReadAttributeFromPythonObjectNode read) { |
102 | 106 | if (reference instanceof PReferenceType ref) { |
103 | 107 | return ref.getPyObject(); |
104 | 108 | } |
| 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 | + } |
105 | 116 | /* |
106 | 117 | * This weak reference has died in the managed side due to its referent being collected. |
107 | 118 | */ |
|
0 commit comments