org.erights.e.elang.evm
Class CatchExpr

java.lang.Object
  |
  +--org.erights.e.elang.evm.ParseNode
        |
        +--org.erights.e.elang.evm.ENode
              |
              +--org.erights.e.elang.evm.EExpr
                    |
                    +--org.erights.e.elang.evm.CatchExpr
All Implemented Interfaces:
Cloneable, EPrintable, MatchMaker

public class CatchExpr
extends EExpr

Safe: BNF: "try" block "catch" pattern block.

Evaluates the try-block, but should it throw a Throwable, binds pattern to the Throwable and evaluates the catch-block. The outcome of the catch expression is the outcome of the try-block, or the outcome of the catch-block if the try-block threw a Throwable.

Author:
Mark S. Miller
See Also:
org.erights.e.elang.evm.FinallyExpr, org.erights.e.elang.evm.EscapeExpr

Field Summary
private  EExpr myAttempt
           
private  EExpr myCatcher
           
private  Pattern myPattern
           
 
Fields inherited from class org.erights.e.elang.evm.ENode
 
Fields inherited from class org.erights.e.elang.evm.ParseNode
NUM_PR, PR_ASSIGN, PR_CALL, PR_COMP, PR_EEXPR, PR_LISTPATT, PR_ORDER, PR_PATTERN, PR_PRIM, PR_START
 
Constructor Summary
CatchExpr(SourceSpan optSpan, EExpr attempt, Pattern pattern, EExpr catcher)
          Enabled:
 
Method Summary
 EExpr attempt()
          Enabled:
protected  StaticScope computeStaticScope()
          When staticScope() is first requested on a given node, it calls computeStaticScope() to do the actual computation, which is then remembered.
 EExpr katch()
          Enabled:
 boolean matchBind(ConstList args, Object specimen, FlexList bindings)
          Enabled:
 Pattern pattern()
          Enabled:
protected  Object subEval(EvalContext ctx, boolean forValue)
          Evaluates to the outcome of the try block, but if it throws an Throwable, evaluate to the outcome of the catch block.
 void subPrintOn(TextWriter out, int priority)
          Enabled:
 Object welcome(ETreeVisitor visitor)
          Enabled:
 
Methods inherited from class org.erights.e.elang.evm.EExpr
__printOn, appendAllTo, appendTo, eval, eval, evalBool, printAsBlockOn, substitute, transform
 
Methods inherited from class org.erights.e.elang.evm.ENode
cleanCopy, copy, getOptPatternMap, getOptScopeMap, getPatternMap, getScopeMap, qbuild, setPatternMap, setScopeMap, staticScope, synEnv
 
Methods inherited from class org.erights.e.elang.evm.ParseNode
asText, getOptSpan, lnPrintOn, lnPrintOn, matchBind, matchBind, matchBind, printListOn, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

myAttempt

private final EExpr myAttempt

myPattern

private final Pattern myPattern

myCatcher

private final EExpr myCatcher
Constructor Detail

CatchExpr

public CatchExpr(SourceSpan optSpan,
                 EExpr attempt,
                 Pattern pattern,
                 EExpr catcher)
Enabled:

Method Detail

welcome

public Object welcome(ETreeVisitor visitor)
Enabled:

Specified by:
welcome in class ENode

computeStaticScope

protected StaticScope computeStaticScope()
Description copied from class: ENode
When staticScope() is first requested on a given node, it calls computeStaticScope() to do the actual computation, which is then remembered.

Specified by:
computeStaticScope in class ENode

subEval

protected Object subEval(EvalContext ctx,
                         boolean forValue)
Evaluates to the outcome of the try block, but if it throws an Throwable, evaluate to the outcome of the catch block.

Subtle but important semantic point: Not only do we rethrow the original problem if the catch-pattern fails to match, we also throw the original problem if the match attempt throws, since the original problem is assumed to be a more important diagnostic than the new Throwable.

If the match attempt instead does a non-local escape, then this ejection dominates and the original problem is lost.

Specified by:
subEval in class EExpr

matchBind

public boolean matchBind(ConstList args,
                         Object specimen,
                         FlexList bindings)
Enabled:

Specified by:
matchBind in interface MatchMaker
Specified by:
matchBind in class ParseNode

attempt

public EExpr attempt()
Enabled:


pattern

public Pattern pattern()
Enabled:


katch

public EExpr katch()
Enabled:


subPrintOn

public void subPrintOn(TextWriter out,
                       int priority)
                throws IOException
Enabled:

Specified by:
subPrintOn in class ParseNode
IOException


comments?