author | lagergren |
Tue, 07 May 2013 14:43:17 +0200 | |
changeset 17524 | 703643aeb0d6 |
parent 17523 | cb4a7c901e0d |
child 17745 | 86e5a15b3b20 |
permissions | -rw-r--r-- |
16147 | 1 |
/* |
16151 | 2 |
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. |
16147 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. Oracle designates this |
|
8 |
* particular file as subject to the "Classpath" exception as provided |
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
|
10 |
* |
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
24 |
*/ |
|
25 |
||
26 |
package jdk.nashorn.internal.ir; |
|
27 |
||
17233 | 28 |
import jdk.nashorn.internal.ir.annotations.Immutable; |
16147 | 29 |
import jdk.nashorn.internal.ir.visitor.NodeVisitor; |
30 |
||
31 |
/** |
|
32 |
* IR representation of a catch clause. |
|
33 |
*/ |
|
17233 | 34 |
@Immutable |
17524
703643aeb0d6
8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents:
17523
diff
changeset
|
35 |
public final class CatchNode extends Statement { |
16147 | 36 |
/** Exception identifier. */ |
17233 | 37 |
private final IdentNode exception; |
16147 | 38 |
|
39 |
/** Exception condition. */ |
|
17233 | 40 |
private final Node exceptionCondition; |
16147 | 41 |
|
42 |
/** Catch body. */ |
|
17233 | 43 |
private final Block body; |
16147 | 44 |
|
45 |
/** |
|
46 |
* Constructors |
|
47 |
* |
|
17524
703643aeb0d6
8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents:
17523
diff
changeset
|
48 |
* @param lineNumber lineNumber |
16147 | 49 |
* @param token token |
50 |
* @param finish finish |
|
51 |
* @param exception variable name of exception |
|
52 |
* @param exceptionCondition exception condition |
|
53 |
* @param body catch body |
|
54 |
*/ |
|
17524
703643aeb0d6
8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents:
17523
diff
changeset
|
55 |
public CatchNode(final int lineNumber, final long token, final int finish, final IdentNode exception, final Node exceptionCondition, final Block body) { |
703643aeb0d6
8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents:
17523
diff
changeset
|
56 |
super(lineNumber, token, finish); |
16147 | 57 |
this.exception = exception; |
58 |
this.exceptionCondition = exceptionCondition; |
|
59 |
this.body = body; |
|
60 |
} |
|
61 |
||
17233 | 62 |
private CatchNode(final CatchNode catchNode, final IdentNode exception, final Node exceptionCondition, final Block body) { |
16147 | 63 |
super(catchNode); |
17233 | 64 |
this.exception = exception; |
65 |
this.exceptionCondition = exceptionCondition; |
|
66 |
this.body = body; |
|
16147 | 67 |
} |
68 |
||
69 |
/** |
|
70 |
* Assist in IR navigation. |
|
71 |
* @param visitor IR navigating visitor. |
|
72 |
*/ |
|
73 |
@Override |
|
74 |
public Node accept(final NodeVisitor visitor) { |
|
17233 | 75 |
if (visitor.enterCatchNode(this)) { |
76 |
return visitor.leaveCatchNode( |
|
77 |
setException((IdentNode)exception.accept(visitor)). |
|
78 |
setExceptionCondition(exceptionCondition == null ? null : exceptionCondition.accept(visitor)). |
|
79 |
setBody((Block)body.accept(visitor))); |
|
16147 | 80 |
} |
81 |
||
82 |
return this; |
|
83 |
} |
|
84 |
||
85 |
@Override |
|
17233 | 86 |
public boolean isTerminal() { |
87 |
return body.isTerminal(); |
|
88 |
} |
|
89 |
||
90 |
@Override |
|
16147 | 91 |
public void toString(final StringBuilder sb) { |
92 |
sb.append(" catch ("); |
|
93 |
exception.toString(sb); |
|
94 |
||
95 |
if (exceptionCondition != null) { |
|
96 |
sb.append(" if "); |
|
97 |
exceptionCondition.toString(sb); |
|
98 |
} |
|
99 |
sb.append(')'); |
|
100 |
} |
|
101 |
||
102 |
/** |
|
103 |
* Get the identifier representing the exception thrown |
|
104 |
* @return the exception identifier |
|
105 |
*/ |
|
106 |
public IdentNode getException() { |
|
107 |
return exception; |
|
108 |
} |
|
109 |
||
110 |
/** |
|
111 |
* Get the exception condition for this catch block |
|
112 |
* @return the exception condition |
|
113 |
*/ |
|
114 |
public Node getExceptionCondition() { |
|
115 |
return exceptionCondition; |
|
116 |
} |
|
117 |
||
118 |
/** |
|
119 |
* Reset the exception condition for this catch block |
|
120 |
* @param exceptionCondition the new exception condition |
|
17233 | 121 |
* @return new or same CatchNode |
16147 | 122 |
*/ |
17233 | 123 |
public CatchNode setExceptionCondition(final Node exceptionCondition) { |
124 |
if (this.exceptionCondition == exceptionCondition) { |
|
125 |
return this; |
|
126 |
} |
|
127 |
return new CatchNode(this, exception, exceptionCondition, body); |
|
16147 | 128 |
} |
129 |
||
130 |
/** |
|
131 |
* Get the body for this catch block |
|
132 |
* @return the catch block body |
|
133 |
*/ |
|
134 |
public Block getBody() { |
|
135 |
return body; |
|
136 |
} |
|
17233 | 137 |
|
17518
2225a4f929c0
8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents:
17233
diff
changeset
|
138 |
/** |
2225a4f929c0
8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents:
17233
diff
changeset
|
139 |
* Resets the exception of a catch block |
2225a4f929c0
8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents:
17233
diff
changeset
|
140 |
* @param exception new exception |
2225a4f929c0
8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents:
17233
diff
changeset
|
141 |
* @return new catch node if changed, same otherwise |
2225a4f929c0
8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents:
17233
diff
changeset
|
142 |
*/ |
2225a4f929c0
8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents:
17233
diff
changeset
|
143 |
public CatchNode setException(final IdentNode exception) { |
17233 | 144 |
if (this.exception == exception) { |
145 |
return this; |
|
146 |
} |
|
147 |
return new CatchNode(this, exception, exceptionCondition, body); |
|
148 |
} |
|
149 |
||
150 |
private CatchNode setBody(final Block body) { |
|
151 |
if (this.body == body) { |
|
152 |
return this; |
|
153 |
} |
|
154 |
return new CatchNode(this, exception, exceptionCondition, body); |
|
155 |
} |
|
16147 | 156 |
} |