[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elib/prim ConstructorNode.java InstanceMethodNode.java JavaMemberNode.java StaticMethodNode.java SugarMethodNode.java VarGetterNode.java VarSetterNode.java

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Tue, 18 Dec 2001 22:25:38 -0500


markm       01/12/18 22:25:38

  Modified:    src/jsrc/org/erights/e/elang/scope OuterScope.java
                        Scope.java ScopeMapLink.java
               src/jsrc/org/erights/e/elib/base ClassDesc.java
               src/jsrc/org/erights/e/elib/prim ConstructorNode.java
                        InstanceMethodNode.java JavaMemberNode.java
                        StaticMethodNode.java SugarMethodNode.java
                        VarGetterNode.java VarSetterNode.java
  Log:
  fixed arithmetic coercion bug 125414

Revision  Changes    Path
1.10      +0 -4      e/src/jsrc/org/erights/e/elang/scope/OuterScope.java

Index: OuterScope.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/scope/OuterScope.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- OuterScope.java	2001/12/14 00:06:00	1.9
+++ OuterScope.java	2001/12/19 03:25:38	1.10
@@ -131,10 +131,6 @@
                               false);
     }
 
-    public ConstMap locals() {
-        throw new RuntimeException("TODO unimplemented");
-    }
-
     public Slot getSlot(String name) {
         OuterNounExpr noun = (OuterNounExpr)myScopeMap.getNoun(name);
         return getIndex(noun.getIndex());



1.55      +3 -2      e/src/jsrc/org/erights/e/elang/scope/Scope.java

Index: Scope.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/scope/Scope.java,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- Scope.java	2001/12/14 00:06:00	1.54
+++ Scope.java	2001/12/19 03:25:38	1.55
@@ -210,7 +210,8 @@
     /**
      *
      */
-    protected ConstMap locals() {
-        return null;  // TODO
+    private ConstMap locals() {
+        throw new RuntimeException("TODO unimplemented");
     }
+
 }



1.3       +0 -3      e/src/jsrc/org/erights/e/elang/scope/ScopeMapLink.java

Index: ScopeMapLink.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/scope/ScopeMapLink.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ScopeMapLink.java	2001/12/02 06:01:44	1.2
+++ ScopeMapLink.java	2001/12/19 03:25:38	1.3
@@ -37,7 +37,6 @@
      *
      */
     public NounExpr getNoun(String name) {
-        // TODO markm are we guaranteed that the names are canonical?
         return myName.equals(name) ? myNoun : myNext.getNoun(name);
     }
 
@@ -45,7 +44,6 @@
      *
      */
     public boolean contains(String name) {
-        // TODO markm are we guaranteed that the names are canonical?
         return myName.equals(name) || myNext.contains(name);
     }
 
@@ -62,7 +60,6 @@
      *
      */
     public void assertShadowable(String name) {
-        // TODO markm are we guaranteed that the names are canonical?
         if (myName.equals(name)) {
             throw new AlreadyDefinedException(name + " already in scope");
         }



1.37      +3 -2      e/src/jsrc/org/erights/e/elib/base/ClassDesc.java

Index: ClassDesc.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/base/ClassDesc.java,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- ClassDesc.java	2001/12/18 21:59:30	1.36
+++ ClassDesc.java	2001/12/19 03:25:38	1.37
@@ -39,6 +39,7 @@
 import org.erights.e.elib.util.OneArgFunc;
 import org.erights.e.meta.java.lang.ArrayGuardSugar;
 import org.erights.e.meta.java.lang.InterfaceGuardSugar;
+import org.erights.e.elang.interp.Help;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -428,8 +429,8 @@
         String specTypeName = typeSig(specimen.getClass());
         throw Thrower.toEject(optEjector,
                               new ClassCastException(specTypeName +
-                                                     " doesn't coerce to a " +
-                                                     getName()));
+                                                     " doesn't coerce to " +
+                                                     Help.aan(getName())));
     }
 
     /**



1.19      +8 -5      e/src/jsrc/org/erights/e/elib/prim/ConstructorNode.java

Index: ConstructorNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/ConstructorNode.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- ConstructorNode.java	2001/12/05 00:46:10	1.18
+++ ConstructorNode.java	2001/12/19 03:25:38	1.19
@@ -25,6 +25,7 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.InvocationTargetException;
 
 /**
  * Turns a java constructor into a "new" method on the corresponding
@@ -65,22 +66,24 @@
      *
      */
     protected String explain(String args) {
-        return "new " + member().getName() + "(" + args + ")";
+        return "new " + myMember.getName() + "(" + args + ")";
     }
 
     /**
      *
      */
     protected Object innerExecute(Object self, Object[] args)
-      throws Exception {
-        return ((Constructor)member()).newInstance(args);
+      throws InstantiationException, IllegalAccessException,
+      IllegalArgumentException, InvocationTargetException {
+
+        return ((Constructor)myMember).newInstance(args);
     }
 
     /**
      *
      */
     public Class[] parameterTypes() {
-        return ((Constructor)member()).getParameterTypes();
+        return ((Constructor)myMember).getParameterTypes();
     }
 
     /**
@@ -88,7 +91,7 @@
      * not concerned about 'super(...)' invocations.
      */
     protected Class returnType() {
-        return ((Constructor)member()).getDeclaringClass();
+        return ((Constructor)myMember).getDeclaringClass();
     }
 
     /**



1.18      +9 -6      e/src/jsrc/org/erights/e/elib/prim/InstanceMethodNode.java

Index: InstanceMethodNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/InstanceMethodNode.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- InstanceMethodNode.java	2001/12/05 00:46:10	1.17
+++ InstanceMethodNode.java	2001/12/19 03:25:38	1.18
@@ -26,6 +26,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.InvocationTargetException;
 
 /**
  * How a java instance method is installed in a VTable
@@ -87,7 +88,7 @@
      *
      */
     protected String explain(String args) {
-        return "<a " + member().getDeclaringClass().getName() + ">."
+        return "<a " + myMember.getDeclaringClass().getName() + ">."
           + verb() + "(" + args + ")";
     }
 
@@ -95,28 +96,30 @@
      *
      */
     protected Object innerExecute(Object self, Object[] args)
-      throws Exception {
-        return ((Method)member()).invoke(self, args);
+      throws IllegalAccessException, IllegalArgumentException,
+      InvocationTargetException {
+
+        return ((Method)myMember).invoke(self, args);
     }
 
     /**
      *
      */
     public Class[] parameterTypes() {
-        return ((Method)member()).getParameterTypes();
+        return ((Method)myMember).getParameterTypes();
     }
 
     /**
      *
      */
     protected Class returnType() {
-        return ((Method)member()).getReturnType();
+        return ((Method)myMember).getReturnType();
     }
 
     /**
      *
      */
     public Class receiverType() {
-        return member().getDeclaringClass();
+        return myMember.getDeclaringClass();
     }
 }



1.34      +54 -5     e/src/jsrc/org/erights/e/elib/prim/JavaMemberNode.java

Index: JavaMemberNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/JavaMemberNode.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- JavaMemberNode.java	2001/12/10 18:27:00	1.33
+++ JavaMemberNode.java	2001/12/19 03:25:38	1.34
@@ -32,6 +32,8 @@
 
 import java.io.IOException;
 import java.lang.reflect.Member;
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigInteger;
 
 
 /**
@@ -42,7 +44,7 @@
  */
 public abstract class JavaMemberNode extends MethodNode {
 
-    private Member myMember;
+    /*package*/ final Member myMember;
 
     private boolean myOkCoverageFlag = false;
 
@@ -150,6 +152,34 @@
     }
 
     /**
+     * This is called only when 'self aVerb(args)' has failed due to a
+     * coercion-to-Java failure, in which case we try a special case outside
+     * our normal coercion theory.
+     * <p>
+     * The one such special case currently defined, and hopefully the only
+     * one we will define, is to have '3 + 4.5' and such coerce to
+     * '3.0 + 4.5'.
+     * <p>
+     * If we aren't in one of our special cases, then we should simply
+     * rethrow the problem.
+     */
+    static private Object trySpecialCoercion(Object self,
+                                             String aVerb,
+                                             Object[] args,
+                                             Throwable problem) {
+        //XXX is this test adequate, or should we explicitly enumerate the
+        //verbs to which this special coercion applies?
+        if (self instanceof BigInteger &&
+          1 == args.length &&
+          args[0] instanceof Double) {
+
+            self = new Double(((BigInteger)self).doubleValue());
+            return E.callAll(self, aVerb, args);
+        }
+        throw ExceptionMgr.asSafe(problem);
+    }
+
+    /**
      *
      */
     public Object execute(Object self, String aVerb, Object[] args) {
@@ -163,9 +193,25 @@
             try {
                 result = innerExecute(self, args);
             } catch (IllegalArgumentException ex) {
-                Object newSelf = E.as(self, receiverType());
-                Object[] newArgs = coerceArgs(args, null);
+                Object newSelf;
+                Object[] newArgs;
+                Ejector ej = new Ejector();
                 try {
+                    newSelf = E.as(self, receiverType(), ej);
+                    newArgs = coerceArgs(args, ej);
+                } catch (Throwable th) {
+                    Throwable problem = (Throwable)ej.result(th);
+                    result = trySpecialCoercion(self,
+                                                aVerb,
+                                                args,
+                                                problem);
+                    myOkCoverageFlag = true;
+                    return result;
+                } finally {
+                    ej.disable();
+                }
+
+                try {
                     result = innerExecute(newSelf, newArgs);
                 } catch (IllegalArgumentException ex2) {
                     //for now, just a chance to breakpoint
@@ -187,10 +233,13 @@
     protected abstract String explain(String args);
 
     /**
-     *
+     * @exception IllegalArgumentException  if the number of actual and formal
+     *              parameters differ, or if an unwrapping  or method
+     *              invocation conversion fails.
      */
     protected abstract Object innerExecute(Object self, Object[] args)
-      throws Exception;
+      throws InstantiationException, IllegalAccessException,
+      IllegalArgumentException, InvocationTargetException;
 
     /**
      * XXX Security alert: covert channel?



1.22      +8 -5      e/src/jsrc/org/erights/e/elib/prim/StaticMethodNode.java

Index: StaticMethodNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/StaticMethodNode.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- StaticMethodNode.java	2001/12/05 00:46:10	1.21
+++ StaticMethodNode.java	2001/12/19 03:25:38	1.22
@@ -26,6 +26,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.InvocationTargetException;
 
 /**
  * How a java static is made to appear as an instance method of an
@@ -94,7 +95,7 @@
      *
      */
     protected String explain(String args) {
-        return member().getDeclaringClass().getName() + "."
+        return myMember.getDeclaringClass().getName() + "."
           + verb() + "(" + args + ")";
     }
 
@@ -102,22 +103,24 @@
      *
      */
     protected Object innerExecute(Object self, Object[] args)
-      throws Exception {
-        return ((Method)member()).invoke(null, args);
+      throws IllegalAccessException, IllegalArgumentException,
+      InvocationTargetException {
+
+        return ((Method)myMember).invoke(null, args);
     }
 
     /**
      *
      */
     public Class[] parameterTypes() {
-        return ((Method)member()).getParameterTypes();
+        return ((Method)myMember).getParameterTypes();
     }
 
     /**
      *
      */
     protected Class returnType() {
-        return ((Method)member()).getReturnType();
+        return ((Method)myMember).getReturnType();
     }
 
     /**



1.20      +9 -6      e/src/jsrc/org/erights/e/elib/prim/SugarMethodNode.java

Index: SugarMethodNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/SugarMethodNode.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- SugarMethodNode.java	2001/12/05 00:46:10	1.19
+++ SugarMethodNode.java	2001/12/19 03:25:38	1.20
@@ -30,6 +30,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.InvocationTargetException;
 
 
 /**
@@ -113,7 +114,7 @@
         if (args.length() != 0) {
             args = ", " + args;
         }
-        return member().getDeclaringClass().getName() + "."
+        return myMember.getDeclaringClass().getName() + "."
           + verb() + "(<receiver>" + args + ")";
     }
 
@@ -121,8 +122,10 @@
      *
      */
     protected Object innerExecute(Object self, Object[] args)
-      throws Exception {
-        Method meth = (Method)member();
+      throws IllegalAccessException, IllegalArgumentException,
+      InvocationTargetException {
+
+        Method meth = (Method)myMember;
         Object[] newArgs = new Object[args.length + 1];
         newArgs[0] = self;
         System.arraycopy(args, 0, newArgs, 1, args.length);
@@ -143,7 +146,7 @@
      *
      */
     public Class[] parameterTypes() {
-        Class[] types = ((Method)member()).getParameterTypes();
+        Class[] types = ((Method)myMember).getParameterTypes();
         Class[] result = new Class[types.length - 1];
         System.arraycopy(types, 1, result, 0, result.length);
         return result;
@@ -153,7 +156,7 @@
      *
      */
     protected Class returnType() {
-        return ((Method)member()).getReturnType();
+        return ((Method)myMember).getReturnType();
     }
 
     /**
@@ -170,6 +173,6 @@
      *
      */
     public Class receiverType() {
-        return ((Method)member()).getParameterTypes()[0];
+        return ((Method)myMember).getParameterTypes()[0];
     }
 }



1.16      +6 -6      e/src/jsrc/org/erights/e/elib/prim/VarGetterNode.java

Index: VarGetterNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/VarGetterNode.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- VarGetterNode.java	2001/12/05 00:46:10	1.15
+++ VarGetterNode.java	2001/12/19 03:25:38	1.16
@@ -45,16 +45,16 @@
      *
      */
     protected String explain(String args) {
-        return member().getDeclaringClass().getName() + "." + verb();
+        return myMember.getDeclaringClass().getName() + "." + verb();
     }
 
     /**
      *
      */
     protected Object innerExecute(Object self, Object[] args)
-      throws Exception {
+      throws IllegalArgumentException, IllegalAccessException {
 
-        return ((Field)member()).get(self);
+        return ((Field)myMember).get(self);
     }
 
     /**
@@ -68,17 +68,17 @@
      *
      */
     protected Class returnType() {
-        return ((Field)member()).getType();
+        return ((Field)myMember).getType();
     }
 
     /**
      *
      */
     public Class receiverType() {
-        if (Modifier.isStatic(member().getModifiers())) {
+        if (Modifier.isStatic(myMember.getModifiers())) {
             return StaticMaker.class;
         } else {
-            return member().getDeclaringClass();
+            return myMember.getDeclaringClass();
         }
     }
 }



1.17      +6 -6      e/src/jsrc/org/erights/e/elib/prim/VarSetterNode.java

Index: VarSetterNode.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/VarSetterNode.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- VarSetterNode.java	2001/12/16 10:10:29	1.16
+++ VarSetterNode.java	2001/12/19 03:25:38	1.17
@@ -46,7 +46,7 @@
      *
      */
     protected String explain(String args) {
-        return member().getDeclaringClass().getName() + "."
+        return myMember.getDeclaringClass().getName() + "."
           + verb() + " = " + args + ";";
     }
 
@@ -54,9 +54,9 @@
      *
      */
     protected Object innerExecute(Object self, Object[] args)
-      throws Exception {
+      throws IllegalArgumentException, IllegalAccessException {
 
-        ((Field)member()).set(self, args[0]);
+        ((Field)myMember).set(self, args[0]);
         return null;
     }
 
@@ -64,7 +64,7 @@
      *
      */
     public Class[] parameterTypes() {
-        Class[] result = { ((Field)member()).getType() };
+        Class[] result = { ((Field)myMember).getType() };
         return result;
     }
 
@@ -79,10 +79,10 @@
      *
      */
     public Class receiverType() {
-        if (Modifier.isStatic(member().getModifiers())) {
+        if (Modifier.isStatic(myMember.getModifiers())) {
             return StaticMaker.class;
         } else {
-            return member().getDeclaringClass();
+            return myMember.getDeclaringClass();
         }
     }
 }