nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/RuntimeNode.java
author mhaupt
Wed, 28 Oct 2015 10:54:05 +0100
changeset 33414 2e284c36d51f
parent 32534 b3ec7f3b3c2a
permissions -rw-r--r--
8134941: Implement ES6 template literal support Reviewed-by: attila, hannesw Contributed-by: andreas.woess@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
33414
2e284c36d51f 8134941: Implement ES6 template literal support
mhaupt
parents: 32534
diff changeset
     2
 * Copyright (c) 2010, 2015, 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;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import jdk.nashorn.internal.codegen.types.Type;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    32
import jdk.nashorn.internal.ir.annotations.Immutable;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.parser.TokenType;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
    35
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
 * IR representation for a runtime call.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    39
@Immutable
29283
fb47e4d25a9f 8035712: Restore some of the RuntimeCallSite specializations
attila
parents: 28130
diff changeset
    40
public class RuntimeNode extends Expression {
27204
06ec78f29a56 8059843: Make AST serializable
attila
parents: 25865
diff changeset
    41
    private static final long serialVersionUID = 1L;
16147
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
     * Request enum used for meta-information about the runtime request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
    public enum Request {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
        /** An addition with at least one object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
        ADD(TokenType.ADD, Type.OBJECT, 2, true),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
        /** Request to enter debugger */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
        DEBUGGER,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
        /** New operator */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
        NEW,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
        /** Typeof operator */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
        TYPEOF,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
        /** Reference error type */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
        REFERENCE_ERROR,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
        /** Delete operator */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
        DELETE(TokenType.DELETE, Type.BOOLEAN, 1),
31828
50189d0dacb0 8131683: Delete fails over multiple scopes
hannesw
parents: 29283
diff changeset
    59
        /** Delete operator for slow scopes */
50189d0dacb0 8131683: Delete fails over multiple scopes
hannesw
parents: 29283
diff changeset
    60
        SLOW_DELETE(TokenType.DELETE, Type.BOOLEAN, 1, false),
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
        /** Delete operator that always fails -- see Lower */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
        FAIL_DELETE(TokenType.DELETE, Type.BOOLEAN, 1, false),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
        /** === operator with at least one object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
        EQ_STRICT(TokenType.EQ_STRICT, Type.BOOLEAN, 2, true),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
        /** == operator with at least one object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
        EQ(TokenType.EQ, Type.BOOLEAN, 2, true),
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16244
diff changeset
    67
        /** {@literal >=} operator with at least one object */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
        GE(TokenType.GE, Type.BOOLEAN, 2, true),
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16244
diff changeset
    69
        /** {@literal >} operator with at least one object */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
        GT(TokenType.GT, Type.BOOLEAN, 2, true),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
        /** in operator */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
        IN(TokenType.IN, Type.BOOLEAN, 2),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
        /** instanceof operator */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
        INSTANCEOF(TokenType.INSTANCEOF, Type.BOOLEAN, 2),
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16244
diff changeset
    75
        /** {@literal <=} operator with at least one object */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
        LE(TokenType.LE, Type.BOOLEAN, 2, true),
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16244
diff changeset
    77
        /** {@literal <} operator with at least one object */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
        LT(TokenType.LT, Type.BOOLEAN, 2, true),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
        /** !== operator with at least one object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
        NE_STRICT(TokenType.NE_STRICT, Type.BOOLEAN, 2, true),
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
        /** != operator with at least one object */
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
    82
        NE(TokenType.NE, Type.BOOLEAN, 2, true),
24735
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
    83
        /** is undefined */
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
    84
        IS_UNDEFINED(TokenType.EQ_STRICT, Type.BOOLEAN, 2),
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
    85
        /** is not undefined */
33414
2e284c36d51f 8134941: Implement ES6 template literal support
mhaupt
parents: 32534
diff changeset
    86
        IS_NOT_UNDEFINED(TokenType.NE_STRICT, Type.BOOLEAN, 2),
2e284c36d51f 8134941: Implement ES6 template literal support
mhaupt
parents: 32534
diff changeset
    87
        /** Get template object from raw and cooked string arrays. */
2e284c36d51f 8134941: Implement ES6 template literal support
mhaupt
parents: 32534
diff changeset
    88
        GET_TEMPLATE_OBJECT(TokenType.TEMPLATE, Type.SCRIPT_OBJECT, 2);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
        /** token type */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
        private final TokenType tokenType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
        /** return type for request */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
        private final Type returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
        /** arity of request */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
        private final int arity;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        /** Can the specializer turn this into something that works with 1 or more primitives? */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
        private final boolean canSpecialize;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
        private Request() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
            this(TokenType.VOID, Type.OBJECT, 0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        private Request(final TokenType tokenType, final Type returnType, final int arity) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
            this(tokenType, returnType, arity, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
        private Request(final TokenType tokenType, final Type returnType, final int arity, final boolean canSpecialize) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
            this.tokenType     = tokenType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
            this.returnType    = returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
            this.arity         = arity;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
            this.canSpecialize = canSpecialize;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        }
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
         * Can this request type be specialized?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
         * @return true if request can be specialized
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
        public boolean canSpecialize() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
            return canSpecialize;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
        }
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
         * Get arity
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
         * @return the arity of the request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
        public int getArity() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
            return arity;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
        }
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
         * Get the return type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
         * @return return type for request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
        public Type getReturnType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
            return returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
        }
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
         * Get token type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
         * @return token type for request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
        public TokenType getTokenType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
            return tokenType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
        /**
16244
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   154
         * Get the non-strict name for this request.
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   155
         *
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   156
         * @return the name without _STRICT suffix
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   157
         */
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   158
        public String nonStrictName() {
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   159
            switch(this) {
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   160
            case NE_STRICT:
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   161
                return NE.name();
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   162
            case EQ_STRICT:
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   163
                return EQ.name();
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   164
            default:
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   165
                return name();
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   166
            }
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   167
        }
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   168
12f06c992c3a 8008351: Avoid using String.replace(String, String) in codegen
hannesw
parents: 16201
diff changeset
   169
        /**
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   170
         * Derive a runtime node request type for a node
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   171
         * @param node the node
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   172
         * @return request type
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   173
         */
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   174
        public static Request requestFor(final Expression node) {
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   175
            switch (node.tokenType()) {
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   176
            case TYPEOF:
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   177
                return Request.TYPEOF;
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   178
            case IN:
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   179
                return Request.IN;
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   180
            case INSTANCEOF:
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   181
                return Request.INSTANCEOF;
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   182
            case EQ_STRICT:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   183
                return Request.EQ_STRICT;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   184
            case NE_STRICT:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   185
                return Request.NE_STRICT;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   186
            case EQ:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   187
                return Request.EQ;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   188
            case NE:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   189
                return Request.NE;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   190
            case LT:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   191
                return Request.LT;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   192
            case LE:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   193
                return Request.LE;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   194
            case GT:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   195
                return Request.GT;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   196
            case GE:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   197
                return Request.GE;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   198
            default:
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   199
                assert false;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   200
                return null;
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   201
            }
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   202
        }
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   203
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   204
        /**
24735
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   205
         * Is this an undefined check?
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   206
         *
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   207
         * @param request request
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   208
         *
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   209
         * @return true if undefined check
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   210
         */
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   211
        public static boolean isUndefinedCheck(final Request request) {
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   212
            return request == IS_UNDEFINED || request == IS_NOT_UNDEFINED;
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   213
        }
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   214
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   215
        /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
         * Is this an EQ or EQ_STRICT?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
         * @param request a request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
         * @return true if EQ or EQ_STRICT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
        public static boolean isEQ(final Request request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
            return request == EQ || request == EQ_STRICT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
         * Is this an NE or NE_STRICT?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
         * @param request a request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
         * @return true if NE or NE_STRICT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
        public static boolean isNE(final Request request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
            return request == NE || request == NE_STRICT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
        /**
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   238
         * Is this strict?
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   239
         *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   240
         * @param request a request
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   241
         *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   242
         * @return true if script
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   243
         */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   244
        public static boolean isStrict(final Request request) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   245
            return request == EQ_STRICT || request == NE_STRICT;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   246
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   247
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   248
        /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
         * If this request can be reversed, return the reverse request
16272
675a0caf75bc 8009263: Fix all javadoc errors in nashorn code
sundar
parents: 16244
diff changeset
   250
         * Eq EQ {@literal ->} NE.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
         * @param request request to reverse
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
         * @return reversed request or null if not applicable
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
        public static Request reverse(final Request request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
            switch (request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
            case EQ:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
            case EQ_STRICT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
            case NE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
            case NE_STRICT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
                return request;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
            case LE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
                return GE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
            case LT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
                return GT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
            case GE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
                return LE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
            case GT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
                return LT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
                return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
         * Invert the request, only for non equals comparisons.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
         * @param request a request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
         *
32534
b3ec7f3b3c2a 8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents: 31828
diff changeset
   281
         * @return the inverted request, or null if not applicable
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
        public static Request invert(final Request request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
            switch (request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
            case EQ:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
                return NE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
            case EQ_STRICT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
                return NE_STRICT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
            case NE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
                return EQ;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
            case NE_STRICT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
                return EQ_STRICT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
            case LE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
                return GT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
            case LT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
                return GE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
            case GE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
                return LT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
            case GT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
                return LE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
                return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
        /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
         * Check if this is a comparison
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
         * @param request a request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
         *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
         * @return true if this is a comparison, null otherwise
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
        public static boolean isComparison(final Request request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
            switch (request) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
            case EQ:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
            case EQ_STRICT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
            case NE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
            case NE_STRICT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
            case LE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
            case LT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
            case GE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
            case GT:
24735
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   323
            case IS_UNDEFINED:
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   324
            case IS_NOT_UNDEFINED:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
                return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
                return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
    /** Runtime request. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
    private final Request request;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
    /** Call arguments. */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   336
    private final List<Expression> args;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
     * @param request the request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
     * @param args    arguments to request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   346
    public RuntimeNode(final long token, final int finish, final Request request, final List<Expression> args) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17233
diff changeset
   347
        super(token, finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
        this.request      = request;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
        this.args         = args;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   351
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   352
29283
fb47e4d25a9f 8035712: Restore some of the RuntimeCallSite specializations
attila
parents: 28130
diff changeset
   353
    private RuntimeNode(final RuntimeNode runtimeNode, final Request request, final List<Expression> args) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   354
        super(runtimeNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   355
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   356
        this.request      = request;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   357
        this.args         = args;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
     * @param finish  finish
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
     * @param request the request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
     * @param args    arguments to request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   368
    public RuntimeNode(final long token, final int finish, final Request request, final Expression... args) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17233
diff changeset
   369
        this(token, finish, request, Arrays.asList(args));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   372
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   373
     * Constructor
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   374
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   375
     * @param parent  parent node from which to inherit source, token, finish
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   376
     * @param request the request
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   377
     * @param args    arguments to request
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   378
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   379
    public RuntimeNode(final Expression parent, final Request request, final Expression... args) {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   380
        this(parent, request, Arrays.asList(args));
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
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   383
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   384
     * Constructor
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
     * @param parent  parent node from which to inherit source, token, finish
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   387
     * @param request the request
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   388
     * @param args    arguments to request
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   389
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   390
    public RuntimeNode(final Expression parent, final Request request, final List<Expression> args) {
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   391
        super(parent);
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   392
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   393
        this.request      = request;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   394
        this.args         = args;
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   395
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   396
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   397
    /**
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   398
     * Constructor
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
     * @param parent  parent node from which to inherit source, token, finish and arguments
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   401
     * @param request the request
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   402
     */
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   403
    public RuntimeNode(final UnaryNode parent, final Request request) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20928
diff changeset
   404
        this(parent, request, parent.getExpression());
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   405
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   406
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   407
    /**
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   408
     * Constructor used to replace a binary node with a runtime request.
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   409
     *
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   410
     * @param parent  parent node from which to inherit source, token, finish and arguments
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   411
     */
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   412
    public RuntimeNode(final BinaryNode parent) {
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24735
diff changeset
   413
        this(parent, Request.requestFor(parent), parent.lhs(), parent.rhs());
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   414
    }
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   415
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16151
diff changeset
   416
    /**
24735
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   417
     * Reset the request for this runtime node
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   418
     * @param request request
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   419
     * @return new runtime node or same if same request
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   420
     */
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   421
    public RuntimeNode setRequest(final Request request) {
29283
fb47e4d25a9f 8035712: Restore some of the RuntimeCallSite specializations
attila
parents: 28130
diff changeset
   422
        if (this.request == request) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   423
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   424
        }
29283
fb47e4d25a9f 8035712: Restore some of the RuntimeCallSite specializations
attila
parents: 28130
diff changeset
   425
        return new RuntimeNode(this, request, args);
fb47e4d25a9f 8035712: Restore some of the RuntimeCallSite specializations
attila
parents: 28130
diff changeset
   426
   }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
     * Return type for the ReferenceNode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
    @Override
28130
433d6755c5f8 8067774: Use a stack of types when calculating local variable types
attila
parents: 27972
diff changeset
   432
    public Type getType() {
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 18867
diff changeset
   433
        return request.getReturnType();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
    @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: 17525
diff changeset
   437
    public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   438
        if (visitor.enterRuntimeNode(this)) {
27972
8ec664fdf8da 8066236: RuntimeNode forces copy creation on visitation
attila
parents: 27204
diff changeset
   439
            return visitor.leaveRuntimeNode(setArgs(Node.accept(visitor, args)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
    @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
   446
    public void toString(final StringBuilder sb, final boolean printType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
        sb.append("ScriptRuntime.");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
        sb.append(request);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
        sb.append('(');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
        boolean first = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
        for (final Node arg : args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
            if (!first) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
                sb.append(", ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
                first = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
24759
31aed7d9c02a 8034206: Make parts of code pipeline reusable in order to facilitate faster warmup and faster lazy compilation.
lagergren
parents: 24751
diff changeset
   460
            arg.toString(sb, printType);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
        sb.append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
     * Get the arguments for this runtime node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
     * @return argument list
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
     */
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   470
    public List<Expression> getArgs() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
        return Collections.unmodifiableList(args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
24735
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   474
    /**
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   475
     * Set the arguments of this runtime node
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   476
     * @param args new arguments
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   477
     * @return new runtime node, or identical if no change
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   478
     */
9833d3ceed5b 8038945: Simplify strict undefined checks
lagergren
parents: 24719
diff changeset
   479
    public RuntimeNode setArgs(final List<Expression> args) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   480
        if (this.args == args) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   481
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   482
        }
29283
fb47e4d25a9f 8035712: Restore some of the RuntimeCallSite specializations
attila
parents: 28130
diff changeset
   483
        return new RuntimeNode(this, request, args);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   484
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   485
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
     * Get the request that this runtime node implements
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
     * @return the request
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
    public Request getRequest() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
        return request;
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
     * Is this runtime node, engineered to handle the "at least one object" case of the defined
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
     * requests and specialize on demand, really primitive. This can happen e.g. after AccessSpecializer
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
     * In that case it can be turned into a simpler primitive form in CodeGenerator
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
     * @return true if all arguments now are primitive
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
    public boolean isPrimitive() {
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 18838
diff changeset
   502
        for (final Expression arg : args) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
            if (arg.getType().isObject()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
                return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
        return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
}