[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];