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