[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();
}
}
}