You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/12/19 16:49:44 UTC
[groovy] 02/02: GROOVY-10878: classgen: write `assert` using `throw` directly
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit a260076dd05a549e8e933678eab7ad8a888ee78d
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Dec 19 10:30:42 2022 -0600
GROOVY-10878: classgen: write `assert` using `throw` directly
---
.../org/codehaus/groovy/classgen/asm/AssertionWriter.java | 12 ++++++------
.../java/org/codehaus/groovy/runtime/InvokerHelper.java | 13 ++++++++++---
2 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/AssertionWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/AssertionWriter.java
index e76b794134..c5cb1b71b1 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/AssertionWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/AssertionWriter.java
@@ -25,7 +25,6 @@ import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.VariableExpression;
import org.codehaus.groovy.ast.stmt.AssertStatement;
import org.codehaus.groovy.control.Janitor;
-import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.powerassert.SourceText;
import org.codehaus.groovy.runtime.powerassert.SourceTextNotAvailableException;
import org.codehaus.groovy.syntax.Token;
@@ -48,8 +47,6 @@ import static org.objectweb.asm.Opcodes.NEW;
import static org.objectweb.asm.Opcodes.POP;
public class AssertionWriter {
- // assert
- private static final MethodCaller assertFailedMethod = MethodCaller.newStatic(ScriptBytecodeAdapter.class, "assertFailed");
private static class AssertionTracker {
int recorderIndex;
@@ -223,9 +220,12 @@ public class AssertionWriter {
}
}
- private void throwAssertError() { // TODO: GROOVY-10878
- assertFailedMethod.call(controller.getMethodVisitor());
- controller.getOperandStack().remove(2); // assertFailed called with 2 arguments
+ private void throwAssertError() {
+ // GROOVY-10878: call method that returns throwable, then throw it from here for better coverage metrics
+ controller.getMethodVisitor().visitMethodInsn(INVOKESTATIC, "org/codehaus/groovy/runtime/InvokerHelper",
+ "createAssertError", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/AssertionError;", false);
+ controller.getMethodVisitor().visitInsn(ATHROW); // throw AssertionError
+ controller.getOperandStack().remove(2); // two call arguments
}
//--------------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
index f664720379..7e4f547e53 100644
--- a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
+++ b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
@@ -402,11 +402,18 @@ public class InvokerHelper {
return answer;
}
- public static void assertFailed(Object expression, Object message) {
+ public static void assertFailed(final Object expression, final Object message) {
+ throw createAssertError(expression, message);
+ }
+
+ /**
+ * @since 4.0.7
+ */
+ public static AssertionError createAssertError(final Object expression, final Object message) {
if (message == null || "".equals(message)) {
- throw new PowerAssertionError(expression.toString());
+ return new PowerAssertionError(expression.toString());
}
- throw new AssertionError(message + ". Expression: " + expression);
+ return new AssertionError(message + ". Expression: " + expression);
}
public static Object runScript(Class scriptClass, String[] args) {