nashorn/src/jdk/nashorn/internal/ir/LiteralNode.java
author hannesw
Fri, 25 Oct 2013 10:20:49 +0200
changeset 21457 381acbd07fe5
parent 20933 89748612fd1d
child 24719 f726e9d67629
permissions -rw-r--r--
8027042: Evaluation order for binary operators can be improved Reviewed-by: lagergren, 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
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import java.util.Arrays;
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;
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
    31
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import jdk.nashorn.internal.codegen.CompileUnit;
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
    33
import jdk.nashorn.internal.codegen.types.ArrayType;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.codegen.types.Type;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    35
import jdk.nashorn.internal.ir.annotations.Immutable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
    37
import jdk.nashorn.internal.objects.NativeArray;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import jdk.nashorn.internal.parser.Lexer.LexerToken;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
    39
import jdk.nashorn.internal.parser.Token;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import jdk.nashorn.internal.parser.TokenType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import jdk.nashorn.internal.runtime.JSType;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
    42
import jdk.nashorn.internal.runtime.ScriptRuntime;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import jdk.nashorn.internal.runtime.Undefined;
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
 * Literal nodes represent JavaScript values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
 * @param <T> the literal type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
 */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    50
@Immutable
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
    51
public abstract class LiteralNode<T> extends Expression implements PropertyKey {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
    /** Literal value */
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    53
    protected final T value;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
    55
    /** Marker for values that must be computed at runtime */
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
    56
    public static final Object POSTSET_MARKER = new Object();
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
    57
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
    58
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
     * @param value   the value of the literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
    65
    protected LiteralNode(final long token, final int finish, final T value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
    66
        super(token, finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
        this.value = value;
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
     * Copy constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
     * @param literalNode source node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
    protected LiteralNode(final LiteralNode<T> literalNode) {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    76
        this(literalNode, literalNode.value);
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    77
    }
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    78
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    79
    /**
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    80
     * A copy constructor with value change.
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    81
     * @param literalNode the original literal node
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    82
     * @param newValue new value for this node
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    83
     */
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    84
    protected LiteralNode(final LiteralNode<T> literalNode, final T newValue) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
        super(literalNode);
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
    86
        this.value = newValue;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
    public boolean isAtom() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
        return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
     * Check if the literal value is null
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
     * @return true if literal value is null
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
    public boolean isNull() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        return value == null;
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
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
    public Type getType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
        return Type.typeFor(value.getClass());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    public String getPropertyName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
        return JSType.toString(getObject());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
     * Fetch boolean value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
     * @return boolean value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
    public boolean getBoolean() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
        return JSType.toBoolean(value);
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
     * Fetch int32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
     * @return Int32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    public int getInt32() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
        return JSType.toInt32(value);
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
     * Fetch uint32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
     * @return uint32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    public long getUint32() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
        return JSType.toUint32(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
     * Fetch long value of node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
     * @return long value of node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
    public long getLong() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
        return JSType.toLong(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
     * Fetch double value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
     * @return double value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
    public double getNumber() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
        return JSType.toNumber(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
     * Get the array value of the node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
     * @return the array value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
    public Node[] getArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
        assert false : "not an array node";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
        return null;
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
     * Fetch String value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
     * @return String value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    public String getString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
        return JSType.toString(value);
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
     * Fetch Object value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
     * @return Object value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
    public Object getObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
     * Test if the value is a string.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
     * @return True if value is a string.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
    public boolean isString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
        return value instanceof String;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
    /**
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   195
     * Test if tha value is a number
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   196
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   197
     * @return True if value is a number
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   198
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   199
    public boolean isNumeric() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   200
        return value instanceof Number;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   201
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   202
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   203
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
     * Assist in IR navigation.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
     * @param visitor IR navigating visitor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
    @Override
17769
14ea7feaf658 8012522: Clean up lexical contexts - split out stack based functionality in CodeGenerator and generify NodeVisitors based on their LexicalContext type to avoid casts
lagergren
parents: 17523
diff changeset
   209
    public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   210
        if (visitor.enterLiteralNode(this)) {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
   211
            return visitor.leaveLiteralNode(this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
    public void toString(final StringBuilder sb) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
        if (value == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
            sb.append("null");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
            sb.append(value.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
     * Get the literal node value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
     * @return the value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
    public T getValue() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
     * Create a new null literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
     */
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   242
    public static LiteralNode<Object> newInstance(final long token, final int finish) {
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   243
        return new NullLiteralNode(token, finish);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   244
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   245
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   246
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   247
     * Create a new null literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   248
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   249
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   250
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   251
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   252
     */
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   253
    public static LiteralNode<Object> newInstance(final Node parent) {
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   254
        return new NullLiteralNode(parent.getToken(), parent.getFinish());
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   255
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   256
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   257
    /**
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   258
     * Super class for primitive (side-effect free) literals.
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   259
     *
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   260
     * @param <T> the literal type
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   261
     */
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   262
    public static class PrimitiveLiteralNode<T> extends LiteralNode<T> {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   263
        private PrimitiveLiteralNode(final long token, final int finish, final T value) {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   264
            super(token, finish, value);
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   265
        }
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   266
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   267
        private PrimitiveLiteralNode(final PrimitiveLiteralNode<T> literalNode) {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   268
            super(literalNode);
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   269
        }
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   270
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   271
        /**
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   272
         * Check if the literal value is boolean true
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   273
         * @return true if literal value is boolean true
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   274
         */
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   275
        public boolean isTrue() {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   276
            return JSType.toBoolean(value);
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   277
        }
21457
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   278
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   279
        @Override
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   280
        public boolean isLocal() {
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   281
            return true;
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   282
        }
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   283
    }
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   284
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   285
    @Immutable
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   286
    private static final class BooleanLiteralNode extends PrimitiveLiteralNode<Boolean> {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   287
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   288
        private BooleanLiteralNode(final long token, final int finish, final boolean value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   289
            super(Token.recast(token, value ? TokenType.TRUE : TokenType.FALSE), finish, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   290
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   291
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   292
        private BooleanLiteralNode(final BooleanLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   293
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   294
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   295
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   296
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   297
        public boolean isTrue() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   298
            return value;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   299
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   300
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   301
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   302
        public Type getType() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   303
            return Type.BOOLEAN;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   304
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   305
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   306
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   307
        public Type getWidestOperationType() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   308
            return Type.BOOLEAN;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   309
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
     * Create a new boolean literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
     * @param value   true or false
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   321
    public static LiteralNode<Boolean> newInstance(final long token, final int finish, final boolean value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   322
        return new BooleanLiteralNode(token, finish, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   323
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   324
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   325
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   326
     * Create a new boolean literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   327
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   328
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   329
     * @param value  true or false
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   330
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   331
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   332
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   333
    public static LiteralNode<?> newInstance(final Node parent, final boolean value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   334
        return new BooleanLiteralNode(parent.getToken(), parent.getFinish(), value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   335
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   336
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   337
    @Immutable
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   338
    private static final class NumberLiteralNode extends PrimitiveLiteralNode<Number> {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   340
        private final Type type = numberGetType(value);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   341
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   342
        private NumberLiteralNode(final long token, final int finish, final Number value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   343
            super(Token.recast(token, TokenType.DECIMAL), finish, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   344
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   345
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   346
        private NumberLiteralNode(final NumberLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   347
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   348
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   349
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   350
        private static Type numberGetType(final Number number) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   351
            if (number instanceof Integer) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   352
                return Type.INT;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   353
            } else if (number instanceof Long) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   354
                return Type.LONG;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   355
            } else if (number instanceof Double) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   356
                return Type.NUMBER;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   357
            } else {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   358
                assert false;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   361
            return null;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   362
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   363
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   364
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   365
        public Type getType() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   366
            return type;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   367
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   368
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   369
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   370
        public Type getWidestOperationType() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   371
            return getType();
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   372
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   373
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
     * Create a new number literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
     * @param value   literal value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   384
    public static LiteralNode<Number> newInstance(final long token, final int finish, final Number value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   385
        return new NumberLiteralNode(token, finish, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   386
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   388
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   389
     * Create a new number literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   390
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   391
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   392
     * @param value  literal value
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   393
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   394
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   395
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   396
    public static LiteralNode<?> newInstance(final Node parent, final Number value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   397
        return new NumberLiteralNode(parent.getToken(), parent.getFinish(), value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   398
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   400
    private static class UndefinedLiteralNode extends PrimitiveLiteralNode<Undefined> {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   401
        private UndefinedLiteralNode(final long token, final int finish) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   402
            super(Token.recast(token, TokenType.OBJECT), finish, ScriptRuntime.UNDEFINED);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   403
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   405
        private UndefinedLiteralNode(final UndefinedLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   406
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   407
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
     * Create a new undefined literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
     * @param value   undefined value, passed only for polymorphisism discrimination
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   419
    public static LiteralNode<Undefined> newInstance(final long token, final int finish, final Undefined value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   420
        return new UndefinedLiteralNode(token, finish);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   421
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   422
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   423
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   424
     * Create a new null literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   425
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   426
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   427
     * @param value  undefined value
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   428
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   429
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   430
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   431
    public static LiteralNode<?> newInstance(final Node parent, final Undefined value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   432
        return new UndefinedLiteralNode(parent.getToken(), parent.getFinish());
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   433
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   434
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   435
    @Immutable
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   436
    private static class StringLiteralNode extends PrimitiveLiteralNode<String> {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   437
        private StringLiteralNode(final long token, final int finish, final String value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   438
            super(Token.recast(token, TokenType.STRING), finish, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   439
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   440
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   441
        private StringLiteralNode(final StringLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   442
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   443
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   444
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   445
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   446
        public void toString(final StringBuilder sb) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   447
            sb.append('\"');
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   448
            sb.append(value);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   449
            sb.append('\"');
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   450
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
     * Create a new string literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
     * @param value   string value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   462
    public static LiteralNode<String> newInstance(final long token, final int finish, final String value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   463
        return new StringLiteralNode(token, finish, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   464
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   465
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   466
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   467
     * Create a new String literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   468
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   469
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   470
     * @param value  string value
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   471
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   472
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   473
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   474
    public static LiteralNode<?> newInstance(final Node parent, final String value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   475
        return new StringLiteralNode(parent.getToken(), parent.getFinish(), value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   476
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   478
    @Immutable
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   479
    private static class LexerTokenLiteralNode extends LiteralNode<LexerToken> {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   480
        private LexerTokenLiteralNode(final long token, final int finish, final LexerToken value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   481
            super(Token.recast(token, TokenType.STRING), finish, value); //TODO is string the correct token type here?
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   482
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   483
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   484
        private LexerTokenLiteralNode(final LexerTokenLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   485
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   486
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   487
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   488
        @Override
16215
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   489
        public Type getType() {
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   490
            return Type.OBJECT;
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   491
        }
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   492
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   493
        @Override
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   494
        public void toString(final StringBuilder sb) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   495
            sb.append(value.toString());
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   496
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
     * Create a new literal node for a lexer token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   502
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
     * @param value   lexer token value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   508
    public static LiteralNode<LexerToken> newInstance(final long token, final int finish, final LexerToken value) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   509
        return new LexerTokenLiteralNode(token, finish, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
    /**
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   513
     * Create a new lexer token literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   514
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   515
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   516
     * @param value  lexer token
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   517
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   518
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   519
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   520
    public static LiteralNode<?> newInstance(final Node parent, final LexerToken value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   521
        return new LexerTokenLiteralNode(parent.getToken(), parent.getFinish(), value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   522
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   523
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   524
    /**
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   525
     * Get the constant value for an object, or {@link #POSTSET_MARKER} if the value can't be statically computed.
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   526
     *
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   527
     * @param object a node or value object
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   528
     * @return the constant value or {@code POSTSET_MARKER}
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   529
     */
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   530
    public static Object objectAsConstant(final Object object) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   531
        if (object == null) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   532
            return null;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   533
        } else if (object instanceof Number || object instanceof String || object instanceof Boolean) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   534
            return object;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   535
        } else if (object instanceof LiteralNode) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   536
            return objectAsConstant(((LiteralNode<?>)object).getValue());
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   537
        }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   538
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   539
        return POSTSET_MARKER;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   540
    }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   541
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   542
    private static final class NullLiteralNode extends PrimitiveLiteralNode<Object> {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   543
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   544
        private NullLiteralNode(final long token, final int finish) {
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   545
            super(Token.recast(token, TokenType.OBJECT), finish, null);
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
   546
        }
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
   547
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   548
        @Override
17769
14ea7feaf658 8012522: Clean up lexical contexts - split out stack based functionality in CodeGenerator and generify NodeVisitors based on their LexicalContext type to avoid casts
lagergren
parents: 17523
diff changeset
   549
        public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   550
            if (visitor.enterLiteralNode(this)) {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
   551
                return visitor.leaveLiteralNode(this);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   552
            }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   553
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   554
            return this;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   555
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   556
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   557
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   558
        public Type getType() {
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   559
            return Type.OBJECT;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   560
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   561
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   562
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   563
        public Type getWidestOperationType() {
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   564
            return Type.OBJECT;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   565
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
     * Array literal node class.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   571
    public static final class ArrayLiteralNode extends LiteralNode<Expression[]> {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
        /** Array element type. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
        private Type elementType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
        /** Preset constant array. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
        private Object presets;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
        /** Indices of array elements requiring computed post sets. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
        private int[] postsets;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
        private List<ArrayUnit> units;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
         * An ArrayUnit is a range in an ArrayLiteral. ArrayLiterals can
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
         * be split if they are too large, for bytecode generation reasons
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
        public static class ArrayUnit {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
            /** Compile unit associated with the postsets range. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
            private final CompileUnit compileUnit;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
            /** postsets range associated with the unit (hi not inclusive). */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
            private final int lo, hi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
            /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
             * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
             * @param compileUnit compile unit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
             * @param lo lowest array index in unit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
             * @param hi highest array index in unit + 1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
             */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
            public ArrayUnit(final CompileUnit compileUnit, final int lo, final int hi) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
                this.compileUnit = compileUnit;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
                this.lo   = lo;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
                this.hi   = hi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
            /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   608
             * Get the high index position of the ArrayUnit (non inclusive)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
             * @return high index position
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
             */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
            public int getHi() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
                return hi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
            /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
             * Get the low index position of the ArrayUnit (inclusive)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
             * @return low index position
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
             */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
            public int getLo() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
                return lo;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
            /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
             * The array compile unit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
             * @return array compile unit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
             */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
            public CompileUnit getCompileUnit() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
                return compileUnit;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
         * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   634
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
         * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   636
         * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
         * @param value   array literal value, a Node array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
         */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   639
        protected ArrayLiteralNode(final long token, final int finish, final Expression[] value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   640
            super(Token.recast(token, TokenType.ARRAY), finish, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
            this.elementType = Type.UNKNOWN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
         * Copy constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
         * @param node source array literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
         */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   648
        private ArrayLiteralNode(final ArrayLiteralNode node, final Expression[] value) {
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
   649
            super(node, value);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   650
            this.elementType = node.elementType;
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
   651
            this.presets     = node.presets;
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
   652
            this.postsets    = node.postsets;
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
   653
            this.units       = node.units;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
         * Compute things like widest element type needed. Internal use from compiler only
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
        public void analyze() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
            elementType = Type.INT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
            analyzeElements();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
18633
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   663
            if (elementType.isInteger()) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
                presetIntArray();
18633
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   665
            } else if (elementType.isLong()) {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   666
                presetLongArray();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
            } else if (elementType.isNumeric()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
                presetNumberArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
                presetObjectArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
        private void presetIntArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
            final int[] array = new int[value.length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
            final int[] computed = new int[value.length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
            int nComputed = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
            for (int i = 0; i < value.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
                final Object element = objectAsConstant(value[i]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
                if (element instanceof Number) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
                    array[i] = ((Number)element).intValue();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
                    computed[nComputed++] = i;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
            presets = array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
            postsets = Arrays.copyOf(computed, nComputed);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
18633
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   693
        private void presetLongArray() {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   694
            final long[] array = new long[value.length];
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   695
            final int[] computed = new int[value.length];
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   696
            int nComputed = 0;
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   697
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   698
            for (int i = 0; i < value.length; i++) {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   699
                final Object element = objectAsConstant(value[i]);
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   700
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   701
                if (element instanceof Number) {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   702
                    array[i] = ((Number)element).longValue();
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   703
                } else {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   704
                    computed[nComputed++] = i;
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   705
                }
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   706
            }
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   707
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   708
            presets = array;
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   709
            postsets = Arrays.copyOf(computed, nComputed);
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   710
        }
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   711
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
        private void presetNumberArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
            final double[] array = new double[value.length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
            final int[] computed = new int[value.length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
            int nComputed = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   717
            for (int i = 0; i < value.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   718
                final Object element = objectAsConstant(value[i]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   720
                if (element instanceof Number) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
                    array[i] = ((Number)element).doubleValue();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
                    computed[nComputed++] = i;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
            presets = array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
            postsets = Arrays.copyOf(computed, nComputed);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
        private void presetObjectArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
            final Object[] array = new Object[value.length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
            final int[] computed = new int[value.length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
            int nComputed = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
            for (int i = 0; i < value.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
                final Node node = value[i];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
                if (node == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   740
                    computed[nComputed++] = i;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
                    final Object element = objectAsConstant(node);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
                    if (element != POSTSET_MARKER) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
                        array[i] = element;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   746
                    } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   747
                        computed[nComputed++] = i;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   748
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   749
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   750
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
            presets = array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   753
            postsets = Arrays.copyOf(computed, nComputed);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   756
        private void analyzeElements() {
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   757
            for (final Expression node : value) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
                if (node == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
                    elementType = elementType.widest(Type.OBJECT); //no way to represent undefined as number
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   761
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
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
   763
                assert node.getSymbol() != null; //don't run this on unresolved nodes or you are in trouble
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
   764
                Type symbolType = node.getSymbol().getSymbolType();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
                if (symbolType.isUnknown()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
                    symbolType = Type.OBJECT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   767
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   769
                if (symbolType.isBoolean()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
                    elementType = elementType.widest(Type.OBJECT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
                elementType = elementType.widest(symbolType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
                if (elementType.isObject()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
        public Node[] getArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
            return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
20933
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   787
        /**
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   788
         * Get the array element type as Java format, e.g. [I
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   789
         * @return array element type
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   790
         */
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   791
        public ArrayType getArrayType() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
            if (elementType.isInteger()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
                return Type.INT_ARRAY;
18633
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   794
            } else if (elementType.isLong()) {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   795
                return Type.LONG_ARRAY;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
            } else if (elementType.isNumeric()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   797
                return Type.NUMBER_ARRAY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   799
                return Type.OBJECT_ARRAY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   800
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   801
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   802
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   803
        @Override
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   804
        public Type getType() {
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   805
            return Type.typeFor(NativeArray.class);
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   806
        }
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   807
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
         * Get the element type of this array literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   810
         * @return element type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   811
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   812
        public Type getElementType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   813
            return elementType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   814
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   815
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   816
        /**
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
   817
         * Get indices of arrays containing computed post sets. post sets
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
   818
         * are things like non literals e.g. "x+y" instead of i or 17
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
         * @return post set indices
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   820
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
        public int[] getPostsets() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
            return postsets;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   823
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
         * Get presets constant array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   827
         * @return presets array, always returns an array type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   828
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
        public Object getPresets() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
            return presets;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   833
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   834
         * Get the array units that make up this ArrayLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   835
         * @see ArrayUnit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   836
         * @return list of array units
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   837
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   838
        public List<ArrayUnit> getUnits() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   839
            return units == null ? null : Collections.unmodifiableList(units);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   840
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   841
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   842
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   843
         * Set the ArrayUnits that make up this ArrayLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   844
         * @see ArrayUnit
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   845
         * @param units list of array units
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   846
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   847
        public void setUnits(final List<ArrayUnit> units) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
            this.units = units;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   850
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   851
        @Override
17769
14ea7feaf658 8012522: Clean up lexical contexts - split out stack based functionality in CodeGenerator and generify NodeVisitors based on their LexicalContext type to avoid casts
lagergren
parents: 17523
diff changeset
   852
        public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   853
            if (visitor.enterLiteralNode(this)) {
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   854
                final List<Expression> oldValue = Arrays.asList(value);
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   855
                final List<Expression> newValue = Node.accept(visitor, Expression.class, oldValue);
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
   856
                return visitor.leaveLiteralNode(oldValue != newValue ? setValue(newValue) : this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
            return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   859
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   860
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   861
        private ArrayLiteralNode setValue(final List<Expression> value) {
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   862
            return new ArrayLiteralNode(this, value.toArray(new Expression[value.size()]));
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
   863
        }
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
   864
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   865
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
        public void toString(final StringBuilder sb) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
            sb.append('[');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
            boolean first = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   869
            for (final Node node : value) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   870
                if (!first) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   871
                    sb.append(',');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   872
                    sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   874
                if (node == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   875
                    sb.append("undefined");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
                    node.toString(sb);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   879
                first = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   880
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   881
            sb.append(']');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   883
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   884
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   886
     * Create a new array literal of Nodes from a list of Node values
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   887
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   888
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   889
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   890
     * @param value   literal value list
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   892
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   893
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   894
    public static LiteralNode<Expression[]> newInstance(final long token, final int finish, final List<Expression> value) {
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   895
        return new ArrayLiteralNode(token, finish, value.toArray(new Expression[value.size()]));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   898
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   899
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   900
     * Create a new array literal based on a parent node (source, token, finish)
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   901
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   902
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   903
     * @param value  literal value list
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   904
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   905
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   906
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   907
    public static LiteralNode<?> newInstance(final Node parent, final List<Expression> value) {
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   908
        return new ArrayLiteralNode(parent.getToken(), parent.getFinish(), value.toArray(new Expression[value.size()]));
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   909
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   910
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   911
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
     * Create a new array literal of Nodes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
     * @param value   literal value array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   920
    public static LiteralNode<Expression[]> newInstance(final long token, final int finish, final Expression[] value) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   921
        return new ArrayLiteralNode(token, finish, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   922
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
}