nashorn/src/jdk/nashorn/internal/ir/IdentNode.java
author hannesw
Fri, 25 Oct 2013 10:20:49 +0200
changeset 21457 381acbd07fe5
parent 20928 3ff39d5c8c08
child 24719 f726e9d67629
permissions -rw-r--r--
8027042: Evaluation order for binary operators can be improved Reviewed-by: lagergren, jlaskey, attila
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.ir;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static jdk.nashorn.internal.codegen.CompilerConstants.__DIR__;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.nashorn.internal.codegen.CompilerConstants.__FILE__;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.nashorn.internal.codegen.CompilerConstants.__LINE__;
18867
bc91e3fcc5ba 8013925: Remove symbol fields from nodes that don't need them
attila
parents: 17769
diff changeset
    31
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;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
 * IR representation for an identifier.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    39
@Immutable
20928
3ff39d5c8c08 8026137: Fix Issues with Binary Evaluation Order
lagergren
parents: 20571
diff changeset
    40
public final class IdentNode extends Expression implements PropertyKey, FunctionCall {
20571
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
    41
    private static final int PROPERTY_NAME     = 1 << 0;
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
    42
    private static final int INITIALIZED_HERE  = 1 << 1;
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
    43
    private static final int FUNCTION          = 1 << 2;
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
    44
    private static final int FUTURESTRICT_NAME = 1 << 3;
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
    45
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
    /** Identifier. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
    private final String name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
    /** Type for a callsite, e.g. X in a get()X or a set(X)V */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    50
    private final Type callSiteType;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    52
    private final int flags;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
     * @param token   token
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
     * @param finish  finish position
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
     * @param name    name of identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17233
diff changeset
    61
    public IdentNode(final long token, final int finish, final String name) {
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17233
diff changeset
    62
        super(token, finish);
17525
6582a7788183 8013912: Nashorn needs to reuse temporary symbols
attila
parents: 17523
diff changeset
    63
        this.name = name.intern();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    64
        this.callSiteType = null;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    65
        this.flags = 0;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    66
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    67
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    68
    private IdentNode(final IdentNode identNode, final String name, final Type callSiteType, final int flags) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    69
        super(identNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    70
        this.name = name;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    71
        this.callSiteType = callSiteType;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    72
        this.flags = flags;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
     * Copy constructor - create a new IdentNode for the same location
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
     * @param identNode  identNode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
    public IdentNode(final IdentNode identNode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
        super(identNode);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    82
        this.name         = identNode.getName();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    83
        this.callSiteType = null;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    84
        this.flags        = identNode.flags;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
    public Type getType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
        return callSiteType == null ? super.getType() : callSiteType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
    public boolean isAtom() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
        return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
    private boolean hasCallSiteType() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
        //this is an identity that's part of a getter or setter
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        return callSiteType != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
     * Assist in IR navigation.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
     * @param visitor IR navigating visitor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
    @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
   108
    public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   109
        if (visitor.enterIdentNode(this)) {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   110
            return visitor.leaveIdentNode(this);
16147
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
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
    public void toString(final StringBuilder sb) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
        if (hasCallSiteType()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
            sb.append('{');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
            final String desc = getType().getDescriptor();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   121
            sb.append(desc.charAt(desc.length() - 1) == ';' ? 'O' : getType().getDescriptor());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
            sb.append('}');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        sb.append(name);
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
     * Get the name of the identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
     * @return  IdentNode name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    public String getName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
        return name;
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
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    public String getPropertyName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
        return getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
21457
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20928
diff changeset
   141
    @Override
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20928
diff changeset
   142
    public boolean isLocal() {
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20928
diff changeset
   143
        return !getSymbol().isScope();
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20928
diff changeset
   144
    }
381acbd07fe5 8027042: Evaluation order for binary operators can be improved
hannesw
parents: 20928
diff changeset
   145
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
     * Check if this IdentNode is a property name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
     * @return true if this is a property name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    public boolean isPropertyName() {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   151
        return (flags & PROPERTY_NAME) != 0;
16147
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
     * Flag this IdentNode as a property name
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   156
     * @return a node equivalent to this one except for the requested change.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
     */
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   158
    public IdentNode setIsPropertyName() {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   159
        if (isPropertyName()) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   160
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   161
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   162
        return new IdentNode(this, name, callSiteType, flags | PROPERTY_NAME);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
    /**
20571
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   166
     * Check if this IdentNode is a future strict name
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   167
     * @return true if this is a future strict name
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   168
     */
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   169
    public boolean isFutureStrictName() {
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   170
        return (flags & FUTURESTRICT_NAME) != 0;
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   171
    }
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   172
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   173
    /**
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   174
     * Flag this IdentNode as a future strict name
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   175
     * @return a node equivalent to this one except for the requested change.
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   176
     */
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   177
    public IdentNode setIsFutureStrictName() {
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   178
        if (isFutureStrictName()) {
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   179
            return this;
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   180
        }
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   181
        return new IdentNode(this, name, callSiteType, flags | FUTURESTRICT_NAME);
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   182
    }
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   183
f52b0abf5d88 8026039: future strict names are allowed as function name and argument name of a strict function
sundar
parents: 19889
diff changeset
   184
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
     * Helper function for local def analysis.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
     * @return true if IdentNode is initialized on creation
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    public boolean isInitializedHere() {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   189
        return (flags & INITIALIZED_HERE) != 0;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
     * Flag IdentNode to be initialized on creation
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   194
     * @return a node equivalent to this one except for the requested change.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
     */
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   196
    public IdentNode setIsInitializedHere() {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   197
        if (isInitializedHere()) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   198
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   199
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   200
        return new IdentNode(this, name, callSiteType, flags | INITIALIZED_HERE);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
     * Check if this IdentNode is a special identity, currently __DIR__, __FILE__
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
     * or __LINE__
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
     * @return true if this IdentNode is special
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
    public boolean isSpecialIdentity() {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   210
        return name.equals(__DIR__.symbolName()) || name.equals(__FILE__.symbolName()) || name.equals(__LINE__.symbolName());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
    public boolean isFunction() {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   215
        return (flags & FUNCTION) != 0;
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   216
    }
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   217
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   218
    /**
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   219
     * Mark this node as being the callee operand of a {@link CallNode}.
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   220
     * @return an ident node identical to this one in all aspects except with its function flag set.
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   221
     */
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16240
diff changeset
   222
    public IdentNode setIsFunction() {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   223
        if (isFunction()) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   224
            return this;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   225
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   226
        return new IdentNode(this, name, callSiteType, flags | FUNCTION);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
}