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