Implement new assert semantics in back-end
Previously, assert was just a regular function and its argument used to be computed on each call (even if assertions are disabled on JVM). This change adds support for 3 new behaviours of assert: * always-enable (independently from -ea on JVM) * always-disable (independently from -ea JVM) * runtime/jvm (compile the calls like javac generates assert-operator) * legacy (leave current eager semantics) - this already existed Default behaviour is legacy for now. The behavior is changed based on -Xassertions flag. #KT-7540: Fixed
This commit is contained in:
+1
@@ -113,6 +113,7 @@ abstract class AbstractLightAnalysisModeTest : CodegenTestCase() {
|
||||
}
|
||||
|
||||
override fun shouldWriteField(access: Int, name: String, desc: String) = when {
|
||||
name == "\$assertionsDisabled" -> false
|
||||
name == "\$VALUES" && (access and ACC_PRIVATE != 0) && (access and ACC_FINAL != 0) && (access and ACC_SYNTHETIC != 0) -> false
|
||||
name == JvmAbi.DELEGATED_PROPERTIES_ARRAY_NAME && (access and ACC_SYNTHETIC != 0) -> false
|
||||
else -> true
|
||||
|
||||
@@ -236,6 +236,7 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
|
||||
private static final Pattern BOOLEAN_FLAG_PATTERN = Pattern.compile("([+-])(([a-zA-Z_0-9]*)\\.)?([a-zA-Z_0-9]*)");
|
||||
private static final Pattern CONSTRUCTOR_CALL_NORMALIZATION_MODE_FLAG_PATTERN = Pattern.compile(
|
||||
"CONSTRUCTOR_CALL_NORMALIZATION_MODE=([a-zA-Z_0-9]*)");
|
||||
private static final Pattern ASSERTIONS_MODE_FLAG_PATTERN = Pattern.compile("ASSERTIONS_MODE=([a-zA-Z_0-9-]*)");
|
||||
|
||||
private static void updateConfigurationWithFlags(@NotNull CompilerConfiguration configuration, @NotNull List<String> flags) {
|
||||
for (String flag : flags) {
|
||||
@@ -256,6 +257,14 @@ public abstract class CodegenTestCase extends KtUsefulTestCase {
|
||||
assert mode != null : "Wrong CONSTRUCTOR_CALL_NORMALIZATION_MODE value: " + flagValueString;
|
||||
configuration.put(JVMConfigurationKeys.CONSTRUCTOR_CALL_NORMALIZATION_MODE, mode);
|
||||
}
|
||||
|
||||
m = ASSERTIONS_MODE_FLAG_PATTERN.matcher(flag);
|
||||
if (m.matches()) {
|
||||
String flagValueString = m.group(1);
|
||||
JVMAssertionsMode mode = JVMAssertionsMode.fromStringOrNull(flagValueString);
|
||||
assert mode != null : "Wrong ASSERTIONS_MODE value: " + flagValueString;
|
||||
configuration.put(JVMConfigurationKeys.ASSERTIONS_MODE, mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user