Re: Embed E in Java

Kevin Reid <[email protected]>
Newsgroups gmane.comp.lang.e.general
Message-ID <[email protected]>
On Oct 21, 2009, at 13:25, Mark Miller wrote:
> On Tue, Oct 20, 2009 at 9:17 AM, Kevin Reid <[email protected]> wrote:
>> MarkM: Is there a non-historical reason NestedException/
>> NestedThrowable/etc exist instead of using the Java 1.4
>> Throwable.getCause() mechanism?
>
> Mostly history. The NestedException,.. mechanism predates Java 1.4.
> Since it worked, I have never examined the new getCause() API. I do
> not know whether or not it would be safe to use instead.

[rest of thread omitted]

Here's my draft patch for this. Please review.

It makes the following changes:

* NestedException and NestedIOException now use the Throwable cause  
field to store the provided exception. (The constructor parameter  
order is backwards from the Java conventional one, but I decided not  
to make the effort to change that.)

* Deleted NestedError, as that class was not used.

* Renamed Nested* to EBacktrace*, reflecting the primary use of these  
classes since 'nesting' is now in general possible with plain Java  
throwables. (I'm not sure this is a good idea.)

* Enabled getCause() and initCause(throwable) in Throwable.safej. (I  
also noticed that printStackTrace() is enabled, but should not be, as  
it carries authority to stderr; I intend to fix this as a separate  
commit.)



-- 
Kevin Reid                                  <http://switchb.org/kpreid/>

_______________________________________________
e-lang mailing list
[email protected]
http://www.eros-os.org/mailman/listinfo/e-lang
nested-exception-renamed-and-uses-cause-20090112.patch (application/octet-stream, 57.5 KB)
Index: safej/java/lang/Throwable.safej
===================================================================
--- safej/java/lang/Throwable.safej	(revision 721)
+++ safej/java/lang/Throwable.safej	(working copy)
@@ -9,9 +9,11 @@
       statics(method("run()"),
               method("run(String)")),
       methods(method("fillInStackTrace()"),
+              method("getCause()"),
               method("getLocalizedMessage()"),
               method("getMessage()"),
               method("getStackTrace()"),
+              method("initCause(Throwable)"),
               method("printStackTrace()"),
               method("printStackTrace(PrintStream)"),
               method("printStackTrace(PrintWriter)")))
Index: esrc/scripts/test/updoc/nested-throwable.updoc
===================================================================
--- esrc/scripts/test/updoc/nested-throwable.updoc	(revision 0)
+++ esrc/scripts/test/updoc/nested-throwable.updoc	(revision 0)
@@ -0,0 +1,247 @@
+# Copyright 2010 Kevin Reid, under the terms of the MIT X license
+# found at http://www.opensource.org/licenses/mit-license.html ................
+
+As of r721 (2010-01-12), E-on-Java has a mechanism for wrapping throwables with other throwables (the NestedThrowable interface, and classes implementing), invented before java.lang.Throwable gained the 'cause' facility (Java 1.4). These two are now being integrated. Additionally, Nested* have been renamed to EBacktrace* to reflect their sole purpose now that the "nesting" concept is in core Java. This file contains tests written to confirm that no external/programmer-visible behavior has not changed as a result of this, and that the cause-related methods are usable from E.
+
+
+We're going to be looking at stack traces, so this print-func alteration avoids showing changes to pathnames.
+
+  ? def makeTextWriter := <elib:oldeio.makeTextWriter>
+  > interp.setPrintFunc({
+  >   def oldPrint := interp.getPrintFunc()
+  >   def newPrint(value, out) {
+  >     def [tw, sb] := makeTextWriter.makeBufferingPair()
+  >     oldPrint(value, tw)
+  >     var string := sb.snapshot()
+  >     # XXX messy, E needs a proper regexp-substitute operation
+  >     while (string =~ rx`(?s)(@left.*?)<file:(?:[^>]*?)/(@fname[^>/#]*)#(?:[a-z:0-9]+?)>(@right.*)`) {
+  >        string := `$left<file:.../$fname#...>$right`
+  >     }
+  >     while (string =~ rx`(?s)(@left.*?)\((@fname[\w$$]+.java):\d+\)(@right.*)`) {
+  >        string := `$left($fname:...)$right`
+  >     }
+  >     while (string =~ rx`(?s)(@left.*?)GeneratedMethodAccessor\d+(@right.*)`) {
+  >        string := `${left}GeneratedMethodAccessor...$right`
+  >     }
+  >     out.print(string)
+  >   }
+  > })
+
+An exception value to test with.
+
+  ? def anEInterpException := try {
+  >   throw("bang")
+  > } catch e {
+  >   e
+  > }
+  # value: problem: bang
+  
+  ? anEInterpException.__getAllegedType()
+  # value: EBacktraceException
+  
+  ? anEInterpException.getMessage()
+  # value: "@ run/1: <file:.../nested-throwable.updoc#...>"
+  
+(Yes, these values will need revision as the E interp and other things change. Sorry!)
+  
+  ? anEInterpException.eStack()
+  # value: "
+  #        - Thrower#run(RuntimeException)
+  #        . throw(\"bang\")
+  #        @ run/1: <file:.../nested-throwable.updoc#...>"
+  
+  ? anEInterpException.javaStack()
+  # value: "java.lang.RuntimeException: bang
+  #        \tat org.erights.e.meta.java.lang.ThrowableGuardSugar.subCoerceR(ThrowableGuardSugar.java:...)
+  #        \tat org.erights.e.elib.base.ClassDesc.tryCoerceR(ClassDesc.java:...)
+  #        \tat org.erights.e.elib.slot.BaseAuditor.coerce(BaseAuditor.java:...)
+  #        \tat org.erights.e.elib.prim.E.as(E.java:...)
+  #        \tat org.erights.e.elib.prim.JavaMemberNode.coerceArgs(JavaMemberNode.java:...)
+  #        \tat org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #        \tat org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EExpr.eval(EExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EExpr.evalToPair(EExpr.java:...)
+  #        \tat sun.reflect.GeneratedMethodAccessor....invoke(Unknown Source)
+  #        \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:...)
+  #        \tat java.lang.reflect.Method.invoke(Method.java:...)
+  #        \tat org.erights.e.elib.prim.InstanceMethodNode.innerExecute(InstanceMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #        \tat org.erights.e.elang.evm.FinallyExpr.subEval(FinallyExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #        \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #        \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:...)
+  #        \tat org.erights.e.elang.evm.IfExpr.subEval(IfExpr.java:...)
+  #        \tat org.erights.e.elang.evm.IfExpr.subEval(IfExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #        \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.E.callAll(E.java:...)
+  #        \tat org.erights.e.elib.vat.PendingDelivery.innerRun(PendingDelivery.java:...)
+  #        \tat org.erights.e.elib.vat.PendingEvent.run(PendingEvent.java:...)
+  #        \tat org.erights.e.elib.vat.HeadlessRunner.run(HeadlessRunner.java:...)
+  #        \tat java.lang.Thread.run(Thread.java:...)
+  #        "
+
+  ? anEInterpException.unwrap().__getAllegedType()
+  # value: EBacktraceException
+  
+  ? anEInterpException.unwrap().getMessage()
+  # value: ". throw(\"bang\")"
+  
+  ? anEInterpException.leaf().__getAllegedType()
+  # value: RuntimeException
+  
+  ? anEInterpException.leaf().getMessage()
+  # value: "bang"
+
+Note that unwrap() is superseded by getCause(), but leaf()'s functionality is unique. Furthermore, on consideration I (Kevin Reid) decided that (XXX review if this is still true) leaf() should not unwrap more things than it used to; therefore it still has the explicit unwrapping functionality.
+  
+OK, now that that's been established, on to testing existing things which (before the transition) mentioned Nested*, unwrap(), or leaf().
+
+com.skyhunter.e.util.stackTraceFunc
+
+  ? def stackTraceFunc := <import:com.skyhunter.e.util.stackTraceFunc>
+  > stackTraceFunc(anEInterpException)
+  # value: "
+  #        - Thrower#run(RuntimeException)
+  #        . throw(\"bang\")
+  #        @ run/1: <file:.../nested-throwable.updoc#...>
+  #  
+  #        java.lang.RuntimeException: bang
+  #        \tat org.erights.e.meta.java.lang.ThrowableGuardSugar.subCoerceR(ThrowableGuardSugar.java:...)
+  #        \tat org.erights.e.elib.base.ClassDesc.tryCoerceR(ClassDesc.java:...)
+  #        \tat org.erights.e.elib.slot.BaseAuditor.coerce(BaseAuditor.java:...)
+  #        \tat org.erights.e.elib.prim.E.as(E.java:...)
+  #        \tat org.erights.e.elib.prim.JavaMemberNode.coerceArgs(JavaMemberNode.java:...)
+  #        \tat org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #        \tat org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EExpr.eval(EExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EExpr.evalToPair(EExpr.java:...)
+  #        \tat sun.reflect.GeneratedMethodAccessor....invoke(Unknown Source)
+  #        \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:...)
+  #        \tat java.lang.reflect.Method.invoke(Method.java:...)
+  #        \tat org.erights.e.elib.prim.InstanceMethodNode.innerExecute(InstanceMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #        \tat org.erights.e.elang.evm.FinallyExpr.subEval(FinallyExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #        \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #        \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #        \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:...)
+  #        \tat org.erights.e.elang.evm.IfExpr.subEval(IfExpr.java:...)
+  #        \tat org.erights.e.elang.evm.IfExpr.subEval(IfExpr.java:...)
+  #        \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #        \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #        \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #        \tat org.erights.e.elib.prim.E.callAll(E.java:...)
+  #        \tat org.erights.e.elib.vat.PendingDelivery.innerRun(PendingDelivery.java:...)
+  #        \tat org.erights.e.elib.vat.PendingEvent.run(PendingEvent.java:...)
+  #        \tat org.erights.e.elib.vat.HeadlessRunner.run(HeadlessRunner.java:...)
+  #        \tat java.lang.Thread.run(Thread.java:...)
+  #        "
+  
+org.erights.e.elang.cmd.makeAnswerer
+
+  ? def makeAnswerer := <import:org.erights.e.elang.cmd.makeAnswerer>
+  > def [tw, sb] := makeTextWriter.makeBufferingPair()
+  > def answerer := makeAnswerer(tw)
+  > answerer.reportProblem(anEInterpException, true, true)
+  > sb.snapshot()
+  # value: "# problem: bang
+  #         #
+  #         #   java.lang.RuntimeException: bang
+  #         #   \tat org.erights.e.meta.java.lang.ThrowableGuardSugar.subCoerceR(ThrowableGuardSugar.java:...)
+  #         #   \tat org.erights.e.elib.base.ClassDesc.tryCoerceR(ClassDesc.java:...)
+  #         #   \tat org.erights.e.elib.slot.BaseAuditor.coerce(BaseAuditor.java:...)
+  #         #   \tat org.erights.e.elib.prim.E.as(E.java:...)
+  #         #   \tat org.erights.e.elib.prim.JavaMemberNode.coerceArgs(JavaMemberNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #         #   \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.EExpr.eval(EExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.EExpr.evalToPair(EExpr.java:...)
+  #         #   \tat sun.reflect.GeneratedMethodAccessor....invoke(Unknown Source)
+  #         #   \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:...)
+  #         #   \tat java.lang.reflect.Method.invoke(Method.java:...)
+  #         #   \tat org.erights.e.elib.prim.InstanceMethodNode.innerExecute(InstanceMethodNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #         #   \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.FinallyExpr.subEval(FinallyExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #         #   \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #         #   \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #         #   \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.Selector.callIt(Selector.java:...)
+  #         #   \tat org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.CatchExpr.subEval(CatchExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.IfExpr.subEval(IfExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.IfExpr.subEval(IfExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:...)
+  #         #   \tat org.erights.e.elang.evm.EMethod.execute(EMethod.java:...)
+  #         #   \tat org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:...)
+  #         #   \tat org.erights.e.elib.prim.E.callAll(E.java:...)
+  #         #   \tat org.erights.e.elib.vat.PendingDelivery.innerRun(PendingDelivery.java:...)
+  #         #   \tat org.erights.e.elib.vat.PendingEvent.run(PendingEvent.java:...)
+  #         #   \tat org.erights.e.elib.vat.HeadlessRunner.run(HeadlessRunner.java:...)
+  #         #   \tat java.lang.Thread.run(Thread.java:...)
+  #         #
+  #         #   - Thrower#run(RuntimeException)
+  #         #   . throw(\"bang\")
+  #         #   @ run/1: <file:.../nested-throwable.updoc#...>
+  #  
+  #         "
+  
+
+eBrowser.* problemReporterMaker matches SyntaxExceptions: can't test this in updoc because it's intertwined in GUI code. The effect should be to jump to the location of a syntax error.
+
+parseAndPlay in updoc.e matches SyntaxExceptions: the effect should be that syntax exceptions there don't show backtraces.
+

Property changes on: esrc/scripts/test/updoc/nested-throwable.updoc
___________________________________________________________________
Added: svn:eol-style
   + native

Index: jsrc/net/captp/jcomm/CapTPConnection.java
===================================================================
--- jsrc/net/captp/jcomm/CapTPConnection.java	(revision 721)
+++ jsrc/net/captp/jcomm/CapTPConnection.java	(working copy)
@@ -33,7 +33,7 @@
 import net.vattp.security.ESecureRandom;
 import org.erights.e.develop.assertion.T;
 import org.erights.e.develop.exception.ExceptionMgr;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.trace.Trace;
 import org.erights.e.elib.prim.E;
 import org.erights.e.elib.ref.DelayedRedirector;
@@ -1184,7 +1184,7 @@
     public void connectionDead(VatTPConnection dataConn, Throwable problem) {
         T.require(dataConn == myDataConnection,
                   "dead VatTPConnection doesn't match");
-        killConnection(new NestedException(problem, "# lost " + dataConn),
+        killConnection(new EBacktraceException(problem, "# lost " + dataConn),
                        myShuttingDownFlag);
     }
 
Index: jsrc/net/vattp/security/MicroTime.java
===================================================================
--- jsrc/net/vattp/security/MicroTime.java	(revision 721)
+++ jsrc/net/vattp/security/MicroTime.java	(working copy)
@@ -19,7 +19,7 @@
 Contributor(s): ______________________________________.
 */
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.prim.E;
 import org.erights.e.elib.prim.StaticMaker;
 import org.erights.e.elib.util.ClassCache;
@@ -48,7 +48,7 @@
             //PrintStreamWriter.err().println("not using native timers: " +
             //                                ule);
         } catch (ClassNotFoundException cnf) {
-            throw new NestedException(cnf, "# no Native");
+            throw new EBacktraceException(cnf, "# no Native");
         }
         initializeTimer();
     }
Index: jsrc/net/vattp/data/Encrypt3DES.java
===================================================================
--- jsrc/net/vattp/data/Encrypt3DES.java	(revision 721)
+++ jsrc/net/vattp/data/Encrypt3DES.java	(working copy)
@@ -22,7 +22,7 @@
 
 import net.vattp.security.MicroTime;
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.trace.Trace;
 
 import java.security.InvalidKeyException;
@@ -64,7 +64,7 @@
             myDes3.initEncrypt(key);
         } catch (InvalidKeyException ike) {
             Trace.comm.errorm("Problem initializing DES keys", ike);
-            throw new NestedException(ike, "# Problem initializing DES keys");
+            throw new EBacktraceException(ike, "# Problem initializing DES keys");
         }
         System.arraycopy(myIV, 0, myPreviousBlock, 0, 8);
     }
Index: jsrc/net/vattp/data/SendThread.java
===================================================================
--- jsrc/net/vattp/data/SendThread.java	(revision 721)
+++ jsrc/net/vattp/data/SendThread.java	(working copy)
@@ -25,7 +25,7 @@
 
 import net.vattp.security.MicroTime;
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedIOException;
+import org.erights.e.develop.exception.EBacktraceIOException;
 import org.erights.e.develop.trace.Trace;
 import org.erights.e.elib.util.HexStringUtils;
 import org.erights.e.elib.vat.SynchQueue;
@@ -573,7 +573,7 @@
                     myAddressesTried.put(remoteInetAddress, remoteInetAddress);
                     throw he;
                 } catch (BindException be) {
-                    throw new NestedIOException(be,
+                    throw new EBacktraceIOException(be,
                                                 "BindException binding to " +
                                                   remoteNetAddr);
                 }
Index: jsrc/net/vattp/data/Decrypt3DES.java
===================================================================
--- jsrc/net/vattp/data/Decrypt3DES.java	(revision 721)
+++ jsrc/net/vattp/data/Decrypt3DES.java	(working copy)
@@ -22,7 +22,7 @@
 
 import net.vattp.security.MicroTime;
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.trace.Trace;
 
 import java.security.InvalidKeyException;
@@ -64,7 +64,7 @@
             myDes3.initDecrypt(key);
         } catch (InvalidKeyException ike) {
             Trace.comm.errorm("Problem initializing DES keys", ike);
-            throw new NestedException(ike, "# Problem initializing DES keys");
+            throw new EBacktraceException(ike, "# Problem initializing DES keys");
         }
     }
 
Index: jsrc/org/quasiliteral/html/SafeHTMLParser.java
===================================================================
--- jsrc/org/quasiliteral/html/SafeHTMLParser.java	(revision 721)
+++ jsrc/org/quasiliteral/html/SafeHTMLParser.java	(working copy)
@@ -2,7 +2,7 @@
 
 import org.erights.e.develop.assertion.T;
 import org.erights.e.develop.exception.ExceptionMgr;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.format.StringHelper;
 import org.erights.e.elib.base.ValueThunk;
 import org.erights.e.elib.tables.ConstMap;
@@ -10,7 +10,6 @@
 import org.erights.e.elib.tables.FlexMap;
 import org.erights.e.elib.tables.FlexSet;
 
-import javax.swing.JEditorPane;
 import javax.swing.text.ChangedCharSetException;
 import javax.swing.text.html.parser.AttributeList;
 import javax.swing.text.html.parser.DTD;
@@ -107,7 +106,7 @@
         try {
             make(text).parse(new StringReader(text));
         } catch (Throwable th) {
-            throw new NestedException(th, "# unsafe html: " + text);
+            throw new EBacktraceException(th, "# unsafe html: " + text);
         }
     }
 
Index: jsrc/org/quasiliteral/text/EYaccFixer.java
===================================================================
--- jsrc/org/quasiliteral/text/EYaccFixer.java	(revision 721)
+++ jsrc/org/quasiliteral/text/EYaccFixer.java	(working copy)
@@ -71,7 +71,7 @@
             "            T.fail(rName + \" bad checkhash: \" +\n" +
             "                                       hash);\n" + "        }\n" +
             "    } catch (Exception ex) {\n" +
-            "        throw new NestedException(ex, \"# initing parser\");\n" +
+            "        throw new EBacktraceException(ex, \"# initing parser\");\n" +
             "    }\n" + "}\n\n" + "${3}int yyparse() ${4}"));
     }
 
Index: jsrc/org/quasiliteral/term/GrammarParser.java
===================================================================
--- jsrc/org/quasiliteral/term/GrammarParser.java	(revision 721)
+++ jsrc/org/quasiliteral/term/GrammarParser.java	(working copy)
@@ -11,7 +11,7 @@
 //#line 16 "grammar.y"
 package org.quasiliteral.term;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.Twine;
 import org.erights.e.meta.java.lang.CharacterMakerSugar;
@@ -448,7 +448,7 @@
         GrammarParser parser = new GrammarParser(lexer, builder);
         return parser.parse();
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/org/quasiliteral/term/grammar.y
===================================================================
--- jsrc/org/quasiliteral/term/grammar.y	(revision 721)
+++ jsrc/org/quasiliteral/term/grammar.y	(working copy)
@@ -15,7 +15,7 @@
 %{
 package org.quasiliteral.term;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.Twine;
 import org.erights.e.meta.java.lang.CharacterMakerSugar;
@@ -224,7 +224,7 @@
         GrammarParser parser = new GrammarParser(lexer, builder);
         return parser.parse();
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/org/quasiliteral/term/TermParser.java
===================================================================
--- jsrc/org/quasiliteral/term/TermParser.java	(revision 721)
+++ jsrc/org/quasiliteral/term/TermParser.java	(working copy)
@@ -11,7 +11,7 @@
 //#line 9 "term.y"
 package org.quasiliteral.term;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.Twine;
 import org.erights.e.meta.java.lang.CharacterMakerSugar;
@@ -477,7 +477,7 @@
         TermParser parser = new TermParser(lexer, builder);
         return parser.parse();
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/org/quasiliteral/term/term.y
===================================================================
--- jsrc/org/quasiliteral/term/term.y	(revision 721)
+++ jsrc/org/quasiliteral/term/term.y	(working copy)
@@ -8,7 +8,7 @@
 %{
 package org.quasiliteral.term;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.Twine;
 import org.erights.e.meta.java.lang.CharacterMakerSugar;
@@ -277,7 +277,7 @@
         TermParser parser = new TermParser(lexer, builder);
         return parser.parse();
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/org/erights/e/elang/interp/ImportLoader.java
===================================================================
--- jsrc/org/erights/e/elang/interp/ImportLoader.java	(revision 721)
+++ jsrc/org/erights/e/elang/interp/ImportLoader.java	(working copy)
@@ -20,7 +20,7 @@
 */
 
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.trace.Trace;
 import org.erights.e.elang.evm.EExpr;
 import org.erights.e.elang.scope.Scope;
@@ -121,7 +121,7 @@
             try {
                 return URLSugar.getTwine(resource);
             } catch (IOException ioe) {
-                throw new NestedException(ioe, "# getting E source");
+                throw new EBacktraceException(ioe, "# getting E source");
             }
         }
     }
Index: jsrc/org/erights/e/elang/syntax/EParser.java
===================================================================
--- jsrc/org/erights/e/elang/syntax/EParser.java	(revision 721)
+++ jsrc/org/erights/e/elang/syntax/EParser.java	(working copy)
@@ -12,7 +12,7 @@
 //#line 30 "e.y"
 package org.erights.e.elang.syntax;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.exception.PrintStreamWriter;
 import org.erights.e.develop.assertion.T;
 import org.erights.e.elang.evm.ENode;
@@ -800,7 +800,7 @@
                                        hash);
         }
     } catch (Exception ex) {
-        throw new NestedException(ex, "# initing parser");
+        throw new EBacktraceException(ex, "# initing parser");
     }
 }
 
@@ -1533,7 +1533,7 @@
         return parser.parse();
 
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/org/erights/e/elang/syntax/e.y
===================================================================
--- jsrc/org/erights/e/elang/syntax/e.y	(revision 721)
+++ jsrc/org/erights/e/elang/syntax/e.y	(working copy)
@@ -29,7 +29,7 @@
 %{
 package org.erights.e.elang.syntax;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.exception.PrintStreamWriter;
 import org.erights.e.develop.assertion.T;
 import org.erights.e.elang.evm.ENode;
@@ -1755,7 +1755,7 @@
         return parser.parse();
 
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/org/erights/e/elang/syntax/BaseENodeBuilder.java
===================================================================
--- jsrc/org/erights/e/elang/syntax/BaseENodeBuilder.java	(revision 721)
+++ jsrc/org/erights/e/elang/syntax/BaseENodeBuilder.java	(working copy)
@@ -5,7 +5,7 @@
 
 import org.erights.e.develop.assertion.T;
 import org.erights.e.develop.exception.ExceptionMgr;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elang.evm.AssignExpr;
 import org.erights.e.elang.evm.AtomicExpr;
 import org.erights.e.elang.evm.AuditorExprs;
@@ -193,7 +193,7 @@
             if (null == optSpan) {
                 throw sex;
             }
-            throw new NestedException(sex, "@ " + optSpan);
+            throw new EBacktraceException(sex, "@ " + optSpan);
         }
     }
 
Index: jsrc/org/erights/e/elang/evm/ParseNode.java
===================================================================
--- jsrc/org/erights/e/elang/evm/ParseNode.java	(revision 721)
+++ jsrc/org/erights/e/elang/evm/ParseNode.java	(working copy)
@@ -20,7 +20,7 @@
 */
 
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.base.SourceSpan;
 import org.erights.e.elib.oldeio.EPrintable;
 import org.erights.e.elib.oldeio.TextWriter;
@@ -199,7 +199,7 @@
         if (null != optPoser) {
             SourceSpan optSpan = optPoser.myOptSpan;
             if (null != optSpan) {
-                problem = new NestedException(problem, "@ " + optSpan);
+                problem = new EBacktraceException(problem, "@ " + optSpan);
             }
         }
         throw problem;
@@ -266,7 +266,7 @@
         try {
             subPrintOn(tw, PR_START);
         } catch (IOException iox) {
-            throw new NestedException(iox, "# in ParseNode.asText()");
+            throw new EBacktraceException(iox, "# in ParseNode.asText()");
         }
         return sb.toString();
     }
Index: jsrc/org/erights/e/elib/debug/CallCounter.java
===================================================================
--- jsrc/org/erights/e/elib/debug/CallCounter.java	(revision 721)
+++ jsrc/org/erights/e/elib/debug/CallCounter.java	(working copy)
@@ -3,7 +3,7 @@
 // Copyright 2002 Combex, Inc. under the terms of the MIT X license
 // found at http://www.opensource.org/licenses/mit-license.html ...............
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.exception.ThrowableSugar;
 import org.erights.e.elib.base.Ejection;
 import org.erights.e.elib.base.SourceSpan;
@@ -91,7 +91,7 @@
             if (null != myOptSpan) {
                 msg += ": " + myOptSpan;
             }
-            return new NestedException(problem, msg);
+            return new EBacktraceException(problem, msg);
         }
     }
 
Index: jsrc/org/erights/e/elib/prim/StaticMaker.java
===================================================================
--- jsrc/org/erights/e/elib/prim/StaticMaker.java	(revision 721)
+++ jsrc/org/erights/e/elib/prim/StaticMaker.java	(working copy)
@@ -19,11 +19,8 @@
 Contributor(s): ______________________________________.
 */
 
-import java.io.IOException;
-import java.lang.reflect.Modifier;
-
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.base.Callable;
 import org.erights.e.elib.base.ClassDesc;
 import org.erights.e.elib.base.MessageDesc;
@@ -37,10 +34,15 @@
 import org.erights.e.elib.serial.Persistent;
 import org.erights.e.elib.slot.Guard;
 import org.erights.e.elib.tables.ConstList;
+import org.erights.e.elib.tables.EMap;
 import org.erights.e.elib.tables.FlexList;
 import org.erights.e.elib.tables.FlexMap;
 import org.erights.e.elib.util.AlreadyDefinedException;
+import org.erights.e.elib.util.ClassCache;
 
+import java.io.IOException;
+import java.lang.reflect.Modifier;
+
 /**
  * How a Java class's static methods are made accessible to E.
  * <p/>
@@ -100,7 +102,7 @@
                 StaticMethodNode.defineMembers(myVTable, safeJ.getOptSugaredBy(), SafeJ.ALL);
             }
         } catch (AlreadyDefinedException ade) {
-            throw new NestedException(ade, "# can't wrap class: " + clazz);
+            throw new EBacktraceException(ade, "# can't wrap class: " + clazz);
         }
     }
 
Index: jsrc/org/erights/e/elib/prim/ScriptMaker.java
===================================================================
--- jsrc/org/erights/e/elib/prim/ScriptMaker.java	(revision 721)
+++ jsrc/org/erights/e/elib/prim/ScriptMaker.java	(working copy)
@@ -19,7 +19,7 @@
 Contributor(s): ______________________________________.
 */
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.base.Callable;
 import org.erights.e.elib.base.Script;
 import org.erights.e.elib.base.ValueThunk;
@@ -88,7 +88,7 @@
         try {
             return ClassCache.forName(promotionName);
         } catch (Exception ex) {
-            throw new NestedException(ex, "# promotion not found");
+            throw new EBacktraceException(ex, "# promotion not found");
         }
     }
 
@@ -180,7 +180,7 @@
         try {
             return ClassCache.forName(sugarName);
         } catch (Exception ex) {
-            throw new NestedException(ex,
+            throw new EBacktraceException(ex,
                                       "# sweetener not found: " + sugarName);
         }
     }
Index: jsrc/org/erights/e/elib/prim/Thrower.java
===================================================================
--- jsrc/org/erights/e/elib/prim/Thrower.java	(revision 721)
+++ jsrc/org/erights/e/elib/prim/Thrower.java	(working copy)
@@ -4,7 +4,7 @@
 // found at http://www.opensource.org/licenses/mit-license.html ...............
 
 import org.erights.e.develop.assertion.T;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.util.OneArgFunc;
 
 /**
@@ -65,7 +65,7 @@
             return problem;
         }
         optEjector.run(problem);
-        throw new NestedException(problem,
+        throw new EBacktraceException(problem,
                                   "# optEjector returned: " + optEjector);
     }
 
Index: jsrc/org/erights/e/elib/prim/E.java
===================================================================
--- jsrc/org/erights/e/elib/prim/E.java	(revision 721)
+++ jsrc/org/erights/e/elib/prim/E.java	(working copy)
@@ -19,7 +19,7 @@
 Contributor(s): ______________________________________.
 */
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.exception.ThrowableSugar;
 import org.erights.e.develop.format.StringHelper;
 import org.erights.e.elib.base.ClassDesc;
@@ -242,7 +242,7 @@
                                              String verb,
                                              Object[] args) {
         if (Backtracing) {
-            return new NestedException(ex, "# Problem reporting problem!");
+            return new EBacktraceException(ex, "# Problem reporting problem!");
         }
 
         try {
@@ -253,10 +253,10 @@
                 return (Ejection)leaf;
             }
             String msg = ". " + abbrevCall(rec, ".", verb, args);
-            return new NestedException(ex, msg);
+            return new EBacktraceException(ex, msg);
 
         } catch (Throwable th) {
-            return new NestedException(ex, "# Problem reporting (" + th + ")");
+            return new EBacktraceException(ex, "# Problem reporting (" + th + ")");
 
         } finally {
             Backtracing = false;
Index: jsrc/org/erights/e/elib/base/Ejection.java
===================================================================
--- jsrc/org/erights/e/elib/base/Ejection.java	(revision 721)
+++ jsrc/org/erights/e/elib/base/Ejection.java	(working copy)
@@ -1,6 +1,6 @@
 package org.erights.e.elib.base;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.exception.ThrowableSugar;
 
 /*
@@ -39,7 +39,7 @@
      * unwrapped and optMsg is ignored.
      *
      * @param optMsg may equivalently be null or "", in which case it will be
-     *               ignored by eStack(). See {@link org.erights.e.develop.exception.NestedThrowable}
+     *               ignored by eStack(). See {@link org.erights.e.develop.exception.EBacktraceThrowable}
      *               for the convention that optMsg should follow.
      */
     static public RuntimeException backtrace(Throwable problem,
@@ -54,7 +54,7 @@
         if (problem instanceof RuntimeException && 0 == optMsg.length()) {
             return (RuntimeException)problem;
         }
-        return new NestedException(problem, optMsg);
+        return new EBacktraceException(problem, optMsg);
     }
 
     /**
Index: jsrc/org/erights/e/elib/tables/Equalizer.java
===================================================================
--- jsrc/org/erights/e/elib/tables/Equalizer.java	(revision 721)
+++ jsrc/org/erights/e/elib/tables/Equalizer.java	(working copy)
@@ -4,7 +4,7 @@
 // found at http://www.opensource.org/licenses/mit-license.html ...............
 
 import org.erights.e.develop.exception.ExceptionMgr;
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.base.ClassDesc;
 import org.erights.e.elib.prim.E;
 import org.erights.e.elib.prim.ScriptMaker;
@@ -106,7 +106,7 @@
         try {
             return ClassCache.forName(simpName);
         } catch (Exception ex) {
-            throw new NestedException(ex,
+            throw new EBacktraceException(ex,
                                       "# simplification not found: " +
                                         simpName);
         }
Index: jsrc/org/erights/e/elib/tables/ArrayHelper.java
===================================================================
--- jsrc/org/erights/e/elib/tables/ArrayHelper.java	(revision 721)
+++ jsrc/org/erights/e/elib/tables/ArrayHelper.java	(working copy)
@@ -3,7 +3,7 @@
 
 package org.erights.e.elib.tables;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.prim.E;
 import org.erights.e.meta.java.math.EInt;
 
@@ -179,7 +179,7 @@
             try {
                 Array.set(array, index, val);
             } catch (IllegalArgumentException iae2) {
-                throw new NestedException(iae2,
+                throw new EBacktraceException(iae2,
                                           "# Can't fit " + E.toQuote(val) +
                                             " into array of " + type);
             }
Index: jsrc/org/erights/e/elib/tables/FlexMap.java
===================================================================
--- jsrc/org/erights/e/elib/tables/FlexMap.java	(revision 721)
+++ jsrc/org/erights/e/elib/tables/FlexMap.java	(working copy)
@@ -19,7 +19,7 @@
 Contributor(s): ______________________________________.
 */
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.oldeio.TextWriter;
 import org.erights.e.elib.prim.E;
 import org.erights.e.elib.serial.PassByProxy;
@@ -86,7 +86,8 @@
      * If the key is overwritten, then the key order is unchanged. If the key
      * is novel, it's added to the end of the order.
      *
-     * @throws NestedException of NotSettledException if the key is not settled
+     * @throws (EBacktraceException of) NotSettledException if the key is not
+     *         settled
      * @see org.erights.e.elib.ref.Ref#isSettled
      */
     public abstract void put(Object key, Object value, boolean strict);
Index: jsrc/org/erights/e/ui/awt/EAction.java
===================================================================
--- jsrc/org/erights/e/ui/awt/EAction.java	(revision 721)
+++ jsrc/org/erights/e/ui/awt/EAction.java	(working copy)
@@ -3,7 +3,7 @@
 // Copyright 2002 Combex, Inc. under the terms of the MIT X license
 // found at http://www.opensource.org/licenses/mit-license.html ...............
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.develop.format.StringHelper;
 import org.erights.e.elib.oldeio.EPrintable;
 import org.erights.e.elib.oldeio.TextWriter;
@@ -249,13 +249,13 @@
         try {
             field = KeyEvent.class.getField("VK_" + accel);
         } catch (NoSuchFieldException nsfe) {
-            throw new NestedException(nsfe, "# building menu: " + accel);
+            throw new EBacktraceException(nsfe, "# building menu: " + accel);
         }
         int c;
         try {
             c = field.getInt(null);
         } catch (IllegalAccessException iae) {
-            throw new NestedException(iae, "# building menu: " + field);
+            throw new EBacktraceException(iae, "# building menu: " + field);
         }
 
         KeyStroke stroke = KeyStroke.getKeyStroke(c, mask);
Index: jsrc/org/erights/e/develop/exception/NestedException.java
===================================================================
--- jsrc/org/erights/e/develop/exception/NestedException.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/NestedException.java	(working copy)
@@ -1,46 +0,0 @@
-package org.erights.e.develop.exception;
-
-/*
-The contents of this file are subject to the Electric Communities E Open
-Source Code License Version 1.0 (the "License"); you may not use this file
-except in compliance with the License. You may obtain a copy of the License
-at http://www.communities.com/EL/.
-
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
-the specific language governing rights and limitations under the License.
-
-The Original Code is the Distributed E Language Implementation, released
-July 20, 1998.
-
-The Initial Developer of the Original Code is Electric Communities.
-Copyright (C) 1998 Electric Communities. All Rights Reserved.
-
-Contributor(s): ______________________________________.
-*/
-
-/**
- * Nested version of the Java RuntimeException class.
- */
-public class NestedException extends RuntimeException
-  implements NestedThrowable {
-
-    static private final long serialVersionUID = 2241355872285197147L;
-
-    private final Throwable myContainedThrowable;
-
-    /**
-     * See {@link NestedThrowable} for the convention that msg should follow.
-     */
-    public NestedException(Throwable t, String msg) {
-        super(msg);
-        myContainedThrowable = t;
-    }
-
-    /**
-     *
-     */
-    public Throwable getNestedThrowable() {
-        return myContainedThrowable;
-    }
-}
Index: jsrc/org/erights/e/develop/exception/EBacktraceException.java
===================================================================
--- jsrc/org/erights/e/develop/exception/EBacktraceException.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/EBacktraceException.java	(working copy)
@@ -20,27 +20,22 @@
 */
 
 /**
- * Nested version of the Java RuntimeException class.
+ * Backtrace version of the Java RuntimeException class.
+ * 
+ * This is identical to RuntimeException except that it indicates that this
+ * exception should be unwrapped as part of the E backtrace-reporting
+ * mechanisms, and its message follows the convention described in 
+ * {@link EBacktraceThrowable}.
  */
-public class NestedException extends RuntimeException
-  implements NestedThrowable {
+public class EBacktraceException extends RuntimeException
+  implements EBacktraceThrowable {
 
-    static private final long serialVersionUID = 2241355872285197147L;
+    static private final long serialVersionUID = 2636038350623448267L;
 
-    private final Throwable myContainedThrowable;
-
     /**
-     * See {@link NestedThrowable} for the convention that msg should follow.
+     * See {@link EBacktraceThrowable} for the convention that msg should follow.
      */
-    public NestedException(Throwable t, String msg) {
-        super(msg);
-        myContainedThrowable = t;
+    public EBacktraceException(Throwable t, String msg) {
+        super(msg, t);
     }
-
-    /**
-     *
-     */
-    public Throwable getNestedThrowable() {
-        return myContainedThrowable;
-    }
 }
Index: jsrc/org/erights/e/develop/exception/ExceptionMgr.java
===================================================================
--- jsrc/org/erights/e/develop/exception/ExceptionMgr.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/ExceptionMgr.java	(working copy)
@@ -49,7 +49,10 @@
         if (th instanceof RuntimeException) {
             return (RuntimeException)th;
         }
-        return new NestedException(th, "");
+        // XXX review: in the new getCause()-based world, should this be not
+        // a backtrace exception but a plain RuntimeException? If so, how
+        // should the backtrace facilities know to walk through it?
+        return new EBacktraceException(th, "");
     }
 
     /**
Index: jsrc/org/erights/e/develop/exception/NestedIOException.java
===================================================================
--- jsrc/org/erights/e/develop/exception/NestedIOException.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/NestedIOException.java	(working copy)
@@ -1,47 +0,0 @@
-package org.erights.e.develop.exception;
-
-/*
-The contents of this file are subject to the Electric Communities E Open
-Source Code License Version 1.0 (the "License"); you may not use this file
-except in compliance with the License. You may obtain a copy of the License
-at http://www.communities.com/EL/.
-
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
-the specific language governing rights and limitations under the License.
-
-The Original Code is the Distributed E Language Implementation, released
-July 20, 1998.
-
-The Initial Developer of the Original Code is Electric Communities.
-Copyright (C) 1998 Electric Communities. All Rights Reserved.
-
-Contributor(s): ______________________________________.
-*/
-
-import java.io.IOException;
-
-/**
- * Nested version of the Java IOException class.
- */
-public class NestedIOException extends IOException implements NestedThrowable {
-
-    static private final long serialVersionUID = 7178739108699472895L;
-
-    private final Throwable myContainedThrowable;
-
-    /**
-     *
-     */
-    public NestedIOException(Throwable t, String msg) {
-        super(msg);
-        myContainedThrowable = t;
-    }
-
-    /**
-     *
-     */
-    public Throwable getNestedThrowable() {
-        return myContainedThrowable;
-    }
-}
Index: jsrc/org/erights/e/develop/exception/ThrowableSugar.java
===================================================================
--- jsrc/org/erights/e/develop/exception/ThrowableSugar.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/ThrowableSugar.java	(working copy)
@@ -96,24 +96,28 @@
      * Returns the Throwable wrapped by self.
      * <p/>
      * If self doesn't wrap a Throwable, return null.
+     * <p/>
+     * XXX This is now deprecated in favor of the Java 1.4 getCause() method.
+     * Its original behavior has been preserved: it will unwrap E backtrace
+     * exceptions and the Java standard library exceptions
+     * {@link java.lang.ExceptionInInitializerError},
+     * {@link java.lang.reflect.InvocationTargetException}, and
+     * {@link java.lang.reflect.UndeclaredThrowableException}.
      */
     static public Throwable unwrap(Throwable self) {
-        if (self instanceof NestedThrowable) {
-            return ((NestedThrowable)self).getNestedThrowable();
-        } else if (self instanceof ExceptionInInitializerError) {
-            return ((ExceptionInInitializerError)self).getException();
-        } else if (self instanceof InvocationTargetException) {
-            return ((InvocationTargetException)self).getTargetException();
-        } else if (self instanceof UndeclaredThrowableException) {
-            return ((UndeclaredThrowableException)self).
-              getUndeclaredThrowable();
+        if (self instanceof EBacktraceThrowable
+                || self instanceof ExceptionInInitializerError
+                || self instanceof InvocationTargetException
+                || self instanceof UndeclaredThrowableException) {
+            return self.getCause();
         } else {
             return null;
         }
     }
 
     /**
-     * Return the non-wrapping throwable at the end of a wrapping chain
+     * Return the non-wrapping throwable at the end of a wrapping chain:
+     * repeatedly {@link unwrap()}.
      */
     static public Throwable leaf(Throwable self) {
         while (true) {
Index: jsrc/org/erights/e/develop/exception/NestedThrowable.java
===================================================================
--- jsrc/org/erights/e/develop/exception/NestedThrowable.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/NestedThrowable.java	(working copy)
@@ -1,41 +0,0 @@
-package org.erights.e.develop.exception;
-
-/*
-The contents of this file are subject to the Electric Communities E Open
-Source Code License Version 1.0 (the "License"); you may not use this file
-except in compliance with the License. You may obtain a copy of the License
-at http://www.communities.com/EL/.
-
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
-the specific language governing rights and limitations under the License.
-
-The Original Code is the Distributed E Language Implementation, released
-July 20, 1998.
-
-The Initial Developer of the Original Code is Electric Communities.
-Copyright (C) 1998 Electric Communities. All Rights Reserved.
-
-Contributor(s): ______________________________________.
-*/
-
-/**
- * Wraps a Throwable in order to turn it into some other kind of Throwable, in
- * order to add backtrace info, or both.
- * <p/>
- * For a NestedThrowable, the convention for the message is that it should be
- * empty, or each line should begin with <ul> <li>"# " to indicate a message
- * intended only for human parsing. <li>". " to indicate a printing of a
- * problematic call's value <li>"@ " to indicate where the problem occurred
- * <li>"- " to indicate what was called. </ul> If the message is empty, it will
- * be ignored by {@link ThrowableSugar#eStack}.
- *
- * @author modification by Mark S. Miller
- */
-public interface NestedThrowable {
-
-    /**
-     *
-     */
-    Throwable getNestedThrowable();
-}
Index: jsrc/org/erights/e/develop/exception/EBacktraceIOException.java
===================================================================
--- jsrc/org/erights/e/develop/exception/EBacktraceIOException.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/EBacktraceIOException.java	(working copy)
@@ -22,26 +22,21 @@
 import java.io.IOException;
 
 /**
- * Nested version of the Java IOException class.
+ * Backtrace version of the Java IOException class.
+ * 
+ * This is identical to RuntimeException except that it indicates that this
+ * exception should be unwrapped as part of the E backtrace-reporting
+ * mechanisms, and its message follows the convention described in 
+ * {@link EBacktraceThrowable}.
  */
-public class NestedIOException extends IOException implements NestedThrowable {
+public class EBacktraceIOException extends IOException implements EBacktraceThrowable {
 
-    static private final long serialVersionUID = 7178739108699472895L;
+    static private final long serialVersionUID = 8627311147539613684L;
 
-    private final Throwable myContainedThrowable;
-
     /**
      *
      */
-    public NestedIOException(Throwable t, String msg) {
-        super(msg);
-        myContainedThrowable = t;
+    public EBacktraceIOException(Throwable t, String msg) {
+        super(msg, t);
     }
-
-    /**
-     *
-     */
-    public Throwable getNestedThrowable() {
-        return myContainedThrowable;
-    }
 }
Index: jsrc/org/erights/e/develop/exception/NestedError.java
===================================================================
--- jsrc/org/erights/e/develop/exception/NestedError.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/NestedError.java	(working copy)
@@ -1,45 +0,0 @@
-package org.erights.e.develop.exception;
-
-/*
-The contents of this file are subject to the Electric Communities E Open
-Source Code License Version 1.0 (the "License"); you may not use this file
-except in compliance with the License. You may obtain a copy of the License
-at http://www.communities.com/EL/.
-
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
-the specific language governing rights and limitations under the License.
-
-The Original Code is the Distributed E Language Implementation, released
-July 20, 1998.
-
-The Initial Developer of the Original Code is Electric Communities.
-Copyright (C) 1998 Electric Communities. All Rights Reserved.
-
-Contributor(s): ______________________________________.
-*/
-
-/**
- * Nested version of the Java Error class
- */
-public class NestedError extends Error implements NestedThrowable {
-
-    static private final long serialVersionUID = -8224390403639236240L;
-
-    private final Throwable myContainedThrowable;
-
-    /**
-     *
-     */
-    public NestedError(Throwable t, String msg) {
-        super(msg);
-        myContainedThrowable = t;
-    }
-
-    /**
-     *
-     */
-    public Throwable getNestedThrowable() {
-        return myContainedThrowable;
-    }
-}
Index: jsrc/org/erights/e/develop/exception/EBacktraceThrowable.java
===================================================================
--- jsrc/org/erights/e/develop/exception/EBacktraceThrowable.java	(revision 721)
+++ jsrc/org/erights/e/develop/exception/EBacktraceThrowable.java	(working copy)
@@ -20,10 +20,9 @@
 */
 
 /**
- * Wraps a Throwable in order to turn it into some other kind of Throwable, in
- * order to add backtrace info, or both.
+ * Wraps a Throwable (stored in the cause field) in order to add backtrace info.
  * <p/>
- * For a NestedThrowable, the convention for the message is that it should be
+ * For a EBacktraceThrowable, the convention for the message is that it should be
  * empty, or each line should begin with <ul> <li>"# " to indicate a message
  * intended only for human parsing. <li>". " to indicate a printing of a
  * problematic call's value <li>"@ " to indicate where the problem occurred
@@ -32,10 +31,5 @@
  *
  * @author modification by Mark S. Miller
  */
-public interface NestedThrowable {
-
-    /**
-     *
-     */
-    Throwable getNestedThrowable();
+public interface EBacktraceThrowable {
 }
Index: jsrc/com/hp/orc/OrcParser.java
===================================================================
--- jsrc/com/hp/orc/OrcParser.java	(revision 721)
+++ jsrc/com/hp/orc/OrcParser.java	(working copy)
@@ -11,7 +11,7 @@
 //#line 5 "orc.y"
 package com.hp.orc;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.Twine;
 import org.quasiliteral.astro.Astro;
@@ -390,7 +390,7 @@
         OrcParser parser = new OrcParser(lexer, builder);
         return parser.parse();
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
 
Index: jsrc/com/hp/orc/orc.y
===================================================================
--- jsrc/com/hp/orc/orc.y	(revision 721)
+++ jsrc/com/hp/orc/orc.y	(working copy)
@@ -4,7 +4,7 @@
 %{
 package com.hp.orc;
 
-import org.erights.e.develop.exception.NestedException;
+import org.erights.e.develop.exception.EBacktraceException;
 import org.erights.e.elib.tables.ConstList;
 import org.erights.e.elib.tables.Twine;
 import org.quasiliteral.astro.Astro;
@@ -212,7 +212,7 @@
         OrcParser parser = new OrcParser(lexer, builder);
         return parser.parse();
     } catch (IOException iox) {
-        throw new NestedException(iox, "# parsing a string?!");
+        throw new EBacktraceException(iox, "# parsing a string?!");
     }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.