nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LiteralNode.java
author hannesw
Sat, 19 Sep 2015 16:04:28 +0200
changeset 32781 d8f34ffbbc7a
parent 32534 b3ec7f3b3c2a
child 34732 6605efbe8447
permissions -rw-r--r--
8135190: Method code too large in Babel browser.js script Reviewed-by: attila, sundar
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
import jdk.nashorn.internal.codegen.types.ArrayType;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import jdk.nashorn.internal.codegen.types.Type;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    33
import jdk.nashorn.internal.ir.annotations.Immutable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
    35
import jdk.nashorn.internal.objects.NativeArray;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
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
    37
import jdk.nashorn.internal.parser.Token;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import jdk.nashorn.internal.parser.TokenType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
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
    40
import jdk.nashorn.internal.runtime.ScriptRuntime;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import jdk.nashorn.internal.runtime.Undefined;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
 * Literal nodes represent JavaScript values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
 * @param <T> the literal type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
 */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    48
@Immutable
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
    49
public abstract class LiteralNode<T> extends Expression implements PropertyKey {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
    50
    private static final long serialVersionUID = 1L;
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
    51
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
    /**
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    90
     * Initialization setter, if required for immutable state. This is used for
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    91
     * things like ArrayLiteralNodes that need to carry state for the splitter.
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    92
     * Default implementation is just a nop.
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    93
     * @param lc lexical context
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    94
     * @return new literal node with initialized state, or same if nothing changed
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    95
     */
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    96
    public LiteralNode<?> initialize(final LexicalContext lc) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    97
        return this;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    98
    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
    99
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   100
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
     * Check if the literal value is null
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
     * @return true if literal value is null
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    public boolean isNull() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        return value == null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   109
    public Type getType() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
        return Type.typeFor(value.getClass());
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
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    public String getPropertyName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        return JSType.toString(getObject());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
     * Fetch boolean value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
     * @return boolean value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
    public boolean getBoolean() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
        return JSType.toBoolean(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
     * Fetch int32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
     * @return Int32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    public int getInt32() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
        return JSType.toInt32(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
     * Fetch uint32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
     * @return uint32 value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
    public long getUint32() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
        return JSType.toUint32(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
     * Fetch long value of node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
     * @return long value of node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    public long getLong() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        return JSType.toLong(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
     * Fetch double value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
     * @return double value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
    public double getNumber() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
        return JSType.toNumber(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
     * Fetch String value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
     * @return String value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
    public String getString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
        return JSType.toString(value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
     * Fetch Object value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
     * @return Object value of node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
    public Object getObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
    /**
29407
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   182
     * Test if the value is an array
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   183
     *
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   184
     * @return True if value is an array
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   185
     */
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   186
    public boolean isArray() {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   187
        return false;
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   188
    }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   189
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   190
    public List<Expression> getElementExpressions() {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   191
        return null;
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   192
    }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   193
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   194
    /**
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   195
     * Test if the value is a boolean.
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   196
     *
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   197
     * @return True if value is a boolean.
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   198
     */
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   199
    public boolean isBoolean() {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   200
        return value instanceof Boolean;
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   201
    }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   202
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   203
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
     * Test if the value is a string.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
     * @return True if value is a string.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
    public boolean isString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
        return value instanceof String;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    /**
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   213
     * 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
   214
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   215
     * @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
   216
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   217
    public boolean isNumeric() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   218
        return value instanceof Number;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   219
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   220
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   221
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
     * Assist in IR navigation.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
     * @param visitor IR navigating visitor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
    @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
   227
    public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   228
        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
   229
            return visitor.leaveLiteralNode(this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
        return this;
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
    @Override
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   236
    public void toString(final StringBuilder sb, final boolean printType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
        if (value == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
            sb.append("null");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
            sb.append(value.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
     * Get the literal node value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
     * @return the value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
     */
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   248
    public final T getValue() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26500
diff changeset
   252
    private static Expression[] valueToArray(final List<Expression> value) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26500
diff changeset
   253
        return value.toArray(new Expression[value.size()]);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26500
diff changeset
   254
    }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26500
diff changeset
   255
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
     * Create a new null literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
     */
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   264
    public static LiteralNode<Object> newInstance(final long token, final int finish) {
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   265
        return new NullLiteralNode(token, finish);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   266
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   267
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   268
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   269
     * 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
   270
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   271
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   272
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   273
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   274
     */
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   275
    public static LiteralNode<Object> newInstance(final Node parent) {
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   276
        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
   277
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   278
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   279
    /**
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   280
     * Super class for primitive (side-effect free) literals.
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   281
     *
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   282
     * @param <T> the literal type
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
    public static class PrimitiveLiteralNode<T> extends LiteralNode<T> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   285
        private static final long serialVersionUID = 1L;
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   286
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   287
        private PrimitiveLiteralNode(final long token, final int finish, final T value) {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   288
            super(token, finish, value);
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   289
        }
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   290
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   291
        private PrimitiveLiteralNode(final PrimitiveLiteralNode<T> literalNode) {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   292
            super(literalNode);
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   293
        }
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   294
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   295
        /**
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   296
         * Check if the literal value is boolean true
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   297
         * @return true if literal value is boolean true
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   298
         */
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   299
        public boolean isTrue() {
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   300
            return JSType.toBoolean(value);
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   301
        }
21457
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   302
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   303
        @Override
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   304
        public boolean isLocal() {
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   305
            return true;
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20933
diff changeset
   306
        }
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   307
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   308
        @Override
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   309
        public boolean isAlwaysFalse() {
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   310
            return !isTrue();
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   311
        }
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   312
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   313
        @Override
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   314
        public boolean isAlwaysTrue() {
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   315
            return isTrue();
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   316
        }
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   317
    }
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   318
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   319
    @Immutable
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   320
    private static final class BooleanLiteralNode extends PrimitiveLiteralNode<Boolean> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   321
        private static final long serialVersionUID = 1L;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   322
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   323
        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
   324
            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
   325
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   326
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   327
        private BooleanLiteralNode(final BooleanLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   328
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   329
        }
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
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   332
        public boolean isTrue() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   333
            return value;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   334
        }
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
        @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   337
        public Type getType() {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   338
            return Type.BOOLEAN;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   339
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   340
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   341
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   342
        public Type getWidestOperationType() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   343
            return Type.BOOLEAN;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   344
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
     * Create a new boolean literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
     * @param value   true or false
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   356
    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
   357
        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
   358
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   359
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   360
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   361
     * 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
   362
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   363
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   364
     * @param value  true or false
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   365
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   366
     * @return the new literal node
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
    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
   369
        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
   370
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   371
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   372
    @Immutable
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   373
    private static final class NumberLiteralNode extends PrimitiveLiteralNode<Number> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   374
        private static final long serialVersionUID = 1L;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   376
        private final Type type = numberGetType(value);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   377
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   378
        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
   379
            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
   380
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   381
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   382
        private NumberLiteralNode(final NumberLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   383
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   384
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   385
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   386
        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
   387
            if (number instanceof Integer) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   388
                return Type.INT;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   389
            } else if (number instanceof Long) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   390
                return Type.LONG;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   391
            } else if (number instanceof Double) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   392
                return Type.NUMBER;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   393
            } else {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   394
                assert false;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   397
            return null;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   398
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   399
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   400
        @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   401
        public Type getType() {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   402
            return type;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   403
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   404
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   405
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   406
        public Type getWidestOperationType() {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   407
            return getType();
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   408
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   409
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
     * Create a new number literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
     * @param value   literal value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   420
    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
   421
        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
   422
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   424
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   425
     * 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
   426
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   427
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   428
     * @param value  literal value
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   429
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   430
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   431
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   432
    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
   433
        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
   434
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   436
    private static class UndefinedLiteralNode extends PrimitiveLiteralNode<Undefined> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   437
        private static final long serialVersionUID = 1L;
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   438
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   439
        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
   440
            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
   441
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   443
        private UndefinedLiteralNode(final UndefinedLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   444
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   445
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
     * Create a new undefined literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
     * @param finish  finish
32534
b3ec7f3b3c2a 8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents: 29407
diff changeset
   453
     * @param value   undefined value, passed only for polymorphism discrimination
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   457
    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
   458
        return new UndefinedLiteralNode(token, finish);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   459
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   460
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   461
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   462
     * 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
   463
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   464
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   465
     * @param value  undefined value
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
     * @return the new literal node
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
    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
   470
        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
   471
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   472
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   473
    @Immutable
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   474
    private static class StringLiteralNode extends PrimitiveLiteralNode<String> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   475
        private static final long serialVersionUID = 1L;
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   476
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   477
        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
   478
            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
   479
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   480
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   481
        private StringLiteralNode(final StringLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   482
            super(literalNode);
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
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   485
        @Override
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   486
        public void toString(final StringBuilder sb, final boolean printType) {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   487
            sb.append('\"');
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   488
            sb.append(value);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   489
            sb.append('\"');
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   490
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   494
     * Create a new string literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
     * @param value   string value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   502
    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
   503
        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
   504
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   505
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   506
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   507
     * 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
   508
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   509
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   510
     * @param value  string value
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   511
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   512
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   513
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   514
    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
   515
        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
   516
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   518
    @Immutable
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   519
    private static class LexerTokenLiteralNode extends LiteralNode<LexerToken> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   520
        private static final long serialVersionUID = 1L;
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   521
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   522
        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
   523
            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
   524
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   525
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   526
        private LexerTokenLiteralNode(final LexerTokenLiteralNode literalNode) {
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   527
            super(literalNode);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   528
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   529
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   530
        @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   531
        public Type getType() {
16215
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   532
            return Type.OBJECT;
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   533
        }
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   534
92f00bfd6059 8007523: VerifyError on script that uses regular expression literals with ternary operator
sundar
parents: 16201
diff changeset
   535
        @Override
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   536
        public void toString(final StringBuilder sb, final boolean printType) {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   537
            sb.append(value.toString());
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   538
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
     * Create a new literal node for a lexer token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
     * @param value   lexer token value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   550
    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
   551
        return new LexerTokenLiteralNode(token, finish, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
    /**
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   555
     * 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
   556
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   557
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   558
     * @param value  lexer token
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   559
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   560
     * @return the new literal node
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
    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
   563
        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
   564
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   565
18852
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   566
    /**
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   567
     * 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
   568
     *
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   569
     * @param object a node or value object
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   570
     * @return the constant value or {@code POSTSET_MARKER}
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   571
     */
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   572
    public static Object objectAsConstant(final Object object) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   573
        if (object == null) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   574
            return null;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   575
        } 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
   576
            return object;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   577
        } else if (object instanceof LiteralNode) {
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   578
            return objectAsConstant(((LiteralNode<?>)object).getValue());
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   579
        }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   580
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   581
        return POSTSET_MARKER;
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   582
    }
604c1d681b6f 8017084: Use spill properties for large object literals
hannesw
parents: 18633
diff changeset
   583
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   584
    /**
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   585
     * Test whether {@code object} represents a constant value.
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   586
     * @param object a node or value object
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   587
     * @return true if object is a constant value
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   588
     */
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   589
    public static boolean isConstant(final Object object) {
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   590
        return objectAsConstant(object) != POSTSET_MARKER;
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   591
    }
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   592
20572
7bceef30eefa 8026042: FoldConstants need to guard against ArrayLiteralNode
hannesw
parents: 18867
diff changeset
   593
    private static final class NullLiteralNode extends PrimitiveLiteralNode<Object> {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   594
        private static final long serialVersionUID = 1L;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   595
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   596
        private NullLiteralNode(final long token, final int finish) {
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   597
            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
   598
        }
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16215
diff changeset
   599
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   600
        @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
   601
        public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   602
            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
   603
                return visitor.leaveLiteralNode(this);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   604
            }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   605
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   606
            return this;
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   607
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   608
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   609
        @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   610
        public Type getType() {
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   611
            return Type.OBJECT;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   612
        }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   613
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   614
        @Override
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   615
        public Type getWidestOperationType() {
17967
0ac7d2a303b9 8015693: reduce NodeLiteralNode to NullLiteralNode
attila
parents: 17769
diff changeset
   616
            return Type.OBJECT;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   617
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
     * Array literal node class.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
     */
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   623
    @Immutable
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   624
    public static final class ArrayLiteralNode extends LiteralNode<Expression[]> implements LexicalContextNode, Splittable {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 26768
diff changeset
   625
        private static final long serialVersionUID = 1L;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
        /** Array element type. */
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   628
        private final Type elementType;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
        /** Preset constant array. */
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   631
        private final Object presets;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
        /** Indices of array elements requiring computed post sets. */
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   634
        private final int[] postsets;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   636
        /** Ranges for splitting up large literals in code generation */
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   637
        private final List<Splittable.SplitRange> splitRanges;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
29407
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   639
        @Override
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   640
        public boolean isArray() {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   641
            return true;
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   642
        }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   643
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   644
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   645
        private static final class ArrayLiteralInitializer {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   646
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   647
            static ArrayLiteralNode initialize(final ArrayLiteralNode node) {
27206
d4a707c9db5a 8059844: Implement optimistic splitter
attila
parents: 27204
diff changeset
   648
                final Type elementType = computeElementType(node.value);
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   649
                final int[] postsets = computePostsets(node.value);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   650
                final Object presets = computePresets(node.value, elementType, postsets);
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   651
                return new ArrayLiteralNode(node, node.value, elementType, postsets, presets, node.splitRanges);
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   652
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   653
27206
d4a707c9db5a 8059844: Implement optimistic splitter
attila
parents: 27204
diff changeset
   654
            private static Type computeElementType(final Expression[] value) {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   655
                Type widestElementType = Type.INT;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   656
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   657
                for (final Expression elem : value) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   658
                    if (elem == null) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   659
                        widestElementType = widestElementType.widest(Type.OBJECT); //no way to represent undefined as number
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   660
                        break;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   661
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   662
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   663
                    final Type type = elem.getType().isUnknown() ? Type.OBJECT : elem.getType();
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   664
                    if (type.isBoolean()) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   665
                        //TODO fix this with explicit boolean types
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   666
                        widestElementType = widestElementType.widest(Type.OBJECT);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   667
                        break;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   668
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   669
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   670
                    widestElementType = widestElementType.widest(type);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   671
                    if (widestElementType.isObject()) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   672
                        break;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   673
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   674
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   675
                return widestElementType;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   676
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   677
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   678
            private static int[] computePostsets(final Expression[] value) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   679
                final int[] computed = new int[value.length];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   680
                int nComputed = 0;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   681
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   682
                for (int i = 0; i < value.length; i++) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   683
                    final Expression element = value[i];
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   684
                    if (element == null || !isConstant(element)) {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   685
                        computed[nComputed++] = i;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   686
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   687
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   688
                return Arrays.copyOf(computed, nComputed);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   689
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   690
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   691
            private static boolean setArrayElement(final int[] array, final int i, final Object n) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   692
                if (n instanceof Number) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   693
                    array[i] = ((Number)n).intValue();
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   694
                    return true;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   695
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   696
                return false;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   697
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   698
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   699
            private static boolean setArrayElement(final long[] array, final int i, final Object n) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   700
                if (n instanceof Number) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   701
                    array[i] = ((Number)n).longValue();
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   702
                    return true;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   703
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   704
                return false;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   705
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   706
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   707
            private static boolean setArrayElement(final double[] array, final int i, final Object n) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   708
                if (n instanceof Number) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   709
                    array[i] = ((Number)n).doubleValue();
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   710
                    return true;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   711
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   712
                return false;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   713
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   714
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   715
            private static int[] presetIntArray(final Expression[] value, final int[] postsets) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   716
                final int[] array = new int[value.length];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   717
                int nComputed = 0;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   718
                for (int i = 0; i < value.length; i++) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   719
                    if (!setArrayElement(array, i, objectAsConstant(value[i]))) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   720
                        assert postsets[nComputed++] == i;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   721
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   722
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   723
                assert postsets.length == nComputed;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   724
                return array;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   725
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   726
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   727
            private static long[] presetLongArray(final Expression[] value, final int[] postsets) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   728
                final long[] array = new long[value.length];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   729
                int nComputed = 0;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   730
                for (int i = 0; i < value.length; i++) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   731
                    if (!setArrayElement(array, i, objectAsConstant(value[i]))) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   732
                        assert postsets[nComputed++] == i;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   733
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   734
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   735
                assert postsets.length == nComputed;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   736
                return array;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   737
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   738
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   739
            private static double[] presetDoubleArray(final Expression[] value, final int[] postsets) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   740
                final double[] array = new double[value.length];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   741
                int nComputed = 0;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   742
                for (int i = 0; i < value.length; i++) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   743
                    if (!setArrayElement(array, i, objectAsConstant(value[i]))) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   744
                        assert postsets[nComputed++] == i;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   745
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   746
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   747
                assert postsets.length == nComputed;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   748
                return array;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   749
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   750
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   751
            private static Object[] presetObjectArray(final Expression[] value, final int[] postsets) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   752
                final Object[] array = new Object[value.length];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   753
                int nComputed = 0;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   754
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   755
                for (int i = 0; i < value.length; i++) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   756
                    final Node node = value[i];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   757
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   758
                    if (node == null) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   759
                        assert postsets[nComputed++] == i;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   760
                        continue;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   761
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   762
                    final Object element = objectAsConstant(node);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   763
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   764
                    if (element != POSTSET_MARKER) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   765
                        array[i] = element;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   766
                    } else {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   767
                        assert postsets[nComputed++] == i;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   768
                    }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   769
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   770
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   771
                assert postsets.length == nComputed;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   772
                return array;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   773
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   774
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   775
            static Object computePresets(final Expression[] value, final Type elementType, final int[] postsets) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   776
                assert !elementType.isUnknown();
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   777
                if (elementType.isInteger()) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   778
                    return presetIntArray(value, postsets);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   779
                } else if (elementType.isLong()) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   780
                    return presetLongArray(value, postsets);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   781
                } else if (elementType.isNumeric()) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   782
                    return presetDoubleArray(value, postsets);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   783
                } else {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   784
                    return presetObjectArray(value, postsets);
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   785
                }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   786
            }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   787
        }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   788
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   789
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   790
         * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   791
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
         * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
         * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
         * @param value   array literal value, a Node array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
         */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   796
        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
   797
            super(Token.recast(token, TokenType.ARRAY), finish, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
            this.elementType = Type.UNKNOWN;
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   799
            this.presets     = null;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   800
            this.postsets    = null;
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   801
            this.splitRanges = null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   802
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   803
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   804
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   805
         * Copy constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
         * @param node source array literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   807
         */
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   808
        private ArrayLiteralNode(final ArrayLiteralNode node, final Expression[] value, final Type elementType, final int[] postsets, final Object presets, final List<Splittable.SplitRange> splitRanges) {
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
   809
            super(node, value);
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   810
            this.elementType = elementType;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   811
            this.postsets    = postsets;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   812
            this.presets     = presets;
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   813
            this.splitRanges = splitRanges;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   814
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   815
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   816
        /**
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   817
         * Returns a list of array element expressions. Note that empty array elements manifest themselves as
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   818
         * null.
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   819
         * @return a list of array element expressions.
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   820
         */
29407
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 28130
diff changeset
   821
        @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   822
        public List<Expression> getElementExpressions() {
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   823
            return Collections.unmodifiableList(Arrays.asList(value));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
20933
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   826
        /**
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   827
         * Setter that initializes all code generation meta data for an
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   828
         * ArrayLiteralNode. This acts a setter, so the return value may
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   829
         * return a new node and must be handled
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   830
         *
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   831
         * @param lc lexical context
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   832
         * @return new array literal node with postsets, presets and element types initialized
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   833
         */
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   834
        @Override
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   835
        public ArrayLiteralNode initialize(final LexicalContext lc) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   836
            return Node.replaceInLexicalContext(lc, this, ArrayLiteralInitializer.initialize(this));
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   837
        }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   838
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   839
        /**
20933
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   840
         * Get the array element type as Java format, e.g. [I
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   841
         * @return array element type
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20928
diff changeset
   842
         */
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   843
        public ArrayType getArrayType() {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21457
diff changeset
   844
            return getArrayType(getElementType());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21457
diff changeset
   845
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21457
diff changeset
   846
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21457
diff changeset
   847
        private static ArrayType getArrayType(final Type elementType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
            if (elementType.isInteger()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
                return Type.INT_ARRAY;
18633
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   850
            } else if (elementType.isLong()) {
c2138d47b2c6 8017082: Long array literals were slightly broken
lagergren
parents: 17967
diff changeset
   851
                return Type.LONG_ARRAY;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   852
            } else if (elementType.isNumeric()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   853
                return Type.NUMBER_ARRAY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   854
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   855
                return Type.OBJECT_ARRAY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   856
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   859
        @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27206
diff changeset
   860
        public Type getType() {
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   861
            return Type.typeFor(NativeArray.class);
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   862
        }
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20572
diff changeset
   863
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   864
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   865
         * Get the element type of this array literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
         * @return element type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
        public Type getElementType() {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   869
            assert !elementType.isUnknown() : this + " has elementType=unknown";
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   870
            return elementType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   871
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   872
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
        /**
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
   874
         * 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
   875
         * are things like non literals e.g. "x+y" instead of i or 17
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
         * @return post set indices
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
        public int[] getPostsets() {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   879
            assert postsets != null : this + " elementType=" + elementType + " has no postsets";
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   880
            return postsets;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   881
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21457
diff changeset
   882
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   883
        private boolean presetsMatchElementType() {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   884
            if (elementType == Type.INT) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   885
                return presets instanceof int[];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   886
            } else if (elementType == Type.LONG) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   887
                return presets instanceof long[];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   888
            } else if (elementType == Type.NUMBER) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   889
                return presets instanceof double[];
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   890
            } else {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   891
                return presets instanceof Object[];
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21457
diff changeset
   892
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   893
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   894
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   895
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
         * Get presets constant array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
         * @return presets array, always returns an array type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   899
        public Object getPresets() {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   900
            assert presets != null && presetsMatchElementType() : this + " doesn't have presets, or invalid preset type: " + presets;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
            return presets;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
        /**
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   905
         * Get the split ranges for this ArrayLiteral, or null if this array does not have to be split.
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   906
         * @see Splittable.SplitRange
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   907
         * @return list of split ranges
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
         */
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   909
        @Override
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   910
        public List<Splittable.SplitRange> getSplitRanges() {
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   911
            return splitRanges == null ? null : Collections.unmodifiableList(splitRanges);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
        /**
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   915
         * Set the SplitRanges that make up this ArrayLiteral
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   916
         * @param lc lexical context
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   917
         * @see Splittable.SplitRange
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   918
         * @param splitRanges list of split ranges
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   919
         * @return new or changed node
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
         */
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   921
        public ArrayLiteralNode setSplitRanges(final LexicalContext lc, final List<Splittable.SplitRange> splitRanges) {
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   922
            if (this.splitRanges == splitRanges) {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   923
                return this;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   924
            }
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   925
            return Node.replaceInLexicalContext(lc, this, new ArrayLiteralNode(this, value, elementType, postsets, presets, splitRanges));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   927
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
        @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
   929
        public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   930
            return Acceptor.accept(this, visitor);
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   931
        }
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   932
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   933
        @Override
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   934
        public Node accept(final LexicalContext lc, final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   935
            if (visitor.enterLiteralNode(this)) {
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   936
                final List<Expression> oldValue = Arrays.asList(value);
25821
fbb51e67d2a7 8048869: Reduce compile time by about 5% by removing the Class.casts from the AST nodes
lagergren
parents: 25234
diff changeset
   937
                final List<Expression> newValue = Node.accept(visitor, oldValue);
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   938
                return visitor.leaveLiteralNode(oldValue != newValue ? setValue(lc, newValue) : this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   939
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   940
            return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   941
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   942
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   943
        private ArrayLiteralNode setValue(final LexicalContext lc, final Expression[] value) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   944
            if (this.value == value) {
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   945
                return this;
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   946
            }
32781
d8f34ffbbc7a 8135190: Method code too large in Babel browser.js script
hannesw
parents: 32534
diff changeset
   947
            return Node.replaceInLexicalContext(lc, this, new ArrayLiteralNode(this, value, elementType, postsets, presets, splitRanges));
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   948
        }
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   949
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24719
diff changeset
   950
        private ArrayLiteralNode setValue(final LexicalContext lc, final List<Expression> value) {
25234
e2f9df6b8797 8047078: Fuzzing bug discovered when ArrayLiteralNodes weren't immutable
lagergren
parents: 24778
diff changeset
   951
            return setValue(lc, 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
   952
        }
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
   953
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   954
        @Override
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   955
        public void toString(final StringBuilder sb, final boolean printType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   956
            sb.append('[');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
            boolean first = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   958
            for (final Node node : value) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
                if (!first) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
                    sb.append(',');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   961
                    sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   963
                if (node == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
                    sb.append("undefined");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   965
                } else {
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   966
                    node.toString(sb, printType);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
                first = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   970
            sb.append(']');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   971
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   972
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   973
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   974
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   975
     * Create a new array literal of Nodes from a list of Node values
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   976
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   977
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   978
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   979
     * @param value   literal value list
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   980
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   981
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   982
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   983
    public static LiteralNode<Expression[]> newInstance(final long token, final int finish, final List<Expression> value) {
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26500
diff changeset
   984
        return new ArrayLiteralNode(token, finish, valueToArray(value));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   985
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   986
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   987
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   988
     * 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
   989
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   990
     * @param parent parent node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   991
     * @param value  literal value list
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   992
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   993
     * @return the new literal node
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   994
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
   995
    public static LiteralNode<?> newInstance(final Node parent, final List<Expression> value) {
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26500
diff changeset
   996
        return new ArrayLiteralNode(parent.getToken(), parent.getFinish(), valueToArray(value));
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   997
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   998
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   999
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1000
     * Create a new array literal of Nodes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1001
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1002
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1003
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1004
     * @param value   literal value array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1005
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1006
     * @return the new literal node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1007
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18852
diff changeset
  1008
    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
  1009
        return new ArrayLiteralNode(token, finish, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1010
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1011
}