Skip to content

Commit ca2f2e3

Browse files
committed
[GR-80761] Make expensive GraalPy assertions opt-in.
PullRequest: graalpython/4952
2 parents cee402c + 2f95798 commit ca2f2e3

39 files changed

Lines changed: 140 additions & 75 deletions

‎graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,9 @@ protected List<String> preprocessArguments(List<String> givenArgs, Map<String, S
506506
}
507507
}
508508
}
509+
if (Boolean.getBoolean("python.DetailedAsserts")) {
510+
addRelaunchArg("--vm.Dpython.DetailedAsserts=true");
511+
}
509512

510513
// According to CPython if no arguments are given, they contain an empty string.
511514
if (programArgs.isEmpty()) {

‎graalpython/com.oracle.graal.python.test/src/runner.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,9 +1599,10 @@ def main_run(args):
15991599
if IS_GRAALPY:
16001600
if not get_bool_env('GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS'):
16011601
# noinspection PyUnresolvedReferences
1602-
if not __graalpython__.java_assert():
1602+
if not __graalpython__.java_assert(detailed=True):
16031603
sys.exit(
1604-
"Java assertions are not enabled, refusing to run. Add --vm.ea to your invocation. Set GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS=true to disable this check\n")
1604+
"Detailed Java assertions are not enabled, refusing to run. Add --vm.ea --vm.Dpython.DetailedAsserts=true to your invocation. "
1605+
"Set GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS=true to disable this check.\n")
16051606
# noinspection PyUnresolvedReferences
16061607
if not hasattr(__graalpython__, 'tdebug'):
16071608
sys.exit("Needs to be run with --experimental-options --python.EnableDebuggingBuiltins\n")

‎graalpython/com.oracle.graal.python.test/src/tests/util.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ def wrapper(*args, **kwargs):
9191
[
9292
sys.executable,
9393
"--vm.ea",
94+
"--vm.Dpython.DetailedAsserts=true",
9495
"--experimental-options=true",
9596
"--python.EnableDebuggingBuiltins",
9697
runner,

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,8 +1183,8 @@ public void setCapiCallTarget(int index, RootCallTarget ct) {
11831183
}
11841184

11851185
public <T extends RootNode> T createCachedRootNode(Function<PythonLanguage, T> rootNodeFunction, Class<? extends Node> key) {
1186-
assert RootNode.class.isAssignableFrom(key) || key.getConstructors().length <= 1;
1187-
assert RootNode.class.isAssignableFrom(key) || key.getConstructors().length == 0 || key.getConstructors()[0].getParameterCount() == 0;
1186+
assert !PythonOptions.detailedAssertionsEnabled() || RootNode.class.isAssignableFrom(key) || key.getConstructors().length <= 1;
1187+
assert !PythonOptions.detailedAssertionsEnabled() || RootNode.class.isAssignableFrom(key) || key.getConstructors().length == 0 || key.getConstructors()[0].getParameterCount() == 0;
11881188
return createCachedRootNodeUnsafe(rootNodeFunction, key, true);
11891189
}
11901190

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1275,7 +1275,7 @@ private void initializeTypes() {
12751275

12761276
private void populateBuiltins() {
12771277
sysModule = builtinModules.get(T_SYS);
1278-
assert PythonBuiltinClassType.verifySlotsConventions(builtins);
1278+
assert !PythonOptions.detailedAssertionsEnabled() || PythonBuiltinClassType.verifySlotsConventions(builtins);
12791279
for (PythonBuiltins builtin : builtins) {
12801280
builtin.initialize(this);
12811281
CoreFunctions annotation = builtin.getClass().getAnnotation(CoreFunctions.class);

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@
158158
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
159159
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
160160
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
161+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode;
161162
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
162163
import com.oracle.graal.python.nodes.object.GetClassNode;
163164
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
@@ -1261,12 +1262,21 @@ TruffleString doit(VirtualFrame frame,
12611262
}
12621263
}
12631264

1264-
@Builtin(name = "java_assert", minNumOfPositionalArgs = 0)
1265+
@Builtin(name = "java_assert", minNumOfPositionalArgs = 0, parameterNames = {"detailed"})
1266+
@ArgumentClinic(name = "detailed", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "false")
12651267
@GenerateNodeFactory
1266-
abstract static class JavaAssertNode extends PythonBuiltinNode {
1268+
abstract static class JavaAssertNode extends PythonUnaryClinicBuiltinNode {
1269+
@Override
1270+
protected ArgumentClinicProvider getArgumentClinic() {
1271+
return GraalPythonModuleBuiltinsClinicProviders.JavaAssertNodeClinicProviderGen.INSTANCE;
1272+
}
1273+
12671274
@SuppressWarnings("all")
12681275
@Specialization
1269-
Object doit() {
1276+
boolean doit(boolean detailed) {
1277+
if (detailed) {
1278+
return PythonOptions.detailedAssertionsEnabled();
1279+
}
12701280
boolean assertOn = false;
12711281
assert assertOn = true;
12721282
return assertOn;

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1140,7 +1140,7 @@ private static CApiContext loadCApi(Node node, PythonContext context, TruffleStr
11401140
}
11411141
CApiTransitions.initializeThreadStateDeallocatingOffsets();
11421142

1143-
assert PythonCApiAssertions.assertBuiltins(capiLibrary);
1143+
assert !PythonOptions.detailedAssertionsEnabled() || PythonCApiAssertions.assertBuiltins(capiLibrary);
11441144
cApiContext.pyDateTimeCAPICapsule = PyDateTimeCAPIWrapper.initWrapper(context, cApiContext);
11451145

11461146
/*

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
import com.oracle.graal.python.runtime.PythonContext;
164164
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
165165
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
166+
import com.oracle.graal.python.runtime.PythonOptions;
166167
import com.oracle.graal.python.runtime.exception.PException;
167168
import com.oracle.graal.python.runtime.nativeaccess.NativeFunctionPointer;
168169
import com.oracle.graal.python.runtime.nativeaccess.NativeMemory;
@@ -2439,7 +2440,8 @@ public abstract static class ReleaseNativeArgsTupleNode extends Node {
24392440
static void doGeneric(long argsTuplePtr, Object[] managedArgs,
24402441
@Bind Node inliningTarget) {
24412442
assert !HandlePointerConverter.pointsToPyHandleSpace(argsTuplePtr);
2442-
assert IsSameTypeNode.executeUncached(GetNativeClassNodeGen.getUncached().execute(null, new PythonAbstractNativeObject(argsTuplePtr)), PythonBuiltinClassType.PTuple);
2443+
assert !PythonOptions.detailedAssertionsEnabled() || IsSameTypeNode.executeUncached(GetNativeClassNodeGen.getUncached().execute(null, new PythonAbstractNativeObject(argsTuplePtr)),
2444+
PythonBuiltinClassType.PTuple);
24432445
long refCount = CApiTransitions.readNativeRefCount(argsTuplePtr);
24442446
assert refCount >= 1;
24452447
if (refCount > 1) {
@@ -2451,7 +2453,7 @@ static void doGeneric(long argsTuplePtr, Object[] managedArgs,
24512453
return;
24522454
}
24532455
assert readLongField(argsTuplePtr, CFields.PyVarObject__ob_size) == managedArgs.length;
2454-
assert verifyElements(argsTuplePtr, managedArgs);
2456+
assert !PythonOptions.detailedAssertionsEnabled() || verifyElements(argsTuplePtr, managedArgs);
24552457
if (LOGGER.isLoggable(Level.FINE)) {
24562458
LOGGER.fine(PythonUtils.formatJString("Releasing native args tuple %x.", argsTuplePtr));
24572459
}

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
5656
import com.oracle.graal.python.builtins.objects.cext.structs.CStructs;
5757
import com.oracle.graal.python.builtins.objects.dict.PDict;
58+
import com.oracle.graal.python.runtime.PythonOptions;
5859
import com.oracle.graal.python.runtime.nativeaccess.NativeMemory;
5960
import com.oracle.graal.python.runtime.PythonContext;
6061
import com.oracle.graal.python.runtime.PythonContext.CApiState;
@@ -112,7 +113,8 @@ public static PDict getOrCreateThreadStateDict(PythonContext context, PythonThre
112113

113114
PDict threadStateDict = threadState.getDict();
114115
if (threadStateDict != null) {
115-
assert PythonToNativeInternalNode.executeUncached(threadStateDict, false) == CStructAccess.readPtrField(nativeThreadState, CFields.PyThreadState__dict);
116+
assert !PythonOptions.detailedAssertionsEnabled() || PythonToNativeInternalNode.executeUncached(threadStateDict, false) == CStructAccess.readPtrField(nativeThreadState,
117+
CFields.PyThreadState__dict);
116118
return threadStateDict;
117119
}
118120

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java‎

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,14 +1144,14 @@ public static IdReference<?> nativeLookupGet(HandleContext context, long pointer
11441144
@TruffleBoundary
11451145
public static void nativeLookupPut(HandleContext context, long pointer, NativeObjectReference value) {
11461146
assert !HandlePointerConverter.pointsToPyHandleSpace(pointer);
1147-
assert !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null;
1147+
assert !PythonOptions.detailedAssertionsEnabled() || !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null;
11481148
context.nativeLookup.put(pointer, value);
11491149
}
11501150

11511151
@TruffleBoundary
11521152
public static void nativeLookupPut(HandleContext context, long pointer, PythonObjectReference value) {
11531153
assert !HandlePointerConverter.pointsToPyHandleSpace(pointer);
1154-
assert !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null;
1154+
assert !PythonOptions.detailedAssertionsEnabled() || !context.nativeLookup.containsKey(pointer) || context.nativeLookup.get(pointer).get() == null;
11551155
context.nativeLookup.put(pointer, value);
11561156
}
11571157

@@ -1164,7 +1164,7 @@ public static IdReference<?> nativeTypeLookupGet(HandleContext context, long poi
11641164
assert idx != 0;
11651165
assert !HandlePointerConverter.pointsToPyHandleSpace(pointer);
11661166
IdReference<?> result = context.nativeTypeLookup[idx];
1167-
assert result == nativeLookupGet(context, pointer);
1167+
assert !PythonOptions.detailedAssertionsEnabled() || result == nativeLookupGet(context, pointer);
11681168
return result;
11691169
}
11701170

@@ -1355,12 +1355,14 @@ public static long pointerToStub(long pointer) {
13551355
}
13561356

13571357
public static long pointerToLong(long pointer) {
1358-
assert Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3)));
1358+
assert !PythonOptions.detailedAssertionsEnabled() || Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer &
1359+
~(HANDLE_TAG_BIT | INTEGER_TAG_BIT)) >> 3)));
13591360
return (int) (pointer >> 3);
13601361
}
13611362

13621363
public static double pointerToDouble(long pointer) {
1363-
assert Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | FLOAT_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & ~(HANDLE_TAG_BIT | FLOAT_TAG_BIT)) >> 3)));
1364+
assert !PythonOptions.detailedAssertionsEnabled() || Integer.toHexString((int) ((pointer & ~(HANDLE_TAG_BIT | FLOAT_TAG_BIT)) >> 3)).equals(Long.toHexString(((pointer & ~(HANDLE_TAG_BIT |
1365+
FLOAT_TAG_BIT)) >> 3)));
13641366
return Float.intBitsToFloat((int) (pointer >> 3));
13651367
}
13661368
}
@@ -1961,7 +1963,7 @@ static long doPythonObject(Node inliningTarget, PythonObject pythonObject, boole
19611963
pointer = pythonObject.getNativePointer();
19621964
}
19631965
assert pythonObject.isNative();
1964-
assert isGcTrackedIfNecessary(pythonObject);
1966+
assert !PythonOptions.detailedAssertionsEnabled() || isGcTrackedIfNecessary(pythonObject);
19651967
return pointer;
19661968
}
19671969

@@ -2044,7 +2046,7 @@ static long doGeneric(Node inliningTarget, Object obj, boolean needsTransfer,
20442046
}
20452047
pointer = pythonObject.getNativePointer();
20462048
}
2047-
assert isGcTrackedIfNecessary(pythonObject);
2049+
assert !PythonOptions.detailedAssertionsEnabled() || isGcTrackedIfNecessary(pythonObject);
20482050
assert pythonObject.isNative();
20492051
return pointer;
20502052
}
@@ -2669,15 +2671,15 @@ private static long addNativeRefCount(long pointer, long refCntDelta, boolean ig
26692671

26702672
LOGGER.finest(() -> PythonUtils.formatJString("addNativeRefCount %x %x %d + %d", pointer, refCount, refCount, refCntDelta));
26712673

2672-
assert !isDeallocatingSlowPath(pointer);
2674+
assert !PythonOptions.detailedAssertionsEnabled() || !isDeallocatingSlowPath(pointer);
26732675
UNSAFE.putLong(pointer + TP_REFCNT_OFFSET, refCount + refCntDelta);
26742676
return refCount + refCntDelta;
26752677
}
26762678

26772679
public static long subNativeRefCount(long pointer, long refCntDelta) {
26782680
assert PythonContext.get(null).isNativeAccessAllowed();
26792681
assert PythonContext.get(null).ownsGil();
2680-
assert !isDeallocatingSlowPath(pointer);
2682+
assert !PythonOptions.detailedAssertionsEnabled() || !isDeallocatingSlowPath(pointer);
26812683
long refCount = UNSAFE.getLong(pointer + TP_REFCNT_OFFSET);
26822684
if (refCount == IMMORTAL_REFCNT) {
26832685
return IMMORTAL_REFCNT;

0 commit comments

Comments
 (0)