nashorn/src/jdk/nashorn/internal/ir/CatchNode.java
author lagergren
Tue, 07 May 2013 14:43:17 +0200
changeset 17524 703643aeb0d6
parent 17523 cb4a7c901e0d
child 17745 86e5a15b3b20
permissions -rw-r--r--
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. Reviewed-by: jlaskey, attila
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.ir;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    28
import jdk.nashorn.internal.ir.annotations.Immutable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
 * IR representation of a catch clause.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
 */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    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
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
    /** Exception identifier. */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    37
    private final IdentNode exception;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
    /** Exception condition. */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    40
    private final Node exceptionCondition;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
    /** Catch body. */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    43
    private final Block body;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
     * Constructors
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    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
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
     * @param token              token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
     * @param finish             finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
     * @param exception          variable name of exception
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
     * @param exceptionCondition exception condition
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
     * @param body               catch body
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    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
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
        this.exception          = exception;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
        this.exceptionCondition = exceptionCondition;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
        this.body               = body;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    62
    private CatchNode(final CatchNode catchNode, final IdentNode exception, final Node exceptionCondition, final Block body) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
        super(catchNode);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    64
        this.exception          = exception;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    65
        this.exceptionCondition = exceptionCondition;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    66
        this.body               = body;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
     * Assist in IR navigation.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
     * @param visitor IR navigating visitor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    public Node accept(final NodeVisitor visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    75
        if (visitor.enterCatchNode(this)) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    76
            return visitor.leaveCatchNode(
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    77
                setException((IdentNode)exception.accept(visitor)).
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    78
                setExceptionCondition(exceptionCondition == null ? null : exceptionCondition.accept(visitor)).
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    79
                setBody((Block)body.accept(visitor)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
    @Override
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    86
    public boolean isTerminal() {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    87
        return body.isTerminal();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    88
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    89
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    90
    @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
    public void toString(final StringBuilder sb) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
        sb.append(" catch (");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
        exception.toString(sb);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
        if (exceptionCondition != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
            sb.append(" if ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
            exceptionCondition.toString(sb);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        sb.append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
     * Get the identifier representing the exception thrown
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
     * @return the exception identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
    public IdentNode getException() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
        return exception;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
     * Get the exception condition for this catch block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
     * @return the exception condition
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    public Node getExceptionCondition() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        return exceptionCondition;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
     * Reset the exception condition for this catch block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
     * @param exceptionCondition the new exception condition
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   121
     * @return new or same CatchNode
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   123
    public CatchNode setExceptionCondition(final Node exceptionCondition) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   124
        if (this.exceptionCondition == exceptionCondition) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   125
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   126
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   127
        return new CatchNode(this, exception, exceptionCondition, body);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
     * Get the body for this catch block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
     * @return the catch block body
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    public Block getBody() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
        return body;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   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
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   144
        if (this.exception == exception) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   145
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   146
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   147
        return new CatchNode(this, exception, exceptionCondition, body);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   148
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   149
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   150
    private CatchNode setBody(final Block body) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   151
        if (this.body == body) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   152
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   153
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   154
        return new CatchNode(this, exception, exceptionCondition, body);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   155
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
}