diff --git a/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java b/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java index b082c7b78b..22cbfe7d7d 100644 --- a/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java +++ b/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java @@ -506,6 +506,9 @@ protected List preprocessArguments(List givenArgs, Map T createCachedRootNode(Function rootNodeFunction, Class key) { - assert RootNode.class.isAssignableFrom(key) || key.getConstructors().length <= 1; - assert RootNode.class.isAssignableFrom(key) || key.getConstructors().length == 0 || key.getConstructors()[0].getParameterCount() == 0; + assert !PythonOptions.detailedAssertionsEnabled() || RootNode.class.isAssignableFrom(key) || key.getConstructors().length <= 1; + assert !PythonOptions.detailedAssertionsEnabled() || RootNode.class.isAssignableFrom(key) || key.getConstructors().length == 0 || key.getConstructors()[0].getParameterCount() == 0; return createCachedRootNodeUnsafe(rootNodeFunction, key, true); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java index 6b80fd1b1b..7b89e82162 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java @@ -1275,7 +1275,7 @@ private void initializeTypes() { private void populateBuiltins() { sysModule = builtinModules.get(T_SYS); - assert PythonBuiltinClassType.verifySlotsConventions(builtins); + assert !PythonOptions.detailedAssertionsEnabled() || PythonBuiltinClassType.verifySlotsConventions(builtins); for (PythonBuiltins builtin : builtins) { builtin.initialize(this); CoreFunctions annotation = builtin.getClass().getAnnotation(CoreFunctions.class); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java index 796cecdbba..0eab54c665 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java @@ -158,6 +158,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; @@ -1261,12 +1262,21 @@ TruffleString doit(VirtualFrame frame, } } - @Builtin(name = "java_assert", minNumOfPositionalArgs = 0) + @Builtin(name = "java_assert", minNumOfPositionalArgs = 0, parameterNames = {"detailed"}) + @ArgumentClinic(name = "detailed", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "false") @GenerateNodeFactory - abstract static class JavaAssertNode extends PythonBuiltinNode { + abstract static class JavaAssertNode extends PythonUnaryClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return GraalPythonModuleBuiltinsClinicProviders.JavaAssertNodeClinicProviderGen.INSTANCE; + } + @SuppressWarnings("all") @Specialization - Object doit() { + boolean doit(boolean detailed) { + if (detailed) { + return PythonOptions.detailedAssertionsEnabled(); + } boolean assertOn = false; assert assertOn = true; return assertOn; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java index ef7f80fa81..d5b32733b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java @@ -1140,7 +1140,7 @@ private static CApiContext loadCApi(Node node, PythonContext context, TruffleStr } CApiTransitions.initializeThreadStateDeallocatingOffsets(); - assert PythonCApiAssertions.assertBuiltins(capiLibrary); + assert !PythonOptions.detailedAssertionsEnabled() || PythonCApiAssertions.assertBuiltins(capiLibrary); cApiContext.pyDateTimeCAPICapsule = PyDateTimeCAPIWrapper.initWrapper(context, cApiContext); /* diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java index fd1c1d3dad..27b0b29ec5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java @@ -163,6 +163,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.nativeaccess.NativeFunctionPointer; import com.oracle.graal.python.runtime.nativeaccess.NativeMemory; @@ -2439,7 +2440,8 @@ public abstract static class ReleaseNativeArgsTupleNode extends Node { static void doGeneric(long argsTuplePtr, Object[] managedArgs, @Bind Node inliningTarget) { assert !HandlePointerConverter.pointsToPyHandleSpace(argsTuplePtr); - assert IsSameTypeNode.executeUncached(GetNativeClassNodeGen.getUncached().execute(null, new PythonAbstractNativeObject(argsTuplePtr)), PythonBuiltinClassType.PTuple); + assert !PythonOptions.detailedAssertionsEnabled() || IsSameTypeNode.executeUncached(GetNativeClassNodeGen.getUncached().execute(null, new PythonAbstractNativeObject(argsTuplePtr)), + PythonBuiltinClassType.PTuple); long refCount = CApiTransitions.readNativeRefCount(argsTuplePtr); assert refCount >= 1; if (refCount > 1) { @@ -2451,7 +2453,7 @@ static void doGeneric(long argsTuplePtr, Object[] managedArgs, return; } assert readLongField(argsTuplePtr, CFields.PyVarObject__ob_size) == managedArgs.length; - assert verifyElements(argsTuplePtr, managedArgs); + assert !PythonOptions.detailedAssertionsEnabled() || verifyElements(argsTuplePtr, managedArgs); if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine(PythonUtils.formatJString("Releasing native args tuple %x.", argsTuplePtr)); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java index 7a5037fd3b..e7c0cc0164 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java @@ -55,6 +55,7 @@ import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.nativeaccess.NativeMemory; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.CApiState; @@ -112,7 +113,8 @@ public static PDict getOrCreateThreadStateDict(PythonContext context, PythonThre PDict threadStateDict = threadState.getDict(); if (threadStateDict != null) { - assert PythonToNativeInternalNode.executeUncached(threadStateDict, false) == CStructAccess.readPtrField(nativeThreadState, CFields.PyThreadState__dict); + assert !PythonOptions.detailedAssertionsEnabled() || PythonToNativeInternalNode.executeUncached(threadStateDict, false) == CStructAccess.readPtrField(nativeThreadState, + CFields.PyThreadState__dict); return threadStateDict; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java index 00c10dc088..29ac5f1218 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java @@ -1144,14 +1144,14 @@ public static IdReference nativeLookupGet(HandleContext context, long pointer @TruffleBoundary public static void nativeLookupPut(HandleContext context, long pointer, NativeObjectReference value) { assert !HandlePointerConverter.pointsToPyHandleSpace(pointer); - assert !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null; + assert !PythonOptions.detailedAssertionsEnabled() || !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null; context.nativeLookup.put(pointer, value); } @TruffleBoundary public static void nativeLookupPut(HandleContext context, long pointer, PythonObjectReference value) { assert !HandlePointerConverter.pointsToPyHandleSpace(pointer); - assert !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null; + assert !PythonOptions.detailedAssertionsEnabled() || !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null; context.nativeLookup.put(pointer, value); } @@ -1164,7 +1164,7 @@ public static IdReference nativeTypeLookupGet(HandleContext context, long poi assert idx != 0; assert !HandlePointerConverter.pointsToPyHandleSpace(pointer); IdReference result = context.nativeTypeLookup[idx]; - assert result == nativeLookupGet(context, pointer); + assert !PythonOptions.detailedAssertionsEnabled() || result == nativeLookupGet(context, pointer); return result; } @@ -1355,12 +1355,14 @@ public static long pointerToStub(long pointer) { } public static long pointerToLong(long pointer) { - assert Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3))); + assert !PythonOptions.detailedAssertionsEnabled() || Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & + ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3))); return (int) (pointer >> 3); } public static double pointerToDouble(long pointer) { - assert Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | FLOAT_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & ~(HANDLE_TAG_BIT | FLOAT_TAG_BIT)) >> 3))); + assert !PythonOptions.detailedAssertionsEnabled() || Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | FLOAT_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & ~(HANDLE_TAG_BIT | + FLOAT_TAG_BIT)) >> 3))); return Float.intBitsToFloat((int) (pointer >> 3)); } } @@ -1961,7 +1963,7 @@ static long doPythonObject(Node inliningTarget, PythonObject pythonObject, boole pointer = pythonObject.getNativePointer(); } assert pythonObject.isNative(); - assert isGcTrackedIfNecessary(pythonObject); + assert !PythonOptions.detailedAssertionsEnabled() || isGcTrackedIfNecessary(pythonObject); return pointer; } @@ -2044,7 +2046,7 @@ static long doGeneric(Node inliningTarget, Object obj, boolean needsTransfer, } pointer = pythonObject.getNativePointer(); } - assert isGcTrackedIfNecessary(pythonObject); + assert !PythonOptions.detailedAssertionsEnabled() || isGcTrackedIfNecessary(pythonObject); assert pythonObject.isNative(); return pointer; } @@ -2669,7 +2671,7 @@ private static long addNativeRefCount(long pointer, long refCntDelta, boolean ig LOGGER.finest(() -> PythonUtils.formatJString("addNativeRefCount %x %x %d + %d", pointer, refCount, refCount, refCntDelta)); - assert !isDeallocatingSlowPath(pointer); + assert !PythonOptions.detailedAssertionsEnabled() || !isDeallocatingSlowPath(pointer); UNSAFE.putLong(pointer + TP_REFCNT_OFFSET, refCount + refCntDelta); return refCount + refCntDelta; } @@ -2677,7 +2679,7 @@ private static long addNativeRefCount(long pointer, long refCntDelta, boolean ig public static long subNativeRefCount(long pointer, long refCntDelta) { assert PythonContext.get(null).isNativeAccessAllowed(); assert PythonContext.get(null).ownsGil(); - assert !isDeallocatingSlowPath(pointer); + assert !PythonOptions.detailedAssertionsEnabled() || !isDeallocatingSlowPath(pointer); long refCount = UNSAFE.getLong(pointer + TP_REFCNT_OFFSET); if (refCount == IMMORTAL_REFCNT) { return IMMORTAL_REFCNT; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GraalPyUnicodeObjectUtil.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GraalPyUnicodeObjectUtil.java index 450532577b..e5b174a873 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GraalPyUnicodeObjectUtil.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GraalPyUnicodeObjectUtil.java @@ -56,6 +56,7 @@ import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassProfile; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.nativeaccess.NativeMemory; public final class GraalPyUnicodeObjectUtil { @@ -163,19 +164,20 @@ public static boolean isGraalPyUnicodeObject(long rawPointer) { boolean isUnicodeSubclass = (readLongField(obType, CFields.PyTypeObject__tp_flags) & TypeFlags.UNICODE_SUBCLASS) != 0L; assert !HandlePointerConverter.pointsToPyHandleSpace(obType); // During finalization, the native reference for obType may already have been freed, so it cannot be converted back to a managed class. - assert PythonContext.get(null).isFinalizing() || IsBuiltinClassProfile.profileClassSlowPath(NativeToPythonClassInternalNode.executeUncached(obType), + assert !PythonOptions.detailedAssertionsEnabled() || PythonContext.get(null).isFinalizing() || IsBuiltinClassProfile.profileClassSlowPath(NativeToPythonClassInternalNode.executeUncached( + obType), PythonBuiltinClassType.PString) == isUnicodeSubclass; return isUnicodeSubclass; } /** Similar to {@code unicodeobject.h:_PyUnicode_NONCOMPACT_DATA} */ public static long getNonCompactDataPointer(long rawPointer) { - assert isGraalPyUnicodeObject(rawPointer) && !isCompact(rawPointer); + assert !PythonOptions.detailedAssertionsEnabled() || isGraalPyUnicodeObject(rawPointer) && !isCompact(rawPointer); return readPtrField(rawPointer, CFields.GraalPyUnicodeObject__data); } public static long getUtf8DataPointer(long rawPointer) { - assert isGraalPyUnicodeObject(rawPointer); + assert !PythonOptions.detailedAssertionsEnabled() || isGraalPyUnicodeObject(rawPointer); return readPtrField(rawPointer, CFields.GraalPyUnicodeObject__utf8); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java index 43ade28b81..e7e2b22e3c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java @@ -58,6 +58,7 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -132,7 +133,7 @@ public abstract static class LengthNode extends Node { @Specialization(guards = "self.cachedLength >= 0") static int cachedLength(DynamicObjectStorage self) { - assert self.cachedLength == actualLength(self) : "stale DynamicObjectStorage length"; + assert !PythonOptions.detailedAssertionsEnabled() || self.cachedLength == actualLength(self) : "stale DynamicObjectStorage length"; return self.cachedLength; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java index 94d11e841a..c5f3f8a373 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java @@ -60,6 +60,7 @@ import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.util.PythonUtils; @@ -150,7 +151,7 @@ public Object getContext() { } public void setContext(Object context) { - assert context == null || PyExceptionInstanceCheckNode.executeUncached(context); + assert !PythonOptions.detailedAssertionsEnabled() || context == null || PyExceptionInstanceCheckNode.executeUncached(context); this.context = context; } @@ -159,7 +160,7 @@ public Object getCause() { } public void setCause(Object cause) { - assert cause == null || PyExceptionInstanceCheckNode.executeUncached(cause); + assert !PythonOptions.detailedAssertionsEnabled() || cause == null || PyExceptionInstanceCheckNode.executeUncached(cause); this.cause = cause; this.suppressContext = true; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java index ed0bb74d89..105c4df84c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java @@ -139,6 +139,7 @@ import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext; import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.formatting.FloatFormatter; import com.oracle.graal.python.runtime.formatting.IntegerFormatter; @@ -217,7 +218,7 @@ static Object doGeneric(VirtualFrame frame, Object cls, Object x, Object baseObj if (isPrimitiveIntProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PInt)) { return result; } else { - assert IsSubtypeNode.getUncached().execute(cls, PythonBuiltinClassType.PInt); + assert !PythonOptions.detailedAssertionsEnabled() || IsSubtypeNode.getUncached().execute(cls, PythonBuiltinClassType.PInt); PInt managedInt = createIntSubclassNode.execute(inliningTarget, cls, result, getInstanceShape.execute(cls)); if (needsNativeAllocationNode.execute(inliningTarget, cls)) { // needsNativeAllocationNode acts as branch profile diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java index c52b0edc05..53aebef879 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java @@ -107,10 +107,16 @@ public void setDict(Node inliningTarget, HiddenAttr.WriteNode writeNode, PDict d writeNode.execute(inliningTarget, this, HiddenAttr.DICT, dict); } + /** + * For use in assertions only. The uncached dictionary lookup requires detailed assertions. + */ public boolean checkDictFlags() { - return checkDictFlags(GetDictIfExistsNode.getDictUncached(this)); + return !PythonOptions.detailedAssertionsEnabled() || checkDictFlags(GetDictIfExistsNode.getDictUncached(this)); } + /** + * For use in assertions only, when the dictionary is already known. + */ public boolean checkDictFlags(PDict dict) { assert dict == null || hasShapeFlag(HAS_DICT); assert (dict == null || dict.getDictStorage() instanceof DynamicObjectStorage domStorage && domStorage.getStore() == this) || hasShapeFlag(HAS_MATERIALIZED_DICT); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringNodes.java index 9c9dfc5ad9..19ac96a7da 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringNodes.java @@ -140,7 +140,7 @@ static TruffleString doMaterialized(PString x, @SuppressWarnings("unused") boole static TruffleString doNative(PString x, boolean copyNativeData, @Cached TruffleString.FromNativePointerWithCompactionUTF32Node fromNativePointerNode) { assert x.isNative(); - assert PythonToNativeInternalNode.executeUncached(x, false) == x.getNativePointer(); + assert !PythonOptions.detailedAssertionsEnabled() || PythonToNativeInternalNode.executeUncached(x, false) == x.getNativePointer(); long ptr = HandlePointerConverter.pointerToStub(x.getNativePointer()); long data = CStructAccess.readPtrField(ptr, CFields.GraalPyUnicodeObject__data); assert data != 0; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MroShape.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MroShape.java index 07d5389d85..9234a03633 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MroShape.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MroShape.java @@ -54,6 +54,7 @@ import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.nodes.Node; @@ -108,7 +109,7 @@ public static MroShape create(MroSequenceStorage mro, PythonLanguage lang) { if ((getShapeFlagsUncached.execute(managedClass) & HAS_NO_VALUE_PROPERTIES) != 0) { return null; } - assert hasNoNoValueProperties(managedClass); + assert !PythonOptions.detailedAssertionsEnabled() || hasNoNoValueProperties(managedClass); mroShape = mroShape.add(managedClass.getShape()); } else { return null; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java index 356f6d46b4..589643d934 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java @@ -216,6 +216,7 @@ import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.nativeaccess.NativeFunctionPointer; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; import com.oracle.graal.python.util.InlineWeakValueProfile; @@ -1765,14 +1766,14 @@ private static boolean checkNoMagicOverrides(Python3Core core, PythonBuiltinClas var readAttr = ReadAttributeFromObjectNode.getUncached(); PythonBuiltinClass typeObj = core.lookupType(type); for (TruffleString name : SPECIAL2SLOT.keySet()) { - assert readAttr.execute(typeObj, name) == PNone.NO_VALUE : type.name() + ":" + name; + assert !PythonOptions.detailedAssertionsEnabled() || readAttr.execute(typeObj, name) == PNone.NO_VALUE : type.name() + ":" + name; } return true; } public static void addOperatorsToBuiltin(Python3Core core, PythonBuiltinClassType type, PythonBuiltinClass pythonBuiltinClass) { TpSlots slots = type.getDeclaredSlots(); - assert checkNoMagicOverrides(core, type); + assert !PythonOptions.detailedAssertionsEnabled() || checkNoMagicOverrides(core, type); // Similar to CPython:add_operators for (var slotDefGroup : SLOTDEFS.entrySet()) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java index 05c0b9d684..76443817fb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java @@ -149,6 +149,7 @@ import com.oracle.graal.python.pegparser.sst.UnaryOpTy; import com.oracle.graal.python.pegparser.sst.WithItemTy; import com.oracle.graal.python.pegparser.tokenizer.SourceRange; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.bytecode.BytecodeConfig; @@ -765,7 +766,7 @@ public void reset() { lastTracedLine = -1; this.inExceptStar = false; temporaryLocals.clear(); - if (ASSERTIONS_ENABLED) { + if (TEMP_LOCAL_TRACKING_ENABLED) { temporaryLocalsTraces.clear(); } } @@ -798,7 +799,7 @@ void endRootNode(Builder b) { b.endRoot(); endSourceSection(b); b.endSource(); - if (ASSERTIONS_ENABLED && !temporaryLocalsTraces.isEmpty()) { + if (TEMP_LOCAL_TRACKING_ENABLED && !temporaryLocalsTraces.isEmpty()) { throw new AssertionError(this.qualName + "\n\n" + formatTempLocalsStackTraces()); } } @@ -818,24 +819,17 @@ private String formatTempLocalsStackTraces() { return sb.toString(); } - private static final boolean ASSERTIONS_ENABLED = assertionsEnabled(); + private static final boolean TEMP_LOCAL_TRACKING_ENABLED = PythonOptions.detailedAssertionsEnabled(); private static final boolean TRACK_TEMP_LOCALS = Boolean.getBoolean("org.graalvm.python.trackTempLocals"); - @SuppressWarnings("all") - private static boolean assertionsEnabled() { - boolean enabled = false; - assert (enabled = true) == true; - return enabled; - } - - private HashMap temporaryLocalsTraces = ASSERTIONS_ENABLED ? new HashMap<>() : null; + private HashMap temporaryLocalsTraces = TEMP_LOCAL_TRACKING_ENABLED ? new HashMap<>() : null; private HashSet temporaryLocals = new HashSet<>(); private BytecodeLocal beginTemporaryLocal(Builder b) { BytecodeLocal local = b.createLocal(); temporaryLocals.add(local); assert isTemporaryLocal(local); - if (ASSERTIONS_ENABLED) { + if (TEMP_LOCAL_TRACKING_ENABLED) { Object previous = temporaryLocalsTraces.put(local, TRACK_TEMP_LOCALS ? new RuntimeException() : local); if (previous != null) { throw new AssertionError(); @@ -876,7 +870,7 @@ private void markTemporaryLocalCleared(BytecodeLocal local) { if (!temporaryLocals.remove(local)) { throw new AssertionError(); } - if (ASSERTIONS_ENABLED) { + if (TEMP_LOCAL_TRACKING_ENABLED) { if (temporaryLocalsTraces.remove(local) == null) { throw new AssertionError(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java index 38f3bbc9f8..e42d446a8f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java @@ -55,6 +55,7 @@ import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -104,7 +105,7 @@ static boolean doPInt(@SuppressWarnings("unused") PInt object) { public static boolean doNative(PythonAbstractNativeObject nativeObject) { long obType = readPtrField(nativeObject.pointer, PyObject__ob_type); boolean isLongSubclass = (readLongField(obType, CFields.PyTypeObject__tp_flags) & TypeFlags.LONG_SUBCLASS) != 0L; - assert IsBuiltinObjectProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PInt) == isLongSubclass; + assert !PythonOptions.detailedAssertionsEnabled() || IsBuiltinObjectProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PInt) == isLongSubclass; return isLongSubclass; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java index 40b09f44b2..1d4f3ac41d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java @@ -65,6 +65,7 @@ import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.dsl.Bind; @@ -165,7 +166,7 @@ static Object doBuiltinObject(VirtualFrame frame, Node inliningTarget, Object ob @Shared @Cached ReadAttributeFromObjectNode readNode) { // It should not have __getattr__, because otherwise it would not have builtin // object#tp_getattro, but slot wrapper dispatching to __getattribute__ or __getattr__ - assert hasNoGetAttr(type); + assert !PythonOptions.detailedAssertionsEnabled() || hasNoGetAttr(type); return readNode.execute(object, cachedName); } @@ -184,7 +185,7 @@ static Object doBuiltinModule(VirtualFrame frame, Node inliningTarget, Object ob /* GR-44836 @Shared */ @Exclusive @Cached IsBuiltinObjectProfile errorProfile, @Exclusive @Cached InlinedConditionProfile noValueFound, @Cached(inline = false) CallNode callGetattr) { - assert hasNoGetAttr(type); + assert !PythonOptions.detailedAssertionsEnabled() || hasNoGetAttr(type); Object value = readNode.execute(object, cachedName); if (noValueFound.profile(inliningTarget, value == PNone.NO_VALUE)) { Object getAttr = readGetattr.execute(object, SpecialMethodNames.T___GETATTR__); @@ -255,7 +256,7 @@ static Object doBuiltinType(VirtualFrame frame, Node inliningTarget, Object obje @Exclusive @Cached InlinedConditionProfile noGetMethod, @Exclusive @Cached CallSlotDescrGet callGetSlot, /* GR-44836 @Shared */ @Exclusive @Cached IsBuiltinObjectProfile errorProfile) { - assert hasNoGetAttr(type); + assert !PythonOptions.detailedAssertionsEnabled() || hasNoGetAttr(type); Object value = readNode.execute(object); if (valueFound.profile(inliningTarget, value != PNone.NO_VALUE)) { var valueSlots = getSlotsNode.execute(inliningTarget, value); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckExactNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckExactNode.java index 8b7e80633f..48a4e97ec3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckExactNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckExactNode.java @@ -50,6 +50,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectExactProfile; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -93,7 +94,7 @@ public static boolean doGeneric(Node inliningTarget, Object object, public static boolean checkNative(PythonContext context, PythonAbstractNativeObject nativeObject) { long obType = readPtrField(nativeObject.pointer, PyObject__ob_type); boolean isTupleExact = obType == context.lookupType(PythonBuiltinClassType.PTuple).getNativePointer(); - assert IsBuiltinObjectExactProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PTuple) == isTupleExact; + assert !PythonOptions.detailedAssertionsEnabled() || IsBuiltinObjectExactProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PTuple) == isTupleExact; return isTupleExact; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckNode.java index a819d12ea7..fd3b0af0d9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleCheckNode.java @@ -51,6 +51,7 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -85,7 +86,7 @@ static boolean doPTuple(@SuppressWarnings("unused") PTuple object) { public static boolean doNative(PythonAbstractNativeObject nativeObject) { long obType = readPtrField(nativeObject.pointer, PyObject__ob_type); boolean isTupleSubclass = (readLongField(obType, CFields.PyTypeObject__tp_flags) & TypeFlags.TUPLE_SUBCLASS) != 0L; - assert IsBuiltinObjectProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PTuple) == isTupleSubclass; + assert !PythonOptions.detailedAssertionsEnabled() || IsBuiltinObjectProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PTuple) == isTupleSubclass; return isTupleSubclass; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java index b1d40b9487..79839ce9b2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java @@ -53,6 +53,7 @@ import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; @@ -90,7 +91,7 @@ static boolean doPString(@SuppressWarnings("unused") PString object) { public static boolean doNative(PythonAbstractNativeObject nativeObject) { long obType = readPtrField(nativeObject.pointer, PyObject__ob_type); boolean isUnicodeSubclass = (readLongField(obType, CFields.PyTypeObject__tp_flags) & TypeFlags.UNICODE_SUBCLASS) != 0L; - assert IsBuiltinObjectProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PString) == isUnicodeSubclass; + assert !PythonOptions.detailedAssertionsEnabled() || IsBuiltinObjectProfile.profileObjectUncached(nativeObject, PythonBuiltinClassType.PString) == isUnicodeSubclass; return isUnicodeSubclass; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java index 3e670fc2e2..dfe6a2c7c4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java @@ -844,7 +844,7 @@ PKeyword cachedSingle(PKeyword[] kwdefaults, TruffleString kwname, @Cached("kwname") TruffleString cachedKwName, @Cached(value = "kwdefaults", weak = true, dimensions = 0) PKeyword[] cachedKwdefaults, @Cached(value = "doUncached(kwdefaults, kwname, getUncachedEqualNode())", weak = true) PKeyword result) { - assert kwIsCorrect(cachedKwdefaults, cachedKwName, result); + assert !PythonOptions.detailedAssertionsEnabled() || kwIsCorrect(cachedKwdefaults, cachedKwName, result); return result; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java index bda1effcfc..96ef329e9f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java @@ -512,7 +512,7 @@ Object lookupGeneric(Object klass, TruffleString key, boolean skipNonStaticBases } public MroShapeLookupResult lookupInMroShape(MroShape shape, Object klass, TruffleString key) { - assert MroShape.validate(klass, PythonLanguage.get(this)); + assert !PythonOptions.detailedAssertionsEnabled() || MroShape.validate(klass, PythonLanguage.get(this)); return shape.lookup(key); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/MergedObjectTypeModuleGetFixedAttributeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/MergedObjectTypeModuleGetFixedAttributeNode.java index 33ec150b59..db452db541 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/MergedObjectTypeModuleGetFixedAttributeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/MergedObjectTypeModuleGetFixedAttributeNode.java @@ -57,6 +57,7 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -113,7 +114,7 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, Object object, Truff @Cached InlinedBranchProfile hasNonDescriptorValueProfile, @Cached CallSlotDescrGet.Lazy callSlotValueGet, @Cached ModuleBuiltins.LazyHandleGetattrExceptionNode handleException) { - assert hasNoGetAttr(type); + assert !PythonOptions.detailedAssertionsEnabled() || hasNoGetAttr(type); try { Object descr = lookup.execute(type); boolean hasDescr = hasDescProfile.profile(inliningTarget, descr != PNone.NO_VALUE); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToPythonObjectNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToPythonObjectNode.java index 3897977ea9..ba036bf121 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToPythonObjectNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToPythonObjectNode.java @@ -85,7 +85,7 @@ public static WriteAttributeToPythonObjectNode getUncached() { @Specialization static void write(PythonObject dynamicObject, TruffleString key, Object value, @Cached DynamicObject.PutNode putNode) { - assert GetDictIfExistsNode.getDictUncached(dynamicObject) == null : "direct attribute write with a backing dictionary"; + assert !PythonOptions.detailedAssertionsEnabled() || GetDictIfExistsNode.getDictUncached(dynamicObject) == null : "direct attribute write with a backing dictionary"; putNode.execute(dynamicObject, key, value); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java index cce466d595..73f1634036 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java @@ -66,6 +66,7 @@ import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ArrayBasedSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; @@ -370,7 +371,7 @@ public abstract static class GetNativeListStorage extends Node { @Specialization static NativeSequenceStorage getNative(PythonAbstractNativeObject list) { - assert IsSubtypeNode.getUncached().execute(GetClassNode.executeUncached(list), PythonBuiltinClassType.PList); + assert !PythonOptions.detailedAssertionsEnabled() || IsSubtypeNode.getUncached().execute(GetClassNode.executeUncached(list), PythonBuiltinClassType.PList); long listRawPtr = list.getPtr(); long array = readPtrField(listRawPtr, PyListObject__ob_item); int size = (int) readLongField(listRawPtr, PyVarObject__ob_size); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java index fc8c32e0ea..6796ad97e5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java @@ -49,6 +49,7 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.function.Signature; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -93,21 +94,21 @@ public final class BytecodeDSLCodeUnit { public BytecodeDSLCodeUnit(TruffleString name, TruffleString qualname, int argCount, int kwOnlyArgCount, int positionalOnlyArgCount, int flags, TruffleString[] names, TruffleString[] varnames, TruffleString[] cellvars, TruffleString[] freevars, Object[] constants, int startLine, int startColumn, int endLine, int endColumn, int classcellIndex, int selfIndex, int yieldFromGeneratorIndex, int instrumentationDataIndex, int maxProfileCEventStackSize, BytecodeSupplier supplier) { - assert isInterned(name); + assert !PythonOptions.detailedAssertionsEnabled() || isInterned(name); this.name = name; - assert qualname == null || isInterned(qualname); + assert !PythonOptions.detailedAssertionsEnabled() || qualname == null || isInterned(qualname); this.qualname = qualname != null ? qualname : name; this.argCount = argCount; this.kwOnlyArgCount = kwOnlyArgCount; this.positionalOnlyArgCount = positionalOnlyArgCount; this.flags = flags; - assert isInterned(names); + assert !PythonOptions.detailedAssertionsEnabled() || isInterned(names); this.names = names; - assert isInterned(varnames); + assert !PythonOptions.detailedAssertionsEnabled() || isInterned(varnames); this.varnames = varnames; - assert isInterned(cellvars); + assert !PythonOptions.detailedAssertionsEnabled() || isInterned(cellvars); this.cellvars = cellvars; - assert isInterned(freevars); + assert !PythonOptions.detailedAssertionsEnabled() || isInterned(freevars); this.freevars = freevars; this.constants = constants; this.startLine = startLine; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java index d6a078447e..c33802ae13 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java @@ -2339,7 +2339,7 @@ static Object loadCacheableTypeAttr(PythonManagedClass object, TruffleString key // Some types with known tp_descr_get implementation that just return itself when // `instance` parameter to tp_descr_get is NO_VALUE if (value instanceof PBuiltinFunction || value instanceof PFunction) { - assert CallSlotDescrGet.executeUncached(GetObjectSlotsNode.executeUncached(value).tp_descr_get(), value, PNone.NO_VALUE, object) == value; + assert !PythonOptions.detailedAssertionsEnabled() || CallSlotDescrGet.executeUncached(GetObjectSlotsNode.executeUncached(value).tp_descr_get(), value, PNone.NO_VALUE, object) == value; return value; } Object valueKlass = GetClassNode.executeUncached(value); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java index b8942ff541..395c5f7105 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java @@ -67,6 +67,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.nativeaccess.NativeFunctionPointer; import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; @@ -100,13 +101,13 @@ public static GetDictIfExistsNode create() { @Specialization(guards = {"object.getShape() == cachedShape", "hasNoDict(cachedShape)"}, limit = "1") static PDict getNoDictCachedShape(@SuppressWarnings("unused") PythonObject object, @SuppressWarnings("unused") @Cached("object.getShape()") Shape cachedShape) { - assert getDictUncached(object) == null; + assert !PythonOptions.detailedAssertionsEnabled() || getDictUncached(object) == null; return null; } @Specialization(guards = "hasNoDict(object.getShape())", replaces = "getNoDictCachedShape") static PDict getNoDict(@SuppressWarnings("unused") PythonObject object) { - assert getDictUncached(object) == null; + assert !PythonOptions.detailedAssertionsEnabled() || getDictUncached(object) == null; return null; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/TruffleStringMigrationHelpers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/TruffleStringMigrationHelpers.java index 8578eaf554..aae564857a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/TruffleStringMigrationHelpers.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/TruffleStringMigrationHelpers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.strings.TruffleString; /** @@ -75,7 +76,7 @@ public static boolean isJavaString(Object o) { } public static void assertContainsNoJavaString(Object[] elements) { - assert !containsJavaString(elements); + assert !PythonOptions.detailedAssertionsEnabled() || !containsJavaString(elements); } private static boolean containsJavaString(Object[] elements) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java index 6fc9dab045..30da1bfcd4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java @@ -184,7 +184,8 @@ protected static void prepareCall(VirtualFrame frame, Object[] callArguments, in @Bind Node inliningTarget, @Cached PassCallerFrameNode passCallerFrame, @Cached PassExceptionStateNode passExceptionState) { - assert inliningTarget.getRootNode() instanceof TopLevelExceptionHandler || PArguments.assertIsPythonFrame(frame) : "calling from non-Python or non-top-level frame"; + assert !PythonOptions.detailedAssertionsEnabled() || inliningTarget.getRootNode() instanceof TopLevelExceptionHandler || PArguments.assertIsPythonFrame( + frame) : "calling from non-Python or non-top-level frame"; passCallerFrame.execute(frame, inliningTarget, callArguments, callerFlags); passExceptionState.execute(frame, inliningTarget, callArguments, CallerFlags.needsExceptionState(callerFlags)); } @@ -587,7 +588,7 @@ public static void exit(VirtualFrame frame, PythonThreadState pythonThreadState, } private static void validateBoundaryCallData(BoundaryCallData boundaryCallData) { - assert boundaryCallData.isUncached() || + assert !PythonOptions.detailedAssertionsEnabled() || boundaryCallData.isUncached() || (!(boundaryCallData.getRootNode() instanceof PBytecodeDSLRootNode) || BytecodeNode.get(boundaryCallData) != null); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java index c7937488b1..a1da746666 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java @@ -1014,7 +1014,7 @@ public long getNextStringId(TruffleString string) { } public T getOption(OptionKey key) { - assert !PythonOptions.isEngineOption(key) : "Querying engine option via context."; + assert !PythonOptions.detailedAssertionsEnabled() || !PythonOptions.isEngineOption(key) : "Querying engine option via context."; if (CompilerDirectives.inInterpreter()) { return getEnv().getOptions().get(key); } else { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java index dc51eceb29..59e218785d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java @@ -74,6 +74,23 @@ */ @Option.Group(PythonLanguage.ID) public final class PythonOptions { + private static final boolean DETAILED_ASSERTIONS = Boolean.getBoolean("python.DetailedAsserts"); + + /** + * Enables expensive internal checks only when assertions are enabled for PythonOptions and + * {@code -Dpython.DetailedAsserts=true} was set at class initialization. + */ + public static boolean detailedAssertionsEnabled() { + return assertionsEnabled() && DETAILED_ASSERTIONS; + } + + @SuppressWarnings("all") + private static boolean assertionsEnabled() { + boolean enabled = false; + assert (enabled = true) == true; + return enabled; + } + private static final String J_STRING_LIST_SEPARATOR = "🏆"; private static final TruffleString T_STRING_LIST_SEPARATOR = tsLiteral(J_STRING_LIST_SEPARATOR); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java index d4a17879eb..22babb1dce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java @@ -57,6 +57,7 @@ import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -122,7 +123,8 @@ public final class PException extends AbstractTruffleException { private static Node validateLocation(Node location) { // For Bytecode DSL root nodes the location must lead to a BytecodeNode - assert location == null || !(location.getRootNode() instanceof PBytecodeDSLRootNode) || BytecodeNode.get(location) != null : String.format("%s, root: %s", location, location.getRootNode()); + assert !PythonOptions.detailedAssertionsEnabled() || location == null || !(location.getRootNode() instanceof PBytecodeDSLRootNode) || BytecodeNode.get(location) != null : String.format( + "%s, root: %s", location, location.getRootNode()); return location; } diff --git a/mx.graalpython/mx_graalpython.py b/mx.graalpython/mx_graalpython.py index 70019fd3be..c5f8492bc3 100644 --- a/mx.graalpython/mx_graalpython.py +++ b/mx.graalpython/mx_graalpython.py @@ -1268,6 +1268,7 @@ def graalpy_standalone_home(standalone_type, enterprise=False, dev=False, build= elif BUILD_NATIVE_IMAGE_WITH_ASSERTIONS: mx_args.append("--extra-image-builder-argument=-ea") mx_args.append("--extra-image-builder-argument=-J-ea") + mx_args.append("--extra-image-builder-argument=-Dpython.DetailedAsserts=true") if mx_gate.get_jacoco_agent_args() or (build and not DISABLE_REBUILD): # This build is purposefully done without the LATEST_JAVA_HOME in the @@ -1695,7 +1696,7 @@ def graalpytest(args): is_graalpy = True gp_args = ["--experimental-options=true", "--python.EnableDebuggingBuiltins"] if env.get("GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS") != "true": - gp_args += ["--vm.ea", "--vm.esa"] + gp_args += ["--vm.ea", "--vm.esa", "--vm.Dpython.DetailedAsserts=true"] mx.log(f"Executable seems to be GraalPy, prepending arguments: {gp_args}") python_args = [*gp_args, *python_args] runner_args.append(f'--subprocess-args={shlex.join(arg for arg in python_args if arg != "-repeated-run")}') @@ -1738,6 +1739,7 @@ def run_python_unittests(python_binary, args=None, paths=None, exclude=None, env if extra_args: mx.log("Adding GraalPy unittest args from GRAALPY_UNITTEST_ARGS: " + shlex.join(extra_args)) args = [ + "--vm.Dpython.DetailedAsserts=true", "--vm.ea", "--experimental-options=true", "--python.EnableDebuggingBuiltins", @@ -1949,6 +1951,7 @@ def graalpython_gate_runner(_, tasks): mvn_cmd_base = ['--settings', maven_settings, '-f', pom_path, f'-Dcom.oracle.graal.python.test.polyglot.version={artifacts_version}', + '-Dpython.DetailedAsserts=true', '--batch-mode'] default_runtime_arg = [] @@ -1984,6 +1987,7 @@ def graalpython_gate_runner(_, tasks): mvn_cmd_base = ['--settings', maven_settings, '-f', pom_path, f'-Dcom.oracle.graal.python.test.polyglot.version={artifacts_version}', + '-Dpython.DetailedAsserts=true', '--batch-mode'] mx.log("Running integration JUnit tests on GraalVM SDK with external polyglot isolates") @@ -3758,6 +3762,7 @@ def run_leak_launcher(input_args): vm_args += ['--add-exports', 'org.graalvm.py/com.oracle.graal.python.builtins=ALL-UNNAMED'] vm_args += ['--add-exports', 'org.graalvm.py/com.oracle.graal.python.builtins.objects.cext.capi.transitions=ALL-UNNAMED'] vm_args.append('-Dpolyglot.engine.WarnInterpreterOnly=false') + vm_args += ['-ea', '-esa', '-Dpython.DetailedAsserts=true'] jdk = get_jdk() vm_args.append("com.oracle.graal.python.test.advanced.LeakTest") out = mx.OutputCapture() @@ -3894,6 +3899,7 @@ class PythonMxUnittestConfig(mx_unittest.MxUnittestConfig): def apply(self, config): (vmArgs, mainClass, mainClassArgs) = config + vmArgs.append('-Dpython.DetailedAsserts=true') mainClassArgs.extend(['-JUnitOpenPackages', 'org.graalvm.truffle/com.oracle.truffle.api.impl=ALL-UNNAMED']) # for TruffleRunner/TCK mainClassArgs.extend(['-JUnitOpenPackages', 'org.graalvm.truffle/com.oracle.truffle.polyglot=ALL-UNNAMED']) # for TruffleRunner/TCK mainClassArgs.extend(['-JUnitOpenPackages', 'org.graalvm.py/*=ALL-UNNAMED']) # for Python internals diff --git a/mx.graalpython/mx_graalpython_graalos.py b/mx.graalpython/mx_graalpython_graalos.py index 9346f6e2cb..a99822cdb3 100644 --- a/mx.graalpython/mx_graalpython_graalos.py +++ b/mx.graalpython/mx_graalpython_graalos.py @@ -356,7 +356,8 @@ def graalpy_resource_variant_tests(args): for expected, prop, error in cases: with tempfile.TemporaryDirectory(prefix='graalpy-resource-variant-') as directory: output = mx.OutputCapture() - options = ['-Dpolyglot.engine.WarnInterpreterOnly=false', '-Dpolyglot.engine.userResourceCache=' + directory] + options = ['-ea', '-esa', '-Dpython.DetailedAsserts=true', + '-Dpolyglot.engine.WarnInterpreterOnly=false', '-Dpolyglot.engine.userResourceCache=' + directory] if prop is not None: options.append('-Dorg.graalvm.python.resources.variant=' + prop) result = mx.run_java(vm_args + options + [main, expected, str(Path(directory) / 'copied')],