[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elib/prim/tests ERunDemo.java

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Sun, 9 Sep 2001 20:06:52 -0400


markm       01/09/09 20:06:52

  Modified:    src/esrc/org/erights/e/elang/cmd
                        evalServerMakerAuthor.emaker
               src/esrc/scripts updoc.e
               src/jsrc/org/erights/e/elang/interp InteractiveInterp.java
                        Interp.java
               src/jsrc/org/erights/e/elang/syntax ELexer.java
               src/jsrc/org/erights/e/elib/eio TextWriter.java
               src/jsrc/org/erights/e/elib/prim RunnerImpl.java
               src/jsrc/org/erights/e/elib/prim/tests ERunDemo.java
  Log:
  Multivat updoc starts to work.  Runner setPriority/1.  stdout, stderr autoFlush

Revision  Changes    Path
1.6       +58 -51    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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- evalServerMakerAuthor.emaker	2001/09/08 22:59:20	1.5
+++ evalServerMakerAuthor.emaker	2001/09/10 00:06:51	1.6
@@ -9,58 +9,65 @@
 # @author Mark S. Miller
 # @author Terry Stanley
 def evalServerMakerAuthor(unsafe__uriGetter, introducer, traceln) :near {
-
-    class evalServerMaker(args, props, vatName) :near {
-        def io__uriGetter := <unsafe:java.io.*>
-        def elib__uriGetter := <unsafe:org.erights.e.elib.*>
-        def elang__uriGetter := <unsafe:org.erights.e.elang.*>
-        def RunnerMaker := <elib:prim.Runner>
-        def InterpMaker := <elang:interp.Interp>
-        def BufferedReaderMaker := <io:BufferedReader>
-        def PipedReaderMaker := <io:PipedReader>
-        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 evalServerMaker {
+        to newVat(args, props, vatName) :near {
+            def io__uriGetter := <unsafe:java.io.*>
+            def elib__uriGetter := <unsafe:org.erights.e.elib.*>
+            def elang__uriGetter := <unsafe:org.erights.e.elang.*>
+            def RunnerMaker := <elib:prim.Runner>
+            def InterpMaker := <elang:interp.Interp>
+            def BufferedReaderMaker := <io:BufferedReader>
+            def PipedReaderMaker := <io:PipedReader>
+            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(
+                args,
+                props,
+                altout,
+                alterr,
+                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 vat {
+                to getEvalServerRcvr() :any {evalServerRcvr}
+                to getInterp()        :near {altInterp}
+                to getRunner()        :near {runner}
+                to stdoutReader()     :near {altoutReader}
+                to stderrReader()     :near {alterrReader}
+            }
         }
-
-        def [altout, altoutReader] := ioPairMaker()
-        def [alterr, alterrReader] := ioPairMaker()
-
-        def runner := RunnerMaker newHeadless(vatName)
-        def sacrificial := TwineFeederMaker new("")
-        def altInterp := InterpMaker make(
-            args,
-            props,
-            altout,
-            alterr,
-            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 vat {
-            to getEvalServerRcvr() :any {evalServerRcvr}
-            to getInterp()        :near {altInterp}
-            to getRunner()        :near {runner}
-            to stdoutReader()     :near {altoutReader}
-            to stderrReader()     :near {alterrReader}
+        to newScriptEvaluatorRcvr(args, props, vatName) :any {
+            def vat := evalServerMaker newVat(args, props, vatName)
+            def evalServerRcvr := vat getEvalServerRcvr()
+            evalServerRcvr <- newScriptEvaluator(args)
         }
     }
 }



1.13      +195 -99   e/src/esrc/scripts/updoc.e

Index: updoc.e
===================================================================
RCS file: /cvs/e/src/esrc/scripts/updoc.e,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- updoc.e	2001/09/09 07:57:02	1.12
+++ updoc.e	2001/09/10 00:06:51	1.13
@@ -1,10 +1,9 @@
 #!/usr/bin/env e
 
-def traceln(str) { println(`updoc $str`) }
+def traceln(str) { println("\n", `updoc $str`) }
 # def traceln(str) {}
+traceln("started")
 
-traceln("cp1")
-
 def EParser := <import:org.erights.e.elang.syntax.EParser>
 def ScopeSetup := <unsafe:org.erights.e.elang.interp.ScopeSetup>
 def trimLines := <import:org.erights.e.tools.text.trimLines>
@@ -12,14 +11,13 @@
 def URLMaker := <unsafe:java.net.URL>
 def URL := URLMaker asType()
 def SyntaxException :=
-    <unsafe:org.erights.e.elang.syntax.SyntaxException> asType()
+  <unsafe:org.erights.e.elang.syntax.SyntaxException> asType()
 def html2txt := <import:org.erights.e.tools.html.html2txt>
 def integerMaker := <import:java.math.BigInteger>
+def cmd__uriGetter := <import:org.erights.e.elang.cmd.*>
 
 def updocParserMaker
 
-traceln("cp2")
-
 def foldLines(lines) :any { trimLines(lines) replaceAll("\\\n", "") }
 
 # Prints an output record
@@ -34,7 +32,7 @@
 }
 
 # A <tt>testCase</tt> object re-evaluates an expression to see how the
-# new answers compare with the original answers.  <p> 
+# new answers compare with the original answers.  <p>
 #
 # A <tt>testCase</tt> object is initialized with an expression and
 # original answers.  The test proceeds by evaluating the expression
@@ -46,7 +44,7 @@
 
 class testCaseMaker(expr, origAnswers) :any {
     var newAnswers := null
-
+    
     def printExpr(expr, out) {
         # remove last newline so indent does not print it
         def shortExpr := withoutSuffix(expr, "\n")
@@ -54,9 +52,9 @@
         # blank line for removed newline
         out println()
     }
-
+    
     # <tt>printAnswers</tt> prints formatted answers.
-
+    
     def printAnswers(answers, out) {
         for keyword => answer in answers {
             # remove last newline so indent does not print it
@@ -70,12 +68,12 @@
             out println()
         }
     }
-
+    
     def testCase {
-
+        
         # <tt>printOn</tt> prints the expression, original answers,
         # and if they exist, new answers.
-
+        
         to printOn(out) {
             printExpr(expr, out)
             printAnswers(origAnswers, out)
@@ -83,7 +81,7 @@
                 printAnswers(newAnswers, out)
             }
         }
-
+        
         to printDiffsOn(out) {
             # Only prints the first time
             var exprPrinted := false
@@ -98,7 +96,7 @@
                     exprPrinted := true
                 }
             }
-
+            
             for keyword => answer in origAnswers {
                 def optNewAnswer := newAnswers get(keyword, null)
                 if (optNewAnswer == null) {
@@ -127,14 +125,11 @@
                 out print(".")
             }
         }
-
-        # <tt>runTest</tt> evaluates an expression and remembers the
-        # new answers. 
-
+        
         to newReportVow(scriptEvaluatorRcvr) :any {
             scriptEvaluatorRcvr <- evalCmdVow(expr)
         }
-
+        
         to report(newReport, out) {
             def parser := updocParserMaker new(newReport)
             newAnswers := parser readAnswers()
@@ -143,32 +138,62 @@
     }
 }
 
-# <tt>testScriptMaker</tt> makes a test script for running a list of
-# test cases. 
-#
-# @author <a href="mailto:tstanley@cocoon.com">Terry Stanley</a>
-# @author <a href="mailto:markm@caplet.com">Mark Miller</a>
-
-class testScriptMaker(cases) :any {
-    def testScript {
-
-        #<tt>printOn</tt>XXX
+def metaCaseMaker {
+    to new(name) :any {
+        def metaNewVat {
+            to printOn(out) {
+                out lnPrint(`?? in new vat $name`)
+                out println()
+            }
+            
+            to getScriptEvaluatorRcvr(vatMap, evalServerMaker) :any {
+                def seRcvr :=
+                  evalServerMaker newScriptEvaluatorRcvr([],
+                                                         interp getProps(),
+                                                         name)
+                vatMap put(name, seRcvr, true)
+                seRcvr
+            }
+        }
+    }
+    to switcher(name) :any {
+        def metaSwitchVat {
+            to printOn(out) {
+                out lnPrint(`?? in vat $name`)
+                out println()
+            }
+            
+            to getScriptEvaluatorRcvr(vatMap, evalServerMaker) :any {
+                vatMap[name]
+            }
+        }
+    }
+}
 
+class testRunMaker(metaCase, cases) :any {
+    def testRun {
+        
         to printOn(out) {
+            metaCase printOn(out)
             for testCase in cases {
-                testCase printDiffsOn(out)
+                testCase printOn(out)
             }
         }
-
-        # <tt>runTest</tt> runs a list of test cases in sequence. 
+        
+        # <tt>runTest</tt> runs a list of test cases in sequence in some vat
+        # which it makes or switches to.
         # <p>
-        # The test cases in the script are run in sequence in the same scope,
+        # The test cases in the testRun are run in sequence in the same scope,
         # so that each test case sees the scope as affected by previous cases.
-
-        to runTest(scriptEvaluatorRcvr, out) {
+        
+        to runTestVow(vatMap, evalServerMaker, out) :any {
+            def [resultVow, resolver] := PromiseMaker()
+            def scriptEvaluatorRcvr :=
+              metaCase getScriptEvaluatorRcvr(vatMap, evalServerMaker)
             def newReportVowList := [] diverge()
             for testCase in cases {
-                newReportVowList push(testCase newReportVow(scriptEvaluatorRcvr))
+                def reportVow := testCase newReportVow(scriptEvaluatorRcvr)
+                newReportVowList push(reportVow)
             }
             def newReportVows := newReportVowList snapshot()
             def doWhen(i) {
@@ -180,22 +205,63 @@
                     } finally {
                         doWhen(i+1)
                     }
+                } else {
+                    resolver resolve(null)
                 }
             }
             doWhen(0)
+            resultVow
         }
-
-        to size() :integer { cases size() }
     }
 }
 
-traceln("cp3")
+# <tt>testScriptMaker</tt> makes a test script for running a list of
+# test cases.
+#
+# @author <a href="mailto:tstanley@cocoon.com">Terry Stanley</a>
+# @author <a href="mailto:markm@caplet.com">Mark Miller</a>
 
+class testScriptMaker(testRuns) :any {
+    def testScript {
+        
+        #<tt>printOn</tt>XXX
+        
+        to printOn(out) {
+            for testRun in testRuns {
+                testRun printOn(out)
+            }
+        }
+        
+        to runTestVow(evalServerMaker, out) :any {
+            def [resultVow, resolver] := PromiseMaker()
+            # maps names to scriptEvaluatorRcvrs
+            def vatMap := [] asMap() diverge()
+            def doRun(i) {
+                if (i < testRuns size()) {
+                    def runDoneVow :=
+                      testRuns[i] runTestVow(vatMap,
+                                             evalServerMaker,
+                                             out)
+                    Ref whenResolved(runDoneVow, def done(_) {
+                        doRun(i+1)
+                    })
+                } else {
+                    resolver resolve(null)
+                }
+            }
+            doRun(0)
+            resultVow
+        }
+        
+        to size() :integer { testRuns size() }
+    }
+}
+
 # <tt>updocParser</tt> parses <tt>updoc</tt> files into test cases
-# that constitute a test script to run. 
+# that constitute a test script to run.
 # <p>
 # Each test case has an expression and the original answers to the
-# evaluation of that expression. 
+# evaluation of that expression.
 # <p>
 # For example, parsing the following <tt>updoc</tt> source,
 # <pre>
@@ -205,7 +271,7 @@
 # results in a <tt>testCase</tt> object whose expression is
 # <tt>"def x := 2 + 3"</tt> and whose answer has the key
 # <tt>"value"</tt> and body <tt>"5"</tt>. Notice that the updoc syntax
-# ("?", ">", "#") is removed. Expressions can have multiple answers. 
+# ("?", ">", "#") is removed. Expressions can have multiple answers.
 # <p>
 # <tt>updocParser</tt> recognizes single line expressions and answers, such as,
 # <pre>
@@ -227,10 +293,10 @@
 # @author <a href="mailto:markm@caplet.com">Mark Miller</a>
 
 class bind updocParserMaker(testSrc) :any {
-
+    
     def lines := testSrc split("\n")
     var index := 0
-
+    
     # <tt>readExpr</tt> reads a single or multi-line expression.
     # <p>
     # It expects the formats shown below.
@@ -243,7 +309,7 @@
     #     >     printAnswers(answers, out)
     #     > }
     # </pre>
-
+    
     def readExpr() :any {
         var result := ""
         var current := lines[index] trim()
@@ -255,20 +321,20 @@
             }
             # put back newline removed by split
             result += current + "\n"
-
+            
             index += 1
             if (index >= lines size()) {
                 break()
             }
             current := lines[index] trim()
-
+            
             if (! (current startsWith(">"))) {
                 break()
             }
         }
         result
     }
-
+    
     # <tt>readOptAnswer</tt> reads a single or multi-line answer.
     # <p>
     # It expects the formats shown below,
@@ -281,7 +347,7 @@
     #     #        bar"
     # </pre>
     # For answers with the keyword "problem" the stack trace is skipped.
-
+    
     def readOptAnswer() :any {
         escape return {
             var keyword := null
@@ -295,14 +361,14 @@
                 answer += text trim() + "\n"
                 index += 1
                 while (index < lines size() &&
-                       lines[index] trim() =~ `#@rest`) {
+                         lines[index] trim() =~ `#@rest`) {
                     # multi-line answer block
                     def nextLine := rest trim()
                     # skip over the stack trace which can vary from run to run
                     if (nextLine =~ `` && keyword =~ `problem`) {
                         index += 1
                         while (index < lines size() &&
-                               lines[index] trim() =~ `#@_`) {
+                                 lines[index] trim() =~ `#@_`) {
                             index += 1
                         }
                         break()
@@ -317,64 +383,105 @@
             }
         }
     }
-
+    
     # If the current line is blank <tt>readBlankLine</tt> skips over it.
-
+    
     def readBlankLine() {
         if (index < lines size() && lines[index] trim() == "") {
             index += 1
         }
     }
-
+    
+    def readAnswers() :any {
+        def answers := [] asMap() diverge()
+        while (readOptAnswer() =~ [keyword, answer]) {
+            answers[keyword] := answer
+            # blank line follows answer block
+            readBlankLine()
+        }
+        answers snapshot()
+    }
+    
+    def readMetaCase() :any {
+        def current := lines[index] trim()
+        switch (current) {
+            match `?? in new vat @name` {
+                index += 1
+                metaCaseMaker new(name)
+            }
+            match `?? in vat @name` {
+                index += 1
+                metaCaseMaker switcher(name)
+            }
+            match `?@_` {
+                metaCaseMaker new("home")
+            }
+        }
+    }
+    
+    def readTestRun() :any {
+        def current := lines[index] trim()
+        def metaCase := readMetaCase()
+        def cases := [] diverge()
+        while (index < lines size()) {
+            def current := lines[index] trim()
+            if (current startsWith("??")) {
+                break()
+            } else if (current startsWith("?")) {
+                def expr := readExpr()
+                def answers := readAnswers()
+                cases push(testCaseMaker new(expr, answers))
+            } else {
+                index += 1
+            }
+        }
+        testRunMaker new(metaCase, cases snapshot())
+    }
+    
     # <tt>updocParser</tt> reads a list of test cases to make a test script.
     # <p>
     # Each test case is an expression and a set of answers.
-
+    
     def updocParser {
-
+        
         to readAnswers() :any {
-            def answers := [] asMap() diverge()
-            while (readOptAnswer() =~ [keyword, answer]) {
-                answers[keyword] := answer
-                # blank line follows answer block
-                readBlankLine()
-            }
-            answers snapshot()
+            readAnswers()
         }
-
+        
         to readScript() :any {
-            def cases := [] diverge()
+            def testRuns := [] diverge()
             while (index < lines size()) {
                 def current := lines[index] trim()
                 if (current startsWith("?")) {
-                    def expr := readExpr()
-                    def answers := updocParser readAnswers()
-                    cases push(testCaseMaker new(expr, answers))
+                    testRuns push(readTestRun())
                 } else {
                     index += 1
                 }
             }
-            testScriptMaker new(cases snapshot())
+            testScriptMaker new(testRuns snapshot())
         }
     }
 }
 
-traceln("cp4")
-
 # Given the source text string (or twine) of an updoc file, parse, run,
 # and report the test outcomes.
 
-def updocTestSrc(testSrc, scriptEvaluatorRcvr, out) :boolean {
+def updocTestSrc(testSrc, evalServerMaker, out) :boolean {
     try {
         def parser := updocParserMaker new(testSrc)
         def script := parser readScript()
-        script runTest(scriptEvaluatorRcvr, out)
+        script printOn(out)
+        traceln("---")
+        script runTestVow(evalServerMaker, out)
         script size() >= 1
     } catch problem {
         if (problem leaf() =~ sex :SyntaxException) {
             sex report(out)
         } else {
-            printBlock("***script stopped by", "" + problem + "\n", out)
+            printBlock("***script stopped by", "" + problem + "\n" +
+                         problem eStack() + "\n" +
+                         problem javaStack(),
+                       out)
         }
         true
     }
@@ -413,18 +520,14 @@
     }
 }
 
-traceln("cp5")
-
 def eHome := <file: interp getProps()["e.home"]>
 def hashCache := hashCacheMaker new(eHome["updoc-hash-cache.txt"])
 
 
-traceln("cp6")
-
 # Run updoc either on a ".updoc" file, on the text extracted from a
 # ".html" file.
 
-def updocOne(file, path, evalServerRcvr, out) {
+def updocOne(file, path, evalServerMaker, out) {
     def hash := file getCryptoHash()
     if (hashCache has(hash)) {
         out lnPrint(`skipping $path`)
@@ -434,8 +537,7 @@
         # to pass source info through (preserving twine-ness), then
         # switch from getText() to getTwine()
         def testSrc := file getText()
-        def scriptEvaluatorRcvr := evalServerRcvr <- newScriptEvaluator([])
-        if (! (updocTestSrc(testSrc, scriptEvaluatorRcvr, out))) {
+        if (! (updocTestSrc(testSrc, evalServerMaker, out))) {
             hashCache put(hash)
         }
     } else if (endsWithAny(path, [".html", ".htm"])) {
@@ -448,10 +550,9 @@
             out indent("#                  ") print(problem)
             null
         }
-        def scriptEvaluatorRcvr := evalServerRcvr <- newScriptEvaluator([])
         if (testSrc != null &&
-            ! (updocTestSrc(testSrc, scriptEvaluatorRcvr, out))) {
-
+              ! (updocTestSrc(testSrc, evalServerMaker, out))) {
+            
             hashCache put(hash)
         }
     } else {
@@ -459,37 +560,32 @@
     }
 }
 
-traceln("cp7")
-
-def cmd__uriGetter := <import:org.erights.e.elang.cmd.*>
-traceln("cp8")
+traceln("about to go onTheAir")
 introducer onTheAir()
-def evalServerMaker := 
-    <cmd:evalServerMakerAuthor>(unsafe__uriGetter, introducer, println)
-traceln("cp9")
-def vat := evalServerMaker new([], interp getProps(), "updocer")
-traceln("cp10")
-def evalServerRcvr := vat getEvalServerRcvr()
-traceln("cp11")
+traceln("onTheAir")
+
+def evalServerMaker :=
+  <cmd:evalServerMakerAuthor>(unsafe__uriGetter, introducer, println)
 
 # Run updoc either on a ".updoc" file, on the text extracted from a
 # ".html" file, or on all such files in a directory tree, or on a URL.
 
 def updoc(filedir, out) {
     if (filedir =~ url :URL) {
-        updocOne(url, url toExternalForm(), evalServerRcvr, out)
+        updocOne(url, url toExternalForm(), evalServerMaker, out)
     } else if (filedir isDirectory()) {
         throw("XXX not yet implemented")
         # for each in filedir { updoc(each, out) }
         # hashCache checkpoint()
     } else {
-        updocOne(filedir, filedir getPath(), evalServerRcvr, out)
+        updocOne(filedir, filedir getPath(), evalServerMaker, out)
     }
 }
 
 def args := interp getArgs()
 def names := if (args == []) {
-    ["d:/e/doc/elang/intro/finding-text.html"]
+    ["c:/windows/desktop/multi-test.updoc"]
+    # ["d:/e/doc/elang/intro/finding-text.html"]
     # throw("usage: updoc.e files...")
 } else {
     args



1.9       +2 -2      e/src/jsrc/org/erights/e/elang/interp/InteractiveInterp.java

Index: InteractiveInterp.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/interp/InteractiveInterp.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- InteractiveInterp.java	2001/09/08 22:59:20	1.8
+++ InteractiveInterp.java	2001/09/10 00:06:51	1.9
@@ -457,8 +457,8 @@
     {
         ConstList args = ConstList.fromArray(argArray);
         Properties sysProps = System.getProperties();
-        TextWriter outs = new TextWriter(PrintStreamWriter.out());
-        TextWriter errs = new TextWriter(PrintStreamWriter.err());
+        TextWriter outs = new TextWriter(PrintStreamWriter.out(), true);
+        TextWriter errs = new TextWriter(PrintStreamWriter.err(), true);
 
         while (args.size() >= 1) {
             String option = (String)args.get(0);



1.71      +2 -2      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.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- Interp.java	2001/09/08 22:59:20	1.70
+++ Interp.java	2001/09/10 00:06:51	1.71
@@ -568,8 +568,8 @@
     {
         ConstList args = ConstList.fromArray(argArray);
         Properties sysProps = System.getProperties();
-        TextWriter outs = new TextWriter(PrintStreamWriter.out());
-        TextWriter errs = new TextWriter(PrintStreamWriter.err());
+        TextWriter outs = new TextWriter(PrintStreamWriter.out(), true);
+        TextWriter errs = new TextWriter(PrintStreamWriter.err(), true);
 
         while (args.size() >= 1) {
             String option = (String)args.get(0);



1.52      +3 -2      e/src/jsrc/org/erights/e/elang/syntax/ELexer.java

Index: ELexer.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/ELexer.java,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- ELexer.java	2001/09/08 22:59:20	1.51
+++ ELexer.java	2001/09/10 00:06:51	1.52
@@ -1148,7 +1148,7 @@
     static public void main(String[] args)
     throws IOException, SyntaxException {
 
-        TextWriter stdout = new TextWriter(PrintStreamWriter.out());
+        TextWriter stdout = new TextWriter(PrintStreamWriter.out(), true);
         String url;
         BufferedReader ins;
         if (0 == args.length) {
@@ -1172,7 +1172,8 @@
                 } while (t.tokenType() != EParser.EOFTOK);
                 return;
             } catch (SyntaxException sex) {
-                TextWriter err = new TextWriter(PrintStreamWriter.err());
+                TextWriter err = new TextWriter(PrintStreamWriter.err(),
+                                                true);
                 err.indent("# ").print("# ", sex);
                 err.println();
             }



1.2       +14 -2     e/src/jsrc/org/erights/e/elib/eio/TextWriter.java

Index: TextWriter.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/eio/TextWriter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TextWriter.java	2001/09/07 05:49:22	1.1
+++ TextWriter.java	2001/09/10 00:06:52	1.2
@@ -64,13 +64,25 @@
     }
 
     /**
-     * Initial newline defaults to "\n".  autoflush and closes
-     * default to false.
+     * Initial newline defaults to "\n".
+     * autoflush and closes default to false.
      */
     public TextWriter(Writer out) {
         this(out,
              "\n",
              false,
+             false,
+             null);
+    }
+
+    /**
+     * Initial newline defaults to "\n".
+     * closes default to false.
+     */
+    public TextWriter(Writer out, boolean autoflush) {
+        this(out,
+             "\n",
+             autoflush,
              false,
              null);
     }



1.2       +10 -1     e/src/jsrc/org/erights/e/elib/prim/RunnerImpl.java

Index: RunnerImpl.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/RunnerImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RunnerImpl.java	2001/09/08 22:59:21	1.1
+++ RunnerImpl.java	2001/09/10 00:06:52	1.2
@@ -34,7 +34,7 @@
  * @author <a href="mailto:markm@erights.org">Mark S. Miller</a>
  * @author Many improvements due to suggestions by E-Dean Tribble
  */
-/*package*/ final class RunnerImpl extends Runner implements Runnable {
+public final class RunnerImpl extends Runner implements Runnable {
 
     /**
      * The number of Runnables to dequeue and run in one go.
@@ -71,6 +71,15 @@
         myQ = new SynchQueue(Runnable.class);
         myThread = new RunnerThread(this, name);
         myThread.start();
+    }
+
+    /**
+     * Adjusts the priority of the RunnerThread.
+     * <p>
+     * Just delegates to {@link Thread#setPriority(int)}
+     */
+    public void setPriority(int newPriority) {
+        myThread.setPriority(newPriority);
     }
 
     /**



1.25      +1 -1      e/src/jsrc/org/erights/e/elib/prim/tests/ERunDemo.java

Index: ERunDemo.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/tests/ERunDemo.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- ERunDemo.java	2001/09/07 05:49:23	1.24
+++ ERunDemo.java	2001/09/10 00:06:52	1.25
@@ -58,7 +58,7 @@
         TraceController.start(new Properties(System.getProperties()));
 
         //XXX this should use platform newlines rather the "\n"
-        TextWriter stdout = new TextWriter(PrintStreamWriter.out());
+        TextWriter stdout = new TextWriter(PrintStreamWriter.out(), true);
 
         Object[] promise = Ref.promise();
         Ref s = (Ref)promise[0];