nashorn/src/jdk/nashorn/internal/ir/SwitchNode.java
author lagergren
Fri, 19 Apr 2013 16:11:16 +0200
changeset 17233 72ccf78a8216
parent 16530 201d682e75f4
child 17523 cb4a7c901e0d
permissions -rw-r--r--
8010701: Immutable nodes - final iteration Reviewed-by: sundar, hannesw, jlaskey
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
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import java.util.ArrayList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import java.util.Collections;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import java.util.List;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    31
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16160
diff changeset
    32
import jdk.nashorn.internal.codegen.Label;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    33
import jdk.nashorn.internal.ir.annotations.Immutable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import jdk.nashorn.internal.runtime.Source;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 * IR representation of a SWITCH statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
 */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    40
@Immutable
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    41
public final class SwitchNode extends BreakableNode {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
    /** Switch expression. */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    43
    private final Node expression;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    44
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    45
    /** Switch cases. */
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    46
    private final List<CaseNode> cases;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    47
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    48
    /** Switch default index. */
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    49
    private final int defaultCaseIndex;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
    /** Tag symbol. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
    private Symbol tag;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
     *
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    57
     * @param source      the source
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    58
     * @param token       token
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    59
     * @param finish      finish
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    60
     * @param expression  switch expression
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    61
     * @param cases       cases
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    62
     * @param defaultCase the default case node - null if none, otherwise has to be present in cases list
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    64
    public SwitchNode(final Source source, final long token, final int finish, final Node expression, final List<CaseNode> cases, final CaseNode defaultCase) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    65
        super(source, token, finish, new Label("switch_break"));
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    66
        this.expression       = expression;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    67
        this.cases            = cases;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    68
        this.defaultCaseIndex = defaultCase == null ? -1 : cases.indexOf(defaultCase);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    71
    private SwitchNode(final SwitchNode switchNode, final Node expression, final List<CaseNode> cases, final int defaultCase) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
        super(switchNode);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    73
        this.expression       = expression;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    74
        this.cases            = cases;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    75
        this.defaultCaseIndex = defaultCase;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    76
        this.tag              = switchNode.getTag(); //TODO are symbols inhereted as references?
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
    @Override
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    80
    public Node ensureUniqueLabels(final LexicalContext lc) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    81
        final List<CaseNode> newCases = new ArrayList<>();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    82
        for (final CaseNode caseNode : cases) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    83
            newCases.add(new CaseNode(caseNode, caseNode.getTest(), caseNode.getBody()));
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    84
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    85
        return Node.replaceInLexicalContext(lc, this, new SwitchNode(this, expression, newCases, defaultCaseIndex));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
    @Override
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    89
    public boolean isTerminal() {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    90
        //there must be a default case, and that including all other cases must terminate
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    91
        if (!cases.isEmpty() && defaultCaseIndex != -1) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    92
            for (final CaseNode caseNode : cases) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    93
                if (!caseNode.isTerminal()) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    94
                    return false;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    95
                }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    96
            }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    97
            return true;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    98
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    99
        return false;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   101
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   103
    @Override
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   104
    public Node accept(final LexicalContext lc, final NodeVisitor visitor) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   105
        if (visitor.enterSwitchNode(this)) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   106
            return visitor.leaveSwitchNode(
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   107
                setExpression(visitor.getLexicalContext(), expression.accept(visitor)).
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   108
                setCases(visitor.getLexicalContext(), Node.accept(visitor, CaseNode.class, cases), defaultCaseIndex));
16147
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
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
    public void toString(final StringBuilder sb) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
        sb.append("switch (");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
        expression.toString(sb);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
        sb.append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
    /**
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   122
     * Return the case node that is default case
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   123
     * @return default case or null if none
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   124
     */
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   125
    public CaseNode getDefaultCase() {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   126
        return defaultCaseIndex == -1 ? null : cases.get(defaultCaseIndex);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   127
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   128
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   129
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
     * Get the cases in this switch
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
     * @return a list of case nodes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
    public List<CaseNode> getCases() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
        return Collections.unmodifiableList(cases);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    /**
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   138
     * Replace case nodes with new list. the cases have to be the same
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   139
     * and the default case index the same. This is typically used
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   140
     * by NodeVisitors who perform operations on every case node
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   141
     * @param lc    lexical context
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   142
     * @param cases list of cases
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   143
     * @return new switcy node or same if no state was changed
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   145
    public SwitchNode setCases(final LexicalContext lc, final List<CaseNode> cases) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   146
        return setCases(lc, cases, defaultCaseIndex);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   147
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   148
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   149
    private SwitchNode setCases(final LexicalContext lc, final List<CaseNode> cases, final int defaultCaseIndex) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   150
        if (this.cases == cases) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   151
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   152
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   153
        return Node.replaceInLexicalContext(lc, this, new SwitchNode(this, expression, cases, defaultCaseIndex));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    /**
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   157
     * Set or reset the list of cases in this switch
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   158
     * @param lc lexical context
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   159
     * @param cases a list of cases, case nodes
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   160
     * @param defaultCase a case in the list that is the default - must be in the list or class will assert
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   161
     * @return new switch node or same if no state was changed
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   163
    public SwitchNode setCases(final LexicalContext lc, final List<CaseNode> cases, final CaseNode defaultCase) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   164
        return setCases(lc, cases, defaultCase == null ? -1 : cases.indexOf(defaultCase));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
     * Return the expression to switch on
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
     * @return switch expression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
    public Node getExpression() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
        return expression;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
     * Set or reset the expression to switch on
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   177
     * @param lc lexical context
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
     * @param expression switch expression
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   179
     * @return new switch node or same if no state was changed
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   181
    public SwitchNode setExpression(final LexicalContext lc, final Node expression) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   182
        if (this.expression == expression) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   183
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   184
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   185
        return Node.replaceInLexicalContext(lc, this, new SwitchNode(this, expression, cases, defaultCaseIndex));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
     * Get the tag symbol for this switch. The tag symbol is where
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
     * the switch expression result is stored
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
     * @return tag symbol
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
    public Symbol getTag() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
        return tag;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
     * Set the tag symbol for this switch. The tag symbol is where
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
     * the switch expression result is stored
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
     * @param tag a symbol
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
    public void setTag(final Symbol tag) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
        this.tag = tag;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206