< prev index next >

src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/CatchNode.java

Print this page

        

@@ -33,12 +33,12 @@
  */
 @Immutable
 public final class CatchNode extends Statement {
     private static final long serialVersionUID = 1L;
 
-    /** Exception identifier. */
-    private final IdentNode exception;
+    /** Exception identifier or pattern. */
+    private final Expression exception;
 
     /** Exception condition. */
     private final Expression exceptionCondition;
 
     /** Catch body. */

@@ -50,25 +50,30 @@
      * Constructors
      *
      * @param lineNumber         lineNumber
      * @param token              token
      * @param finish             finish
-     * @param exception          variable name of exception
+     * @param exception          variable name or pattern of exception
      * @param exceptionCondition exception condition
      * @param body               catch body
      * @param isSyntheticRethrow true if this node is a synthetically generated rethrow node.
      */
-    public CatchNode(final int lineNumber, final long token, final int finish, final IdentNode exception,
+    public CatchNode(final int lineNumber, final long token, final int finish, final Expression exception,
             final Expression exceptionCondition, final Block body, final boolean isSyntheticRethrow) {
         super(lineNumber, token, finish);
-        this.exception          = exception == null ? null : exception.setIsInitializedHere();
+        if (exception instanceof IdentNode) {
+            this.exception = ((IdentNode) exception == null) ? null : ((IdentNode) exception).setIsInitializedHere();
+        } else {
+            this.exception = exception;
+        }
+
         this.exceptionCondition = exceptionCondition;
         this.body               = body;
         this.isSyntheticRethrow = isSyntheticRethrow;
     }
 
-    private CatchNode(final CatchNode catchNode, final IdentNode exception, final Expression exceptionCondition,
+    private CatchNode(final CatchNode catchNode, final Expression exception, final Expression exceptionCondition,
             final Block body, final boolean isSyntheticRethrow) {
         super(catchNode);
         this.exception          = exception;
         this.exceptionCondition = exceptionCondition;
         this.body               = body;

@@ -81,15 +86,14 @@
      */
     @Override
     public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
         if (visitor.enterCatchNode(this)) {
             return visitor.leaveCatchNode(
-                setException((IdentNode)exception.accept(visitor)).
-                setExceptionCondition(exceptionCondition == null ? null : (Expression)exceptionCondition.accept(visitor)).
-                setBody((Block)body.accept(visitor)));
+                    setException((Expression) exception.accept(visitor)).
+                            setExceptionCondition(exceptionCondition == null ? null : (Expression) exceptionCondition.accept(visitor)).
+                            setBody((Block) body.accept(visitor)));
         }
-
         return this;
     }
 
     @Override
     public boolean isTerminal() {

@@ -111,11 +115,17 @@
     /**
      * Get the identifier representing the exception thrown
      * @return the exception identifier
      */
     public IdentNode getException() {
-        return exception;
+        //Fixme :http://www.ecma-international.org/ecma-262/6.0/
+        //for now, only parsing is supported
+        if (exception instanceof IdentNode) {
+            return (IdentNode) exception;
+        } else {
+            return null;
+        }
     }
 
     /**
      * Get the exception condition for this catch block
      * @return the exception condition

@@ -147,11 +157,11 @@
     /**
      * Resets the exception of a catch block
      * @param exception new exception
      * @return new catch node if changed, same otherwise
      */
-    public CatchNode setException(final IdentNode exception) {
+    public CatchNode setException(final Expression exception) {
         if (this.exception == exception) {
             return this;
         }
         return new CatchNode(this, exception, exceptionCondition, body, isSyntheticRethrow);
     }
< prev index next >