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) {