[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elib/prim E.java
markm@eros.cs.jhu.edu
markm@eros.cs.jhu.edu
Fri, 14 Sep 2001 00:55:01 -0400
markm 01/09/14 00:55:01
Modified: src/esrc/org/erights/e/elang/cmd cmdMakerMaker.emaker
src/esrc/scripts evalServer.e updoc.e
src/jsrc Makefile
src/jsrc/org/erights/e/elib/prim E.java
Added: src/jsrc/net/captp/jcomm multi-test.updoc
Log:
better updoc
Revision Changes Path
1.7 +9 -8 e/src/esrc/org/erights/e/elang/cmd/cmdMakerMaker.emaker
Index: cmdMakerMaker.emaker
===================================================================
RCS file: /cvs/e/src/esrc/org/erights/e/elang/cmd/cmdMakerMaker.emaker,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- cmdMakerMaker.emaker 2001/09/14 01:35:21 1.6
+++ cmdMakerMaker.emaker 2001/09/14 04:55:01 1.7
@@ -39,14 +39,10 @@
Ref broken(problem)
}
cmdLoop pushResult(result)
- if (success) {
- # in order to distinguish a successfully returned broken
- # ref from a thrown problem for a disconnect. Also, to enable
- # detection of a successfully returned unresolved reference
- resultRes resolve([result, true])
- } else {
- resultRes resolve([result, false])
- }
+ # in order to distinguish a successfully returned broken
+ # ref from a thrown problem for a disconnect. Also, to enable
+ # detection of a successfully returned unresolved reference
+ resultRes resolve([result, success])
}
when (cmdLoop getExitPairVow()) -> done([exitCode, optProblem]) {
if (null == optProblem) {
@@ -69,6 +65,8 @@
def expr := EParser(sourceCode)
commentBlock(tw, "expansion", expr)
}
+ # XXX Seems kludgy to use cmdValuer in this way. Should refactor,
+ # and make the common logic into an internal function.
cmdValuer()
takeBuf(tw, "stdout", outBuf)
takeBuf(tw, "stderr", errBuf)
@@ -104,6 +102,9 @@
}
match broke ? Ref isBroken(broke) {
reportRes resolve(broke)
+ }
+ match _ {
+ reportRes smash("unrecognized case")
}
}
}
1.5 +6 -1 e/src/esrc/scripts/evalServer.e
Index: evalServer.e
===================================================================
RCS file: /cvs/e/src/esrc/scripts/evalServer.e,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- evalServer.e 2001/09/14 01:35:21 1.4
+++ evalServer.e 2001/09/14 04:55:01 1.5
@@ -1,9 +1,14 @@
def TextWriterMaker := <import:org.erights.e.elib.eio.TextWriter>
def cmd__uriGetter := <import:org.erights.e.elang.cmd.*>
def cmdMakerMaker := <cmd:cmdMakerMaker>
+
+# def traceln(str) { println("\n", `evalServer $str`) }
+def traceln(str) {}
+traceln("started")
+
def SystemGC {
to gc() {
- println("System.gc()")
+ traceln("System.gc()")
<unsafe:java.lang.System> gc()
}
}
1.15 +102 -88 e/src/esrc/scripts/updoc.e
Index: updoc.e
===================================================================
RCS file: /cvs/e/src/esrc/scripts/updoc.e,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- updoc.e 2001/09/14 01:35:21 1.14
+++ updoc.e 2001/09/14 04:55:01 1.15
@@ -1,7 +1,7 @@
#!/usr/bin/env e
-def traceln(str) { println("\n", `updoc $str`) }
-# def traceln(str) {}
+# def traceln(str) { println("\n", `updoc $str`) }
+def traceln(str) {}
traceln("started")
def EParser := <import:org.erights.e.elang.syntax.EParser>
@@ -44,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")
@@ -52,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
@@ -68,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)
@@ -81,7 +81,7 @@
printAnswers(newAnswers, out)
}
}
-
+
to printDiffsOn(out) {
# Only prints the first time
var exprPrinted := false
@@ -96,7 +96,7 @@
exprPrinted := true
}
}
-
+
for keyword => answer in origAnswers {
def optNewAnswer := newAnswers get(keyword, null)
if (optNewAnswer == null) {
@@ -125,11 +125,11 @@
out print(".")
}
}
-
+
to newReportVow(scriptEvaluatorRcvr) :any {
scriptEvaluatorRcvr <- evalCmdReportVow(expr)
}
-
+
to report(newReport, out) {
def parser := updocParserMaker new(newReport)
newAnswers := parser readAnswers()
@@ -145,7 +145,7 @@
out lnPrint(`?? in new vat $name`)
out println()
}
-
+
to getScriptEvaluatorRcvr(vatMap, evalServerMaker) :any {
def seRcvr :=
evalServerMaker newScriptEvaluatorRcvr([],
@@ -162,7 +162,7 @@
out lnPrint(`?? in vat $name`)
out println()
}
-
+
to getScriptEvaluatorRcvr(vatMap, evalServerMaker) :any {
vatMap[name]
}
@@ -172,20 +172,20 @@
class testRunMaker(metaCase, cases) :any {
def testRun {
-
+
to printOn(out) {
metaCase printOn(out)
for testCase in cases {
testCase printOn(out)
}
}
-
+
# <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 testRun are run in sequence in the same scope,
# so that each test case sees the scope as affected by previous cases.
-
+
to runTestVow(vatMap, evalServerMaker, out) :any {
def [resultVow, resolver] := PromiseMaker()
def scriptEvaluatorRcvr :=
@@ -223,15 +223,15 @@
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
@@ -252,7 +252,7 @@
doRun(0)
resultVow
}
-
+
to size() :integer { testRuns size() }
}
}
@@ -293,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.
@@ -309,7 +309,7 @@
# > printAnswers(answers, out)
# > }
# </pre>
-
+
def readExpr() :any {
var result := ""
var current := lines[index] trim()
@@ -321,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,
@@ -347,7 +347,7 @@
# # bar"
# </pre>
# For answers with the keyword "problem" the stack trace is skipped.
-
+
def readOptAnswer() :any {
escape return {
var keyword := null
@@ -383,15 +383,15 @@
}
}
}
-
+
# 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]) {
@@ -401,7 +401,7 @@
}
answers snapshot()
}
-
+
def readMetaCase() :any {
def current := lines[index] trim()
switch (current) {
@@ -418,7 +418,7 @@
}
}
}
-
+
def readTestRun() :any {
def current := lines[index] trim()
def metaCase := readMetaCase()
@@ -437,17 +437,17 @@
}
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 {
readAnswers()
}
-
+
to readScript() :any {
def testRuns := [] diverge()
while (index < lines size()) {
@@ -463,17 +463,44 @@
}
}
+class hashCacheMaker(cacheFile) :any {
+ def myCache := [] asKeys() diverge()
+
+ if (cacheFile exists()) {
+ for line in cacheFile {
+ myCache[integerMaker fromString64(line)] := null
+ }
+ }
+ def hashCache {
+ to has(hash) :boolean { myCache maps(hash) }
+ to put(hash) { myCache[hash] := null }
+ to checkpoint() {
+ def buf := "" diverge(char)
+ for hash => _ in myCache {
+ buf append(hash toString64())
+ buf push('\n')
+ }
+ cacheFile setText(buf snapshot())
+ }
+ }
+}
+
+def eHome := <file: interp getProps()["e.home"]>
+def hashCache := hashCacheMaker new(eHome["updoc-hash-cache.txt"])
+
# Given the source text string (or twine) of an updoc file, parse, run,
# and report the test outcomes.
+# <p>
+# Returns a promise that resolves to null when all test scripts are done.
-def updocTestSrc(testSrc, evalServerMaker, out) :boolean {
+def updocTestSrc(testSrc, hash, evalServerMaker, out) :any {
try {
def parser := updocParserMaker new(testSrc)
def script := parser readScript()
- script printOn(out)
- traceln("---")
+ if (script size() == 0) {
+ hashCache put(hash)
+ }
script runTestVow(evalServerMaker, out)
- script size() >= 1
} catch problem {
if (problem leaf() =~ sex :SyntaxException) {
sex report(out)
@@ -483,7 +510,7 @@
problem javaStack(),
out)
}
- true
+ Ref broken(problem)
}
}
@@ -498,48 +525,24 @@
}
}
-class hashCacheMaker(cacheFile) :any {
- def myCache := [] asKeys() diverge()
-
- if (cacheFile exists()) {
- for line in cacheFile {
- myCache[integerMaker fromString64(line)] := null
- }
- }
- def hashCache {
- to has(hash) :boolean { myCache maps(hash) }
- to put(hash) { myCache[hash] := null }
- to checkpoint() {
- def buf := "" diverge(char)
- for hash => _ in myCache {
- buf append(hash toString64())
- buf push('\n')
- }
- cacheFile setText(buf snapshot())
- }
- }
-}
-def eHome := <file: interp getProps()["e.home"]>
-def hashCache := hashCacheMaker new(eHome["updoc-hash-cache.txt"])
-
-
# Run updoc either on a ".updoc" file, on the text extracted from a
# ".html" file.
+# <p>
+# Returns a promise that resolves to null when the script is done
-def updocOne(file, path, evalServerMaker, out) {
+def updocOne(file, path, evalServerMaker, out) :any {
def hash := file getCryptoHash()
if (hashCache has(hash)) {
out lnPrint(`skipping $path`)
+ null
} else if (endsWithAny(path, [".updoc", ".e", ".emaker", ".txt"])) {
out lnPrint(`$path:`)
# XXX Once E is faster, and the simple__quasiParser is fixed
# to pass source info through (preserving twine-ness), then
# switch from getText() to getTwine()
def testSrc := file getText()
- if (! (updocTestSrc(testSrc, evalServerMaker, out))) {
- hashCache put(hash)
- }
+ updocTestSrc(testSrc, hash, evalServerMaker, out)
} else if (endsWithAny(path, [".html", ".htm"])) {
out lnPrint(`$path:`)
def htmlSrc := file getText()
@@ -550,13 +553,10 @@
out indent("# ") print(problem)
null
}
- if (testSrc != null &&
- ! (updocTestSrc(testSrc, evalServerMaker, out))) {
-
- hashCache put(hash)
- }
+ updocTestSrc(testSrc, hash, evalServerMaker, out)
} else {
out lnPrint(`ignoring $path`)
+ null
}
}
@@ -565,12 +565,15 @@
traceln("onTheAir")
def evalServerMaker :=
- <cmd:evalServerMakerAuthor>(unsafe__uriGetter, introducer, println)
+ <cmd:evalServerMakerAuthor>(unsafe__uriGetter, introducer, traceln)
# 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.
+# <p>
+# Returns a promise that resolves to null when all test scripts in
+# filedir are done.
-def updoc(filedir, out) {
+def updoc(filedir, out) :any {
if (filedir =~ url :URL) {
updocOne(url, url toExternalForm(), evalServerMaker, out)
} else if (filedir isDirectory()) {
@@ -582,27 +585,38 @@
}
}
+
def args := interp getArgs()
def names := if (args == []) {
["c:/windows/desktop/multi-test.updoc"]
# ["d:/e/doc/elang/intro/finding-text.html"]
# throw("usage: updoc.e files...")
-} else {
+} else if (args size() == 1) {
args
+} else {
+ throw("XXX multiple args not yet implemented")
}
+def name := names[0] # XXX for now
+
try {
- for name in names {
- def filedir := try {
- URLMaker new(name)
- } catch problem {
- # XXX Should check that it's a MalformedURLException
- <file: name>
- }
- updoc(filedir, stdout)
+ def filedir := try {
+ URLMaker new(name)
+ } catch problem {
+ # XXX Should check that it's a MalformedURLException
+ <file: name>
}
- stdout println()
+ when (updoc(filedir, stdout)) -> done(_) {
+ stdout println()
+ interp continueAtTop()
+ } catch problem {
+ stdout println()
+ # XXX should be an exitAtTop with error code
+ interp continueAtTop()
+ }
+
} finally {
hashCache checkpoint()
}
+interp blockAtTop()
1.54 +2 -4 e/src/jsrc/Makefile
Index: Makefile
===================================================================
RCS file: /cvs/e/src/jsrc/Makefile,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- Makefile 2001/08/24 22:03:06 1.53
+++ Makefile 2001/09/14 04:55:01 1.54
@@ -15,10 +15,8 @@
setup:
-rm -rf $(TOP)/classes/*
- mkdir -p $(TOP)/classes/org
- cp -r $(TOP)/src/esrc/org/* $(TOP)/classes/org
- mkdir -p $(TOP)/classes/com
- cp -r $(TOP)/src/esrc/com/* $(TOP)/classes/com
+ mkdir -p $(TOP)/classes/
+ cp -r $(TOP)/src/esrc/* $(TOP)/classes/
cp -r $(TOP)/src/bin/resources/* $(TOP)/classes/
-rm -rf `find $(TOP)/classes -name CVS`
(cd $(TOP)/classes; jar xf ../src/bin/jars/hydro.jar)
1.1 e/src/jsrc/net/captp/jcomm/multi-test.updoc
Index: multi-test.updoc
===================================================================
?? in new vat server
Exports 'thing' as the server. 'x' is a server variable the
client can get and set.
? (introducer onTheAir()
> var x := null
> def thing {
> to run() { println("foo") }
> to setX(newX) { x := newX }
> to getX() :any { x }
> }
> def sr := sturdyRef(thing, timer now() + 3_600_000)
> def uri := introducer sturdyToURI(sr)
> <c:/windows/desktop/thing.cap> setText(uri); uri)
# match: "cap://*/*/*/*"
? x
?? in new vat client
Import a remote reference to the 'thing' server
? (introducer onTheAir()
> def uri := <c:/windows/desktop/thing.cap> getText() trim()
> def sr := introducer sturdyFromURI(uri)
> uri)
# match: "cap://*/*/*/*"
? def farThing := sr promiseRef()
# value: <Eventual ref>
? def result := farThing <- ()
# value: <Eventual ref>
Wait until the result is resolved before continuing the
test script.
? interp waitAtTop(result)
? result == null
# value: true
?? in vat server
?
# stdout: foo
#
? x
?? in vat client
Export an unresolved LocalPromise
? def [p,r] := PromiseMaker()
# value: [<Eventual ref>, <Open Resolver>]
? farThing <- setX(p)
# value: <Eventual ref>
?? in vat server
? x
# value: <Eventual ref>
Send a message to an unresolved imported RemotePromise
? def y := x <- add(3)
# value: <Eventual ref>
?? in vat client
Resolve the exported LocalPromise
? r resolve(2)
?? in vat server
Check that the RemotePromise resolved
? interp waitAtTop(x)
? x
# value: 2
Check that the pending message was processed.
? interp waitAtTop(y)
? y
# value: 5
?? in vat client
Sending an imported reference as argument...
? def res2 := farThing <- setX(farThing)
# value: <Eventual ref>
? interp waitAtTop(res2)
? res2
?? in vat server
? x
# value: <thing>
...the argument as received is the same as what was exported
? thing == x
# value: true
1.58 +1 -0 e/src/jsrc/org/erights/e/elib/prim/E.java
Index: E.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/prim/E.java,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -r1.57 -r1.58
--- E.java 2001/09/07 05:49:22 1.57
+++ E.java 2001/09/14 04:55:01 1.58
@@ -555,6 +555,7 @@
Class targType,
OneArgFunc optEjector)
{
+ specimen = Ref.resolution(specimen);
if (null == specimen && ! targType.isPrimitive()) {
return null;
}