|
63 | 63 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; |
64 | 64 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; |
65 | 65 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath; |
66 | | -import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode; |
67 | 66 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; |
68 | 67 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PyObjectSetAttrNode; |
69 | 68 | import com.oracle.graal.python.builtins.objects.PNone; |
|
78 | 77 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.GetterRoot; |
79 | 78 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; |
80 | 79 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.SetterRoot; |
| 80 | +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; |
81 | 81 | import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CArrayWrapper; |
82 | 82 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; |
83 | 83 | import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; |
|
89 | 89 | import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; |
90 | 90 | import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor; |
91 | 91 | import com.oracle.graal.python.builtins.objects.object.PythonObject; |
92 | | -import com.oracle.graal.python.builtins.objects.tuple.PTuple; |
93 | 92 | import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; |
94 | 93 | import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; |
95 | 94 | import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; |
|
106 | 105 | import com.oracle.graal.python.runtime.PythonContext; |
107 | 106 | import com.oracle.graal.python.runtime.object.PythonObjectFactory; |
108 | 107 | import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; |
109 | | -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; |
110 | 108 | import com.oracle.graal.python.util.Function; |
111 | 109 | import com.oracle.graal.python.util.PythonUtils; |
112 | 110 | import com.oracle.truffle.api.CompilerDirectives; |
@@ -217,51 +215,35 @@ static PDict doGeneric(PythonNativeClass nativeClass) { |
217 | 215 | } |
218 | 216 | } |
219 | 217 |
|
220 | | - @CApiBuiltin(ret = Int, args = {PyTypeObject, ConstCharPtrAsTruffleString, PyObject}, call = Ignored) |
221 | | - abstract static class PyTruffle_Type_Modified extends CApiTernaryBuiltinNode { |
| 218 | + @CApiBuiltin(ret = ArgDescriptor.Void, args = {PyTypeObject}, call = Ignored) |
| 219 | + abstract static class PyTruffle_InitializeOldStyleSlots extends CApiUnaryBuiltinNode { |
222 | 220 |
|
223 | 221 | @TruffleBoundary |
224 | | - @Specialization(guards = "isNoValue(mroTuple)") |
225 | | - static int doIt(PythonAbstractNativeObject clazz, TruffleString name, @SuppressWarnings("unused") PNone mroTuple, |
| 222 | + @Specialization |
| 223 | + static Object doIt(PythonAbstractNativeObject clazz, |
226 | 224 | @Bind("this") Node inliningTarget) { |
227 | | - PythonContext context = PythonContext.get(inliningTarget); |
228 | | - CyclicAssumption nativeClassStableAssumption = context.getNativeClassStableAssumption(clazz, false); |
229 | | - if (nativeClassStableAssumption != null) { |
230 | | - nativeClassStableAssumption.invalidate("PyType_Modified(\"" + name.toJavaStringUncached() + "\") (without MRO) called"); |
231 | | - } |
232 | | - SpecialMethodSlot.reinitializeSpecialMethodSlots(clazz, context.getLanguage()); |
233 | | - // TODO: this is called from two places: at the end of PyType_Ready, and theoretically |
234 | | - // could be called from: |
235 | | - // |
236 | | - // void PyType_Modified(PyTypeObject* type) -> GraalPyTruffle_Type_Modified(type, |
237 | | - // type->tp_name, type->tp_mro); |
238 | | - // |
239 | | - // in unlikely (impossible?) case that type->tp_mro was NULL. Should we distinguish |
240 | | - // the two cases? As a cleanup if it is impossible situation (separate two different |
241 | | - // upcalls), or because at the end of PyType_Ready, we do not want to call |
242 | | - // TpSlots.updateAllSlots(clazz), but from PyType_Modified we do. |
243 | | - return 0; |
| 225 | + SpecialMethodSlot.reinitializeSpecialMethodSlots(clazz, PythonLanguage.get(inliningTarget)); |
| 226 | + return PNone.NO_VALUE; |
244 | 227 | } |
| 228 | + } |
| 229 | + |
| 230 | + @CApiBuiltin(ret = ArgDescriptor.Void, args = {PyTypeObject}, call = Direct) |
| 231 | + abstract static class PyType_Modified extends CApiUnaryBuiltinNode { |
245 | 232 |
|
246 | 233 | @TruffleBoundary |
247 | 234 | @Specialization |
248 | | - static int doIt(PythonAbstractNativeObject clazz, TruffleString name, PTuple mroTuple, |
| 235 | + static Object doIt(PythonAbstractNativeObject clazz, |
249 | 236 | @Bind("this") Node inliningTarget) { |
250 | 237 | PythonContext context = PythonContext.get(inliningTarget); |
251 | 238 | CyclicAssumption nativeClassStableAssumption = context.getNativeClassStableAssumption(clazz, false); |
252 | 239 | if (nativeClassStableAssumption != null) { |
253 | | - nativeClassStableAssumption.invalidate("PyType_Modified(\"" + name.toJavaStringUncached() + "\") called"); |
| 240 | + nativeClassStableAssumption.invalidate("PyType_Modified(\"" + TypeNodes.GetNameNode.executeUncached(clazz).toJavaStringUncached() + "\") called"); |
254 | 241 | } |
255 | | - SequenceStorage sequenceStorage = mroTuple.getSequenceStorage(); |
256 | | - if (sequenceStorage instanceof MroSequenceStorage) { |
257 | | - ((MroSequenceStorage) sequenceStorage).lookupChanged(); |
258 | | - } else { |
259 | | - CompilerDirectives.transferToInterpreterAndInvalidate(); |
260 | | - throw new IllegalStateException("invalid MRO object for native type \"" + name.toJavaStringUncached() + "\""); |
261 | | - } |
262 | | - SpecialMethodSlot.reinitializeSpecialMethodSlots(PythonNativeClass.cast(clazz), context.getLanguage()); |
| 242 | + MroSequenceStorage mroStorage = TypeNodes.GetMroStorageNode.executeUncached(clazz); |
| 243 | + mroStorage.lookupChanged(); |
| 244 | + // Reload slots from native, which also invalidates cached slot lookups |
263 | 245 | clazz.setTpSlots(TpSlots.fromNative(clazz, context)); |
264 | | - return 0; |
| 246 | + return PNone.NO_VALUE; |
265 | 247 | } |
266 | 248 | } |
267 | 249 |
|
|
0 commit comments