|
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