[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elang/visitors CopyVisitor.java
markm@eros.cs.jhu.edu
markm@eros.cs.jhu.edu
Sat, 17 Nov 2001 13:25:55 -0500
markm 01/11/17 13:25:55
Modified: src Makefile
src/esrc/org/erights/e/elang/cmd
evalServerMakerAuthor.emaker
src/esrc/scripts updoc.e
src/jsrc/org/erights/e/elang/evm AssignExpr.java EExpr.java
FinalPattern.java FrameFinalNounExpr.java
FrameSlotNounExpr.java LiteralNounExpr.java
LiteralSlotNounExpr.java LocalFinalNounExpr.java
LocalSlotNounExpr.java NounExpr.java
OuterNounExpr.java VarPattern.java
src/jsrc/org/erights/e/elang/interp Interp.java
LazyEvalSlot.java ScopeSetup.java
src/jsrc/org/erights/e/elang/scope InnerScope.java
OuterScope.java Scope.java
src/jsrc/org/erights/e/elang/syntax EBuilder.java
src/jsrc/org/erights/e/elang/visitors CopyVisitor.java
Log:
assignment to final non-outer now rejects 'statically'
Revision Changes Path
1.123 +2 -2 e/src/Makefile
Index: Makefile
===================================================================
RCS file: /cvs/e/src/Makefile,v
retrieving revision 1.122
retrieving revision 1.123
diff -u -r1.122 -r1.123
--- Makefile 2001/11/16 09:39:06 1.122
+++ Makefile 2001/11/17 18:25:54 1.123
@@ -7,8 +7,8 @@
# Prefix tagging this release's attributes
PREFIX=E
-DOTVER=0.8.10gamma1
-TAGVER=0_8_10gamma1
+DOTVER=0.8.10gamma3
+TAGVER=0_8_10gamma3
RELEASE=working
TOP=..
1.7 +7 -7 e/src/esrc/org/erights/e/elang/cmd/evalServerMakerAuthor.emaker
Index: evalServerMakerAuthor.emaker
===================================================================
RCS file: /cvs/e/src/esrc/org/erights/e/elang/cmd/evalServerMakerAuthor.emaker,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- evalServerMakerAuthor.emaker 2001/09/10 00:06:51 1.6
+++ evalServerMakerAuthor.emaker 2001/11/17 18:25:54 1.7
@@ -9,7 +9,7 @@
# @author Mark S. Miller
# @author Terry Stanley
def evalServerMakerAuthor(unsafe__uriGetter, introducer, traceln) :near {
-
+
def evalServerMaker {
to newVat(args, props, vatName) :near {
def io__uriGetter := <unsafe:java.io.*>
@@ -22,17 +22,17 @@
def PipedWriterMaker := <io:PipedWriter>
def TextWriterMaker := <elib:eio.TextWriter>
def TwineFeederMaker := <elang:syntax.TwineFeeder>
-
+
def ioPairMaker() :any {
def pipedReader := PipedReaderMaker new()
def textWriter := TextWriterMaker new(PipedWriterMaker new(pipedReader))
def lineReader := BufferedReaderMaker new(pipedReader)
[textWriter, lineReader]
}
-
+
def [altout, altoutReader] := ioPairMaker()
def [alterr, alterrReader] := ioPairMaker()
-
+
def runner := RunnerMaker newHeadless(vatName)
def sacrificial := TwineFeederMaker new("")
def altInterp := InterpMaker make(
@@ -43,19 +43,19 @@
runner,
sacrificial,
null) # optTopScope, null implies privilegedScope
-
+
traceln("made interp")
altInterp setSource(evalServerSrc)
altInterp fork()
# XXX what to do about spawning errors
# def errString := alterrBuffer toString() trim()
# require(errString == "", thunk{`errors while spawning: $errString`})
-
+
traceln("about to readLine")
def uri := altoutReader readLine() trim() # 2-vat blockage
traceln(`read $uri`)
def sr := introducer sturdyFromURI(uri)
- def evalServerRcvr := sr getGrip()
+ def evalServerRcvr := sr getRcvr()
def vat {
to getEvalServerRcvr() :any {evalServerRcvr}
to getInterp() :near {altInterp}
1.17 +1 -1 e/src/esrc/scripts/updoc.e
Index: updoc.e
===================================================================
RCS file: /cvs/e/src/esrc/scripts/updoc.e,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- updoc.e 2001/09/15 02:03:40 1.16
+++ updoc.e 2001/11/17 18:25:54 1.17
@@ -606,6 +606,7 @@
# XXX Should check that it's a MalformedURLException
<file: name>
}
+ interp blockAtTop()
when (updoc(filedir, stdout)) -> done(_) {
stdout println()
interp continueAtTop()
@@ -619,4 +620,3 @@
hashCache checkpoint()
}
-interp blockAtTop()
1.30 +4 -0 e/src/jsrc/org/erights/e/elang/evm/AssignExpr.java
Index: AssignExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/AssignExpr.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- AssignExpr.java 2001/11/10 19:40:39 1.29
+++ AssignExpr.java 2001/11/17 18:25:54 1.30
@@ -56,6 +56,10 @@
public AssignExpr(NounExpr noun, EExpr rValue) {
myNoun = noun;
myRValue = rValue;
+ if (! (noun.mayBeAssignable())) {
+ //XXX Should be a SyntaxError using source position info
+ throw new RuntimeException("May not assign to " + noun.name());
+ }
}
/**
1.32 +1 -1 e/src/jsrc/org/erights/e/elang/evm/EExpr.java
Index: EExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/EExpr.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- EExpr.java 2001/11/12 18:23:15 1.31
+++ EExpr.java 2001/11/17 18:25:54 1.32
@@ -39,7 +39,7 @@
*/
public abstract class EExpr extends ENode {
- static public EExpr TheLastTransformed = new NounExpr("none");
+ static public EExpr TheLastTransformed = new SimpleNounExpr("none");
/**
*
1.12 +1 -1 e/src/jsrc/org/erights/e/elang/evm/FinalPattern.java
Index: FinalPattern.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/FinalPattern.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- FinalPattern.java 2001/11/10 19:40:39 1.11
+++ FinalPattern.java 2001/11/17 18:25:54 1.12
@@ -72,7 +72,7 @@
}
public FinalPattern(String varName, EExpr guardExpr) {
- this(varName, new NounExpr(varName), guardExpr);
+ this(varName, new SimpleNounExpr(varName), guardExpr);
}
/**
1.4 +7 -0 e/src/jsrc/org/erights/e/elang/evm/FrameFinalNounExpr.java
Index: FrameFinalNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/FrameFinalNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FrameFinalNounExpr.java 2001/11/12 18:23:15 1.3
+++ FrameFinalNounExpr.java 2001/11/17 18:25:54 1.4
@@ -43,6 +43,13 @@
/**
*
*/
+ public boolean mayBeAssignable() {
+ return false;
+ }
+
+ /**
+ *
+ */
public Slot getSlot(EvalContext ctx) {
return FinalSlotMaker.THE_ONE.makeSlot(ctx.field(myIndex), null);
}
1.4 +2 -2 e/src/jsrc/org/erights/e/elang/evm/FrameSlotNounExpr.java
Index: FrameSlotNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/FrameSlotNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FrameSlotNounExpr.java 2001/11/12 18:23:15 1.3
+++ FrameSlotNounExpr.java 2001/11/17 18:25:54 1.4
@@ -42,8 +42,8 @@
/**
*
*/
- public boolean isFinal() {
- return false;
+ public boolean mayBeAssignable() {
+ return true;
}
/**
1.4 +10 -0 e/src/jsrc/org/erights/e/elang/evm/LiteralNounExpr.java
Index: LiteralNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/LiteralNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LiteralNounExpr.java 2001/11/12 18:23:15 1.3
+++ LiteralNounExpr.java 2001/11/17 18:25:54 1.4
@@ -38,6 +38,16 @@
myValue = value;
}
+ /**
+ *
+ */
+ public boolean mayBeAssignable() {
+ return false;
+ }
+
+ /**
+ *
+ */
public boolean isOuter() {
return true;
}
1.4 +7 -0 e/src/jsrc/org/erights/e/elang/evm/LiteralSlotNounExpr.java
Index: LiteralSlotNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/LiteralSlotNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LiteralSlotNounExpr.java 2001/11/12 18:23:15 1.3
+++ LiteralSlotNounExpr.java 2001/11/17 18:25:54 1.4
@@ -37,6 +37,13 @@
mySlot = slot;
}
+ /**
+ *
+ */
+ public boolean mayBeAssignable() {
+ return true;
+ }
+
public boolean isOuter() {
return true;
}
1.4 +7 -0 e/src/jsrc/org/erights/e/elang/evm/LocalFinalNounExpr.java
Index: LocalFinalNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/LocalFinalNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LocalFinalNounExpr.java 2001/11/12 18:23:15 1.3
+++ LocalFinalNounExpr.java 2001/11/17 18:25:54 1.4
@@ -43,6 +43,13 @@
/**
*
*/
+ public boolean mayBeAssignable() {
+ return false;
+ }
+
+ /**
+ *
+ */
public Slot getSlot(EvalContext ctx) {
return FinalSlotMaker.THE_ONE.makeSlot(ctx.local(myIndex), null);
}
1.4 +2 -2 e/src/jsrc/org/erights/e/elang/evm/LocalSlotNounExpr.java
Index: LocalSlotNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/LocalSlotNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LocalSlotNounExpr.java 2001/11/12 18:23:15 1.3
+++ LocalSlotNounExpr.java 2001/11/17 18:25:54 1.4
@@ -42,8 +42,8 @@
/**
*
*/
- public boolean isFinal() {
- return false;
+ public boolean mayBeAssignable() {
+ return true;
}
/**
1.28 +9 -11 e/src/jsrc/org/erights/e/elang/evm/NounExpr.java
Index: NounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/NounExpr.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- NounExpr.java 2001/11/12 18:23:15 1.27
+++ NounExpr.java 2001/11/17 18:25:54 1.28
@@ -38,7 +38,7 @@
* @author <a href="mailto:markm@erights.org">Mark S. Miller</a>
* @author <a href="mailto:tribble@e-dean.com">E. Dean Tribble</a>
*/
-public class NounExpr extends EExpr {
+public abstract class NounExpr extends EExpr {
/**
*
@@ -48,16 +48,14 @@
/**
*
*/
- public NounExpr(String name) {
+ /*package*/ NounExpr(String name) {
myName = name;
}
/**
- *
+ * 'false' only if it's known not to be assignable
*/
- public boolean isFinal() {
- return true;
- }
+ public abstract boolean mayBeAssignable();
/**
*
@@ -148,17 +146,17 @@
}
/**
- * Return a noun that could access the representation of the receiver if it
- * were at in a frame at the given index. This is used to maintain final/var
- * distinctions as slots are copied into frames.
+ * Return a noun that could access the representation of the receiver if
+ * it were at in a frame at the given index. This is used to maintain
+ * final/var distinctions as slots are copied into frames.
*/
public NounExpr asFieldAt(int index) {
throw new RuntimeException("This node should have been transformed");
}
/**
- * Default implementation of assign in terms of the slot. Note that this raises
- * the correct exception if the slot is a final slot.
+ * Default implementation of assign in terms of the slot. Note that this
+ * raises the correct exception if the slot is a final slot.
*/
public void assign(EvalContext ctx, Object value) {
getSlot(ctx).setValue(value);
1.4 +7 -0 e/src/jsrc/org/erights/e/elang/evm/OuterNounExpr.java
Index: OuterNounExpr.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/OuterNounExpr.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- OuterNounExpr.java 2001/11/12 18:23:16 1.3
+++ OuterNounExpr.java 2001/11/17 18:25:54 1.4
@@ -42,6 +42,13 @@
/**
*
*/
+ public boolean mayBeAssignable() {
+ return true;
+ }
+
+ /**
+ *
+ */
public boolean isOuter() {
return true;
}
1.12 +1 -1 e/src/jsrc/org/erights/e/elang/evm/VarPattern.java
Index: VarPattern.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/evm/VarPattern.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- VarPattern.java 2001/11/10 19:40:39 1.11
+++ VarPattern.java 2001/11/17 18:25:54 1.12
@@ -75,7 +75,7 @@
}
public VarPattern(String varName, EExpr guardExpr) {
- this(varName, new NounExpr(varName), guardExpr);
+ this(varName, new SimpleNounExpr(varName), guardExpr);
}
/**
1.77 +0 -8 e/src/jsrc/org/erights/e/elang/interp/Interp.java
Index: Interp.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/interp/Interp.java,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -r1.76 -r1.77
--- Interp.java 2001/11/10 19:40:41 1.76
+++ Interp.java 2001/11/17 18:25:54 1.77
@@ -482,17 +482,9 @@
}
/**
- *
->>>> ORIGINAL
* Return null if program succeeded. Otherwise, return the problem with
* which it failed. A NeedMoreException, though, throws straight
* through.
-==== THEIRS
-==== YOURS
- * Return null if program succeeded. Otherwise, return the problem with
- * which it failed. A NeedMoreException, though, throws straight
- * through.
-<<<<
*/
public Throwable interpret() {
while (true) {
1.8 +1 -1 e/src/jsrc/org/erights/e/elang/interp/LazyEvalSlot.java
Index: LazyEvalSlot.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/interp/LazyEvalSlot.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- LazyEvalSlot.java 2001/11/13 02:13:54 1.7
+++ LazyEvalSlot.java 2001/11/17 18:25:54 1.8
@@ -81,7 +81,7 @@
if (null != myOptSource) {
//System.out.println("Lazy eval: " + myOptSource);
EExpr eExpr = (EExpr)EParser.run(myOptSource);
- OuterScope scope = (OuterScope)E.as(myOptScope, OuterScope.class);
+ Scope scope = (Scope)E.as(myOptScope, Scope.class);
myOptValue = eExpr.eval(scope.diverge());
myOptScope = null;
myOptSource = null;
1.74 +0 -2 e/src/jsrc/org/erights/e/elang/interp/ScopeSetup.java
Index: ScopeSetup.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/interp/ScopeSetup.java,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -r1.73 -r1.74
--- ScopeSetup.java 2001/11/16 09:39:08 1.73
+++ ScopeSetup.java 2001/11/17 18:25:54 1.74
@@ -165,8 +165,6 @@
"OrderedSpaceMaker new(<import:java.lang.Double> TYPE(),"
+ "\"float64\")");
um.comp("char", univ,
- "<import:org.erights.e.elang.coord.OrderedSpaceMaker>");
- um.comp("OrderedSpaceMaker", univ,
"OrderedSpaceMaker new(<import:java.lang.Character> TYPE(),"
+ "\"char\")");
1.6 +7 -0 e/src/jsrc/org/erights/e/elang/scope/InnerScope.java
Index: InnerScope.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/scope/InnerScope.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- InnerScope.java 2001/11/13 02:13:54 1.5
+++ InnerScope.java 2001/11/17 18:25:55 1.6
@@ -63,4 +63,11 @@
// TODO should this eliminate all the current locals?
return myEvalContext.extended(numLocals);
}
+
+ /**
+ *
+ */
+ public Scope diverge() {
+ throw new RuntimeException("XXX Not yet implemented");
+ }
}
1.6 +1 -1 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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- OuterScope.java 2001/11/13 02:13:54 1.5
+++ OuterScope.java 2001/11/17 18:25:55 1.6
@@ -111,7 +111,7 @@
* Return a new non-mutable OuterScope that does not share outers data
* structures with the receiver.
*/
- public OuterScope diverge() {
+ public Scope diverge() {
return new OuterScope(myScopeMap,
(Slot[])myOuters.clone(),
myNextOuter,
1.52 +10 -0 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.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- Scope.java 2001/11/13 02:13:54 1.51
+++ Scope.java 2001/11/17 18:25:55 1.52
@@ -170,6 +170,16 @@
throws AlreadyDefinedException;
/**
+ * A new Scope object just like this one, except that it's extensible,
+ * but not otherwise mutable, and extension (which are only to the
+ * innermost contour) do not affect the inner scope.
+ * <p>
+ * Unlike the old sprout(), diverge()ing a Scope does not add a new
+ * contour, but rather copies the existing innermost contour.
+ */
+ public abstract Scope diverge();
+
+ /**
*
*/
protected ConstMap locals() {
1.85 +3 -2 e/src/jsrc/org/erights/e/elang/syntax/EBuilder.java
Index: EBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/EBuilder.java,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -r1.84 -r1.85
--- EBuilder.java 2001/11/10 19:40:42 1.84
+++ EBuilder.java 2001/11/17 18:25:55 1.85
@@ -53,6 +53,7 @@
import org.erights.e.elang.evm.StaticScope;
import org.erights.e.elang.evm.SuchThatPattern;
import org.erights.e.elang.evm.VarPattern;
+import org.erights.e.elang.evm.SimpleNounExpr;
import org.erights.e.elang.interp.Interp;
import org.erights.e.elang.visitors.RenameVisitor;
import org.erights.e.elib.base.MethodNode;
@@ -691,7 +692,7 @@
*
*/
static /*package*/ NounExpr noun(Object name) {
- return new NounExpr((String)name);
+ return new SimpleNounExpr((String)name);
}
/**
@@ -1387,7 +1388,7 @@
private EExpr matchExpr(Matcher[] matchers,
String varName,
EExpr optOtherwise) {
- NounExpr specimen = new NounExpr(varName);
+ NounExpr specimen = noun(varName);
EExpr result;
if (optOtherwise == null) {
1.22 +2 -1 e/src/jsrc/org/erights/e/elang/visitors/CopyVisitor.java
Index: CopyVisitor.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/visitors/CopyVisitor.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- CopyVisitor.java 2001/11/10 19:40:43 1.21
+++ CopyVisitor.java 2001/11/17 18:25:55 1.22
@@ -55,6 +55,7 @@
import org.erights.e.elang.evm.SlotExpr;
import org.erights.e.elang.evm.SuchThatPattern;
import org.erights.e.elang.evm.VarPattern;
+import org.erights.e.elang.evm.SimpleNounExpr;
import java.lang.reflect.Array;
@@ -213,7 +214,7 @@
*
*/
public Object visitNounExpr(String varName) {
- return new NounExpr(varName);
+ return new SimpleNounExpr(varName);
}