==== Patch <arithmetic> level 1
Source: [No source]
Target: 737f8f2c-97f8-0310-ac9b-cfac8cc1a2f5:/eng/third-party/janino/trunk:72158
        (svn+ssh://svn.streambase.com/repos/sb)
Log:
 r74167@spiceweasel (orig r72365):  fowles | 2008-05-19 21:00:58 -0400
 Fix a div by zero in constant evaluation
 

=== tests/src/EvaluatorTests.java
==================================================================
--- tests/src/EvaluatorTests.java	(revision 72158)
+++ tests/src/EvaluatorTests.java	(patch arithmetic level 1)
@@ -32,14 +32,27 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
 
-import junit.framework.*;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
 
-import org.codehaus.janino.*;
+import org.codehaus.janino.ClassBodyEvaluator;
+import org.codehaus.janino.CompileException;
+import org.codehaus.janino.ExpressionEvaluator;
 import org.codehaus.janino.Scanner;
+import org.codehaus.janino.ScriptEvaluator;
+import org.codehaus.janino.SimpleCompiler;
 
 public class EvaluatorTests extends TestCase {
     public static Test suite() {
@@ -54,6 +67,7 @@
         s.addTest(new EvaluatorTests("testAssertNotCooked"));
         s.addTest(new EvaluatorTests("testAccessingCompilingClass"));
         s.addTest(new EvaluatorTests("testProtectedAccessToParentSuperClassVar"));
+        s.addTest(new EvaluatorTests("testDivByZero"));
         return s;
     }
 
@@ -264,4 +278,41 @@
                 "}"
         );
     }
+    
+    public void testDivByZero() throws Exception {
+        SimpleCompiler sc = new SimpleCompiler();
+        sc.cook(
+            "package test;\n" +
+            "public class Test {\n" +
+            "    public int runIntDiv() {\n" +
+            "        return 1 / 0;\n" +
+            "    }\n" +
+            "    public int runIntMod() {\n" +
+            "        return 1 % 0;\n" +
+            "    }\n" +
+            "    public long runLongDiv() {\n" +
+            "        return 1L / 0;\n" +
+            "    }\n" +
+            "    public long runLongMod() {\n" +
+            "        return 1L % 0;\n" +
+            "    }\n" +
+            "}"
+        );
+        
+        
+        Class c = sc.getClassLoader().loadClass("test.Test");
+        Object o = c.newInstance();
+        
+        Method[] m = c.getMethods();
+        for(int i = 0; i < m.length; ++i) {
+            if(m[i].getName().startsWith("run")) {
+                try {
+                    Object res = m[i].invoke(o, null);
+                    fail("Method " + m[i] + " should have failed, but got " + res);
+                } catch(InvocationTargetException ae) {
+                    assertTrue(ae.getTargetException() instanceof ArithmeticException);
+                }
+            }
+        }
+    }
 }
=== src/org/codehaus/janino/UnitCompiler.java
==================================================================
--- src/org/codehaus/janino/UnitCompiler.java	(revision 72158)
+++ src/org/codehaus/janino/UnitCompiler.java	(patch arithmetic level 1)
@@ -3367,56 +3367,62 @@
 
                 if (!(lhs instanceof Number) || !(rhs instanceof Number)) return null;
 
-                // Numeric binary operation.
-                if (lhs instanceof Double || rhs instanceof Double) {
-                    double lhsD = ((Number) lhs).doubleValue();
-                    double rhsD = ((Number) rhs).doubleValue();
-                    double cvD;
-                    if (bo.op == "*") cvD = lhsD * rhsD; else
-                    if (bo.op == "/") cvD = lhsD / rhsD; else
-                    if (bo.op == "%") cvD = lhsD % rhsD; else
-                    if (bo.op == "+") cvD = lhsD + rhsD; else
-                    if (bo.op == "-") cvD = lhsD - rhsD; else return null;
-                    lhs = new Double(cvD);
-                } else
-                if (lhs instanceof Float || rhs instanceof Float) {
-                    float lhsF = ((Number) lhs).floatValue();
-                    float rhsF = ((Number) rhs).floatValue();
-                    float cvF;
-                    if (bo.op == "*") cvF = lhsF * rhsF; else
-                    if (bo.op == "/") cvF = lhsF / rhsF; else
-                    if (bo.op == "%") cvF = lhsF % rhsF; else
-                    if (bo.op == "+") cvF = lhsF + rhsF; else
-                    if (bo.op == "-") cvF = lhsF - rhsF; else return null;
-                    lhs = new Float(cvF);
-                } else
-                if (lhs instanceof Long || rhs instanceof Long) {
-                    long lhsL = ((Number) lhs).longValue();
-                    long rhsL = ((Number) rhs).longValue();
-                    long cvL;
-                    if (bo.op == "|") cvL = lhsL | rhsL; else
-                    if (bo.op == "^") cvL = lhsL ^ rhsL; else
-                    if (bo.op == "&") cvL = lhsL & rhsL; else
-                    if (bo.op == "*") cvL = lhsL * rhsL; else
-                    if (bo.op == "/") cvL = lhsL / rhsL; else
-                    if (bo.op == "%") cvL = lhsL % rhsL; else
-                    if (bo.op == "+") cvL = lhsL + rhsL; else
-                    if (bo.op == "-") cvL = lhsL - rhsL; else return null;
-                    lhs = new Long(cvL);
-                } else
-                {
-                    int lhsI = ((Number) lhs).intValue();
-                    int rhsI = ((Number) rhs).intValue();
-                    int cvI;
-                    if (bo.op == "|") cvI = lhsI | rhsI; else
-                    if (bo.op == "^") cvI = lhsI ^ rhsI; else
-                    if (bo.op == "&") cvI = lhsI & rhsI; else
-                    if (bo.op == "*") cvI = lhsI * rhsI; else
-                    if (bo.op == "/") cvI = lhsI / rhsI; else
-                    if (bo.op == "%") cvI = lhsI % rhsI; else
-                    if (bo.op == "+") cvI = lhsI + rhsI; else
-                    if (bo.op == "-") cvI = lhsI - rhsI; else return null;
-                    lhs = new Integer(cvI);
+                try {
+                    // Numeric binary operation.
+                    if (lhs instanceof Double || rhs instanceof Double) {
+                        double lhsD = ((Number) lhs).doubleValue();
+                        double rhsD = ((Number) rhs).doubleValue();
+                        double cvD;
+                        if (bo.op == "*") cvD = lhsD * rhsD; else
+                        if (bo.op == "/") cvD = lhsD / rhsD; else
+                        if (bo.op == "%") cvD = lhsD % rhsD; else
+                        if (bo.op == "+") cvD = lhsD + rhsD; else
+                        if (bo.op == "-") cvD = lhsD - rhsD; else return null;
+                        lhs = new Double(cvD);
+                    } else
+                    if (lhs instanceof Float || rhs instanceof Float) {
+                        float lhsF = ((Number) lhs).floatValue();
+                        float rhsF = ((Number) rhs).floatValue();
+                        float cvF;
+                        if (bo.op == "*") cvF = lhsF * rhsF; else
+                        if (bo.op == "/") cvF = lhsF / rhsF; else
+                        if (bo.op == "%") cvF = lhsF % rhsF; else
+                        if (bo.op == "+") cvF = lhsF + rhsF; else
+                        if (bo.op == "-") cvF = lhsF - rhsF; else return null;
+                        lhs = new Float(cvF);
+                    } else
+                    if (lhs instanceof Long || rhs instanceof Long) {
+                        long lhsL = ((Number) lhs).longValue();
+                        long rhsL = ((Number) rhs).longValue();
+                        long cvL;
+                        if (bo.op == "|") cvL = lhsL | rhsL; else
+                        if (bo.op == "^") cvL = lhsL ^ rhsL; else
+                        if (bo.op == "&") cvL = lhsL & rhsL; else
+                        if (bo.op == "*") cvL = lhsL * rhsL; else
+                        if (bo.op == "/") cvL = lhsL / rhsL; else
+                        if (bo.op == "%") cvL = lhsL % rhsL; else
+                        if (bo.op == "+") cvL = lhsL + rhsL; else
+                        if (bo.op == "-") cvL = lhsL - rhsL; else return null;
+                        lhs = new Long(cvL);
+                    } else
+                    {
+                        int lhsI = ((Number) lhs).intValue();
+                        int rhsI = ((Number) rhs).intValue();
+                        int cvI;
+                        if (bo.op == "|") cvI = lhsI | rhsI; else
+                        if (bo.op == "^") cvI = lhsI ^ rhsI; else
+                        if (bo.op == "&") cvI = lhsI & rhsI; else
+                        if (bo.op == "*") cvI = lhsI * rhsI; else
+                        if (bo.op == "/") cvI = lhsI / rhsI; else
+                        if (bo.op == "%") cvI = lhsI % rhsI; else
+                        if (bo.op == "+") cvI = lhsI + rhsI; else
+                        if (bo.op == "-") cvI = lhsI - rhsI; else return null;
+                        lhs = new Integer(cvI);
+                    }
+                } catch(ArithmeticException ae) {
+                    // most likely a div by zero or mod by zero
+                    // guess we can't make this expression into a constant
+                    return null;
                 }
             }
             return lhs;

==== BEGIN SVK PATCH BLOCK ====
Version: svk v2.0.2 (linux)

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
==== END SVK PATCH BLOCK ====

