nashorn/src/jdk/nashorn/internal/parser/Parser.java
author attila
Wed, 05 Jun 2013 10:44:32 +0200
changeset 17981 9b8e085aa1fe
parent 17973 d220c8157f25
child 18335 1b5fdae617cf
permissions -rw-r--r--
8015955: ObjectNode.elements should be stronger typed Reviewed-by: lagergren, sundar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.parser;
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.ARGUMENTS;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.nashorn.internal.codegen.CompilerConstants.EVAL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.nashorn.internal.codegen.CompilerConstants.FUNCTION_PREFIX;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import static jdk.nashorn.internal.codegen.CompilerConstants.RUN_SCRIPT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import static jdk.nashorn.internal.parser.TokenType.ASSIGN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import static jdk.nashorn.internal.parser.TokenType.CASE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import static jdk.nashorn.internal.parser.TokenType.CATCH;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import static jdk.nashorn.internal.parser.TokenType.COLON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import static jdk.nashorn.internal.parser.TokenType.COMMARIGHT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import static jdk.nashorn.internal.parser.TokenType.DECPOSTFIX;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import static jdk.nashorn.internal.parser.TokenType.DECPREFIX;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import static jdk.nashorn.internal.parser.TokenType.ELSE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import static jdk.nashorn.internal.parser.TokenType.EOF;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import static jdk.nashorn.internal.parser.TokenType.EOL;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import static jdk.nashorn.internal.parser.TokenType.FINALLY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import static jdk.nashorn.internal.parser.TokenType.FUNCTION;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import static jdk.nashorn.internal.parser.TokenType.IDENT;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import static jdk.nashorn.internal.parser.TokenType.IF;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import static jdk.nashorn.internal.parser.TokenType.INCPOSTFIX;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import static jdk.nashorn.internal.parser.TokenType.LBRACE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import static jdk.nashorn.internal.parser.TokenType.LPAREN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
import static jdk.nashorn.internal.parser.TokenType.RBRACE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
import static jdk.nashorn.internal.parser.TokenType.RBRACKET;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
import static jdk.nashorn.internal.parser.TokenType.RPAREN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
import static jdk.nashorn.internal.parser.TokenType.SEMICOLON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
import static jdk.nashorn.internal.parser.TokenType.TERNARY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
import static jdk.nashorn.internal.parser.TokenType.WHILE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
import java.util.ArrayList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
import java.util.HashSet;
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
    58
import java.util.Iterator;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    59
import java.util.LinkedHashMap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
import java.util.Map;
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
    62
import jdk.nashorn.internal.codegen.CompilerConstants;
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
    63
import jdk.nashorn.internal.codegen.Namespace;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
import jdk.nashorn.internal.ir.AccessNode;
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
    65
import jdk.nashorn.internal.ir.BaseNode;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
import jdk.nashorn.internal.ir.BinaryNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
import jdk.nashorn.internal.ir.Block;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    68
import jdk.nashorn.internal.ir.BlockLexicalContext;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
import jdk.nashorn.internal.ir.BreakNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
import jdk.nashorn.internal.ir.BreakableNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
import jdk.nashorn.internal.ir.CallNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
import jdk.nashorn.internal.ir.CaseNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
import jdk.nashorn.internal.ir.CatchNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
import jdk.nashorn.internal.ir.ContinueNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
import jdk.nashorn.internal.ir.EmptyNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
import jdk.nashorn.internal.ir.ExecuteNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
import jdk.nashorn.internal.ir.ForNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
import jdk.nashorn.internal.ir.FunctionNode;
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
    79
import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
import jdk.nashorn.internal.ir.IdentNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
import jdk.nashorn.internal.ir.IfNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
import jdk.nashorn.internal.ir.IndexNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
import jdk.nashorn.internal.ir.LabelNode;
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
    84
import jdk.nashorn.internal.ir.LexicalContext;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
import jdk.nashorn.internal.ir.LiteralNode;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
    86
import jdk.nashorn.internal.ir.LoopNode;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
import jdk.nashorn.internal.ir.Node;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
import jdk.nashorn.internal.ir.ObjectNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
import jdk.nashorn.internal.ir.PropertyKey;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
import jdk.nashorn.internal.ir.PropertyNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
import jdk.nashorn.internal.ir.ReturnNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
import jdk.nashorn.internal.ir.RuntimeNode;
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
    93
import jdk.nashorn.internal.ir.Statement;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
import jdk.nashorn.internal.ir.SwitchNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
import jdk.nashorn.internal.ir.TernaryNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
import jdk.nashorn.internal.ir.ThrowNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
import jdk.nashorn.internal.ir.TryNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
import jdk.nashorn.internal.ir.UnaryNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
import jdk.nashorn.internal.ir.VarNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
import jdk.nashorn.internal.ir.WhileNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
import jdk.nashorn.internal.ir.WithNode;
16252
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
   102
import jdk.nashorn.internal.runtime.DebugLogger;
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   103
import jdk.nashorn.internal.runtime.ErrorManager;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
import jdk.nashorn.internal.runtime.JSErrorType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
import jdk.nashorn.internal.runtime.ParserException;
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   106
import jdk.nashorn.internal.runtime.ScriptEnvironment;
16245
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16239
diff changeset
   107
import jdk.nashorn.internal.runtime.ScriptingFunctions;
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   108
import jdk.nashorn.internal.runtime.Source;
16252
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
   109
import jdk.nashorn.internal.runtime.Timing;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
 * Builds the IR.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
public class Parser extends AbstractParser {
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   115
    /** Current script environment. */
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   116
    private final ScriptEnvironment env;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
   118
    /** Is scripting mode. */
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
   119
    private final boolean scripting;
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
   120
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   121
    private List<Statement> functionDeclarations;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   123
    private final BlockLexicalContext lc = new BlockLexicalContext();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   124
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   125
    /** Namespace for function names where not explicitly given */
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   126
    private final Namespace namespace;
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   127
16525
1409942e618e 8009982: Lazy execution bugfix. Added lazy sunspider unit test. Added mandreel to compile-octane test. Fixed warnings
lagergren
parents: 16523
diff changeset
   128
    private static final DebugLogger LOG = new DebugLogger("parser");
16252
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
   129
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
    /**
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   131
     * Constructor
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   132
     *
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   133
     * @param env     script environment
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   134
     * @param source  source to parse
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   135
     * @param errors  error manager
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
     */
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   137
    public Parser(final ScriptEnvironment env, final Source source, final ErrorManager errors) {
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   138
        this(env, source, errors, env._strict);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
     * Construct a parser.
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   143
     *
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   144
     * @param env     script environment
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   145
     * @param source  source to parse
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   146
     * @param errors  error manager
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   147
     * @param strict  parser created with strict mode enabled.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
     */
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   149
    public Parser(final ScriptEnvironment env, final Source source, final ErrorManager errors, final boolean strict) {
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   150
        super(source, errors, strict);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   151
        this.env       = env;
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   152
        this.namespace = new Namespace(env.getNamespace());
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   153
        this.scripting = env._scripting;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    /**
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   157
     * Execute parse and return the resulting function node.
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   158
     * Errors will be thrown and the error manager will contain information
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   159
     * if parsing should fail
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   160
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   161
     * This is the default parse call, which will name the function node
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   162
     * "runScript" {@link CompilerConstants#RUN_SCRIPT}
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   163
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   164
     * @return function node resulting from successful parse
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   165
     */
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   166
    public FunctionNode parse() {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   167
        return parse(RUN_SCRIPT.symbolName());
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   168
    }
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   169
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   170
    /**
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   171
     * Execute parse and return the resulting function node.
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   172
     * Errors will be thrown and the error manager will contain information
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   173
     * if parsing should fail
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   174
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   175
     * @param scriptName name for the script, given to the parsed FunctionNode
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   176
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   177
     * @return function node resulting from successful parse
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
    public FunctionNode parse(final String scriptName) {
16252
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
   180
        final long t0 = Timing.isEnabled() ? System.currentTimeMillis() : 0L;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   181
        LOG.info(this, " begin for '", scriptName, "'");
16252
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
   182
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
            stream = new TokenStream();
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   185
            lexer  = new Lexer(source, stream, scripting && !env._no_syntax_extensions);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
            // Set up first token (skips opening EOL.)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
            k = -1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
            // Begin parse.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
            return program(scriptName);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
        } catch (final Exception e) {
17973
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   194
            handleParseException(e);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
            return null;
17973
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   197
        } finally {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   198
            final String end = this + " end '" + scriptName + "'";
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   199
            if (Timing.isEnabled()) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   200
                Timing.accumulateTime(toString(), System.currentTimeMillis() - t0);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   201
                LOG.info(end, "' in ", (System.currentTimeMillis() - t0), " ms");
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   202
            } else {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   203
                LOG.info(end);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   204
            }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   205
        }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   206
    }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   207
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   208
    /**
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   209
     * Parse and return the list of function parameter list. A comma
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   210
     * separated list of function parameter identifiers is expected to be parsed.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   211
     * Errors will be thrown and the error manager will contain information
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   212
     * if parsing should fail. This method is used to check if parameter Strings
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   213
     * passed to "Function" constructor is a valid or not.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   214
     *
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   215
     * @return the list of IdentNodes representing the formal parameter list
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   216
     */
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   217
    public List<IdentNode> parseFormalParameterList() {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   218
        try {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   219
            stream = new TokenStream();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   220
            lexer  = new Lexer(source, stream, scripting && !env._no_syntax_extensions);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   221
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   222
            // Set up first token (skips opening EOL.)
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   223
            k = -1;
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   224
            next();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   225
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   226
            return formalParameterList(TokenType.EOF);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   227
        } catch (final Exception e) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   228
            handleParseException(e);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   229
            return null;
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   230
        }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   231
    }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   232
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   233
    /**
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   234
     * Execute parse and return the resulting function node.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   235
     * Errors will be thrown and the error manager will contain information
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   236
     * if parsing should fail. This method is used to check if code String
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   237
     * passed to "Function" constructor is a valid function body or not.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   238
     *
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   239
     * @return function node resulting from successful parse
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   240
     */
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   241
    public FunctionNode parseFunctionBody() {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   242
        try {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   243
            stream = new TokenStream();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   244
            lexer  = new Lexer(source, stream, scripting && !env._no_syntax_extensions);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   245
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   246
            // Set up first token (skips opening EOL.)
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   247
            k = -1;
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   248
            next();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   249
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   250
            // Make a fake token for the function.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   251
            final long functionToken = Token.toDesc(FUNCTION, 0, source.getLength());
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   252
            // Set up the function to append elements.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   253
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   254
            FunctionNode function = newFunctionNode(
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   255
                functionToken,
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   256
                new IdentNode(functionToken, Token.descPosition(functionToken), RUN_SCRIPT.symbolName()),
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   257
                new ArrayList<IdentNode>(),
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   258
                FunctionNode.Kind.NORMAL);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   259
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   260
            functionDeclarations = new ArrayList<>();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   261
            sourceElements();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   262
            addFunctionDeclarations(function);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   263
            functionDeclarations = null;
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   264
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   265
            expect(EOF);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   266
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   267
            function.setFinish(source.getLength() - 1);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   268
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   269
            function = restoreFunctionNode(function, token); //commit code
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   270
            function = function.setBody(lc, function.getBody().setNeedsScope(lc));
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   271
            return function;
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   272
        } catch (final Exception e) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   273
            handleParseException(e);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   274
            return null;
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   275
        }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   276
    }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   277
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   278
    private void handleParseException(final Exception e) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   279
        // Extract message from exception.  The message will be in error
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   280
        // message format.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   281
        String message = e.getMessage();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   282
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   283
        // If empty message.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   284
        if (message == null) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   285
            message = e.toString();
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   286
        }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   287
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   288
        // Issue message.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   289
        if (e instanceof ParserException) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   290
            errors.error((ParserException)e);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   291
        } else {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   292
            errors.error(message);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   293
        }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   294
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   295
        if (env._dump_on_error) {
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   296
            e.printStackTrace(env.getErr());
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
   297
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
     * Skip to a good parsing recovery point.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
    private void recover(final Exception e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
        if (e != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
            // Extract message from exception.  The message will be in error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
            // message format.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
            String message = e.getMessage();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
            // If empty message.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
            if (message == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
                message = e.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
            // Issue message.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
            if (e instanceof ParserException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
                errors.error((ParserException)e);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
                errors.error(message);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   321
            if (env._dump_on_error) {
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   322
                e.printStackTrace(env.getErr());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
        // Skip to a recovery point.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
loop:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
        while (true) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
            switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
            case EOF:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
                // Can not go any further.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
                break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
            case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
            case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
            case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
                // Good recovery points.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
                break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
                // So we can recover after EOL.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
                nextOrEOL();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
     * Set up a new block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
     * @return New block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
    private Block newBlock() {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   353
        return lc.push(new Block(line, token, Token.descPosition(token)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
     * Set up a new function block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
     * @param ident Name of function.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
     * @return New block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   362
    private FunctionNode newFunctionNode(final long startToken, final IdentNode ident, final List<IdentNode> parameters, final FunctionNode.Kind kind) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
        // Build function name.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   366
        final FunctionNode parentFunction = lc.getCurrentFunction();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   367
        if (parentFunction != null && !parentFunction.isProgram()) {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   368
            sb.append(parentFunction.getName()).append('$');
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   371
        sb.append(ident != null ? ident.getName() : FUNCTION_PREFIX.symbolName());
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16211
diff changeset
   372
        final String name = namespace.uniqueName(sb.toString());
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   373
        assert parentFunction != null || name.equals(RUN_SCRIPT.symbolName())  : "name = " + name;// must not rename runScript().
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   374
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   375
        int flags = 0;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   376
        if (parentFunction == null) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   377
            flags |= FunctionNode.IS_PROGRAM;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   378
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   379
        if (isStrictMode) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   380
            flags |= FunctionNode.IS_STRICT;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   381
        }
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   382
        if (env._specialize_calls != null) {
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   383
            if (env._specialize_calls.contains(name)) {
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   384
                flags |= FunctionNode.CAN_SPECIALIZE;
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   385
            }
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   386
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
        // Start new block.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   389
        FunctionNode functionNode =
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   390
            new FunctionNode(
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   391
                source,
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   392
                line, //TODO?
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   393
                token,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   394
                Token.descPosition(token),
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   395
                startToken,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   396
                namespace,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   397
                ident,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   398
                name,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   399
                parameters,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   400
                kind,
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   401
                flags);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   402
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   403
        lc.push(functionNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   404
        // Create new block, and just put it on the context stack, restoreFunctionNode() will associate it with the
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   405
        // FunctionNode.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   406
        newBlock();
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   407
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   408
        return functionNode;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
     * Restore the current block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   414
    private Block restoreBlock(final Block block) {
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   415
        return lc.pop(block);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   416
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   417
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   418
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   419
    private FunctionNode restoreFunctionNode(final FunctionNode functionNode, final long lastToken) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   420
        final Block newBody = restoreBlock(lc.getFunctionBody(functionNode));
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   421
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   422
        return lc.pop(functionNode).
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   423
            setBody(lc, newBody).
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   424
            setLastToken(lc, lastToken).
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   425
            setState(lc, errors.hasErrors() ? CompilationState.PARSE_ERROR : CompilationState.PARSED).
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   426
            snapshot(lc);
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   427
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
     * Get the statements in a block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
     * @return Block statements.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
    private Block getBlock(final boolean needsBraces) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
        // Set up new block. Captures LBRACE.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   435
        Block newBlock = newBlock();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
        try {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   437
            // Block opening brace.
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   438
            if (needsBraces) {
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   439
                expect(LBRACE);
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   440
            }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   441
            // Accumulate block statements.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   442
            statementList();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   443
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   445
            newBlock = restoreBlock(newBlock);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
   448
        final int possibleEnd = Token.descPosition(token) + Token.descLength(token);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
        // Block closing brace.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
        if (needsBraces) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
            expect(RBRACE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
        newBlock.setFinish(possibleEnd);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
        return newBlock;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
     * Get all the statements generated by a single statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
     * @return Statements.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
    private Block getStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
        if (type == LBRACE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
            return getBlock(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
        // Set up new block. Captures first token.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   469
        Block newBlock = newBlock();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
            statement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   473
            newBlock = restoreBlock(newBlock);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
        return newBlock;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
     * Detect calls to special functions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
     * @param ident Called function.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   482
    private void detectSpecialFunction(final IdentNode ident) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
        final String name = ident.getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   485
        if (EVAL.symbolName().equals(name)) {
17255
aa61d23e36e5 8013419: Streamline handling of with and eval
attila
parents: 17249
diff changeset
   486
            markEval(lc);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
     * Detect use of special properties.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
     * @param ident Referenced property.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   494
    private void detectSpecialProperty(final IdentNode ident) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
        final String name = ident.getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   497
        if (ARGUMENTS.symbolName().equals(name)) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   498
            lc.setFlag(lc.getCurrentFunction(), FunctionNode.USES_ARGUMENTS);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   502
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
     * Tells whether a IdentNode can be used as L-value of an assignment
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
     * @param ident IdentNode to be checked
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
     * @return whether the ident can be used as L-value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
    private static boolean checkIdentLValue(final IdentNode ident) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
        return Token.descType(ident.getToken()).getKind() != TokenKind.KEYWORD;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   513
     * Verify an assignment expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   514
     * @param op  Operation token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   515
     * @param lhs Left hand side expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   516
     * @param rhs Right hand side expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
     * @return Verified expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
    private Node verifyAssignment(final long op, final Node lhs, final Node rhs) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
        final TokenType opType = Token.descType(op);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   522
        switch (opType) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
        case ASSIGN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   524
        case ASSIGN_ADD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
        case ASSIGN_BIT_AND:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
        case ASSIGN_BIT_OR:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
        case ASSIGN_BIT_XOR:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
        case ASSIGN_DIV:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
        case ASSIGN_MOD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
        case ASSIGN_MUL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
        case ASSIGN_SAR:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
        case ASSIGN_SHL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
        case ASSIGN_SHR:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
        case ASSIGN_SUB:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
            if (!(lhs instanceof AccessNode ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
                  lhs instanceof IndexNode ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
                  lhs instanceof IdentNode)) {
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   538
                if (env._early_lvalue_error) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   539
                    throw error(JSErrorType.REFERENCE_ERROR, AbstractParser.message("invalid.lvalue"), lhs.getToken());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
                return referenceError(lhs, rhs);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
            if (lhs instanceof IdentNode) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
   545
                if (!checkIdentLValue((IdentNode)lhs)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
                    return referenceError(lhs, rhs);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
                verifyStrictIdent((IdentNode)lhs, "assignment");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
        // Build up node.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   557
        return new BinaryNode(op, lhs, rhs);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
     * Reduce increment/decrement to simpler operations.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
     * @param firstToken First token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   563
     * @param tokenType  Operation token (INCPREFIX/DEC.)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   564
     * @param expression Left hand side expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
     * @param isPostfix  Prefix or postfix.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
     * @return           Reduced expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
     */
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   568
    private static Node incDecExpression(final long firstToken, final TokenType tokenType, final Node expression, final boolean isPostfix) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
        if (isPostfix) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   570
            return new UnaryNode(Token.recast(firstToken, tokenType == DECPREFIX ? DECPOSTFIX : INCPOSTFIX), expression.getStart(), Token.descPosition(firstToken) + Token.descLength(firstToken), expression);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   573
        return new UnaryNode(firstToken, expression);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
     * -----------------------------------------------------------------------
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
     * Grammar based on
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
     *      ECMAScript Language Specification
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
     *      ECMA-262 5th Edition / December 2009
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
     * -----------------------------------------------------------------------
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
     * Program :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
     *      SourceElements?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
     * See 14
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
     * Parse the top level script.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
    private FunctionNode program(final String scriptName) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
        // Make a fake token for the script.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
        final long functionToken = Token.toDesc(FUNCTION, 0, source.getLength());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
        // Set up the script to append elements.
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
   599
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   600
        FunctionNode script = newFunctionNode(
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   601
            functionToken,
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
   602
            new IdentNode(functionToken, Token.descPosition(functionToken), scriptName),
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   603
            new ArrayList<IdentNode>(),
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   604
            FunctionNode.Kind.SCRIPT);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   605
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   606
        functionDeclarations = new ArrayList<>();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
        sourceElements();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   608
        addFunctionDeclarations(script);
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   609
        functionDeclarations = null;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   610
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
        expect(EOF);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   612
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
        script.setFinish(source.getLength() - 1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   615
        script = restoreFunctionNode(script, token); //commit code
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   616
        script = script.setBody(lc, script.getBody().setNeedsScope(lc));
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 17257
diff changeset
   617
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
        return script;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
     * Directive value or null if statement is not a directive.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
     * @param stmt Statement to be checked
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
     * @return Directive value if the given statement is a directive
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
    private String getDirective(final Node stmt) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
        if (stmt instanceof ExecuteNode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
            final Node expr = ((ExecuteNode)stmt).getExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
            if (expr instanceof LiteralNode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
                final LiteralNode<?> lit = (LiteralNode<?>)expr;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
                final long litToken = lit.getToken();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
                final TokenType tt = Token.descType(litToken);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   634
                // A directive is either a string or an escape string
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
                if (tt == TokenType.STRING || tt == TokenType.ESCSTRING) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   636
                    // Make sure that we don't unescape anything. Return as seen in source!
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
                    return source.getString(lit.getStart(), Token.descLength(litToken));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
        return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
     * SourceElements :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
     *      SourceElement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
     *      SourceElements SourceElement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   649
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   650
     * See 14
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
     * Parse the elements of the script or function.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
    private void sourceElements() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
        List<Node>    directiveStmts = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
        boolean       checkDirective = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
        final boolean oldStrictMode = isStrictMode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
            // If is a script, then process until the end of the script.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
            while (type != EOF) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
                // Break if the end of a code block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
                if (type == RBRACE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
                try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
                    // Get the next element.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
                    statement(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
                    // check for directive prologues
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
                    if (checkDirective) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
                        // skip any debug statement like line number to get actual first line
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   674
                        final Node lastStatement = lc.getLastStatement();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
                        // get directive prologue, if any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
                        final String directive = getDirective(lastStatement);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
                        // If we have seen first non-directive statement,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
                        // no more directive statements!!
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
                        checkDirective = directive != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
                        if (checkDirective) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
                            if (!oldStrictMode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
                                if (directiveStmts == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
                                    directiveStmts = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
                                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
                                directiveStmts.add(lastStatement);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
                            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
                            // handle use strict directive
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
                            if ("use strict".equals(directive)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
                                isStrictMode = true;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   694
                                final FunctionNode function = lc.getCurrentFunction();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   695
                                lc.setFlag(lc.getCurrentFunction(), FunctionNode.IS_STRICT);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
                                // We don't need to check these, if lexical environment is already strict
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   698
                                if (!oldStrictMode && directiveStmts != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   699
                                    // check that directives preceding this one do not violate strictness
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
                                    for (final Node statement : directiveStmts) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
                                        // the get value will force unescape of preceeding
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
                                        // escaped string directives
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
                                        getValue(statement.getToken());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   704
                                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
                                    // verify that function name as well as parameter names
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16196
diff changeset
   707
                                    // satisfy strict mode restrictions.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
                                    verifyStrictIdent(function.getIdent(), "function name");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   709
                                    for (final IdentNode param : function.getParameters()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
                                        verifyStrictIdent(param, "function parameter");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
                                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
                                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
                            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
                } catch (final Exception e) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   717
                    //recover parsing
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   718
                    recover(e);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   720
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
                // No backtracking from here on.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
                stream.commit(k);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
        } finally {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
            isStrictMode = oldStrictMode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
     * Statement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
     *      Block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
     *      VariableStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
     *      EmptyStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
     *      ExpressionStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
     *      IfStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
     *      IterationStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
     *      ContinueStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
     *      BreakStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
     *      ReturnStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   740
     *      WithStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
     *      LabelledStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
     *      SwitchStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
     *      ThrowStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
     *      TryStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
     *      DebuggerStatement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   746
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   747
     * see 12
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   748
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   749
     * Parse any of the basic statement types.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   750
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
    private void statement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
        statement(false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   753
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   756
     * @param topLevel does this statement occur at the "top level" of a script or a function?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   757
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
    private void statement(final boolean topLevel) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
        if (type == FUNCTION) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
            // As per spec (ECMA section 12), function declarations as arbitrary statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   761
            // is not "portable". Implementation can issue a warning or disallow the same.
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
   762
            functionExpression(true, topLevel);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   763
            return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   767
        case LBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
            block();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   769
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
        case VAR:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
            variableStatement(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
            emptyStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
        case IF:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
            ifStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
        case FOR:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
            forStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
        case WHILE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
            whileStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   787
        case DO:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   788
            doStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   789
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   790
        case CONTINUE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   791
            continueStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
        case BREAK:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
            breakStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
        case RETURN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   797
            returnStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   799
        case YIELD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   800
            yieldStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   801
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   802
        case WITH:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   803
            withStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   804
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   805
        case SWITCH:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
            switchStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   807
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
        case THROW:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
            throwStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   810
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   811
        case TRY:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   812
            tryStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   813
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   814
        case DEBUGGER:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   815
            debuggerStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   816
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   817
        case RPAREN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   818
        case RBRACKET:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
        case EOF:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   820
            expect(SEMICOLON);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   823
            if (type == IDENT || isNonStrictModeIdent()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
                if (T(k + 1) == COLON) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
                    labelStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
                    return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   827
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   828
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
            expressionStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   833
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   834
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   835
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   836
     * block :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   837
     *      { StatementList? }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   838
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   839
     * see 12.1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   840
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   841
     * Parse a statement block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   842
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   843
    private void block() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   844
        final Block newBlock = getBlock(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   845
        // Force block execution.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   846
        appendStatement(new ExecuteNode(newBlock.getLineNumber(), newBlock.getToken(), finish, newBlock));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   847
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   850
     * StatementList :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   851
     *      Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   852
     *      StatementList Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   853
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   854
     * See 12.1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   855
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   856
     * Parse a list of statements.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
    private void statementList() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   859
        // Accumulate statements until end of list. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   860
loop:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   861
        while (type != EOF) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   862
            switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   863
            case EOF:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   864
            case CASE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   865
            case DEFAULT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
            case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
                break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   869
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   870
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   871
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   872
            // Get next statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
            statement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   874
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   875
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
     * Make sure that in strict mode, the identifier name used is allowed.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   879
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   880
     * @param ident         Identifier that is verified
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   881
     * @param contextString String used in error message to give context to the user
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   883
    private void verifyStrictIdent(final IdentNode ident, final String contextString) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   884
        if (isStrictMode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
            switch (ident.getName()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   886
            case "eval":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   887
            case "arguments":
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   888
                throw error(AbstractParser.message("strict.name", ident.getName(), contextString), ident.getToken());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   889
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   890
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   892
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   893
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   894
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   895
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
     * VariableStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
     *      var VariableDeclarationList ;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   899
     * VariableDeclarationList :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   900
     *      VariableDeclaration
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
     *      VariableDeclarationList , VariableDeclaration
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
     * VariableDeclaration :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
     *      Identifier Initializer?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   906
     * Initializer :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
     *      = AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
     * See 12.2
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   910
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   911
     * Parse a VAR statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
     * @param isStatement True if a statement (not used in a FOR.)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
    private List<VarNode> variableStatement(final boolean isStatement) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
        // VAR tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
        final List<VarNode> vars = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
        while (true) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   921
            // Get starting token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   922
            final int  varLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
            final long varToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   924
            // Get name of var.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   925
            final IdentNode name = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
            verifyStrictIdent(name, "variable name");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   927
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
            // Assume no init.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   929
            Node init = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   930
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   931
            // Look for initializer assignment.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   932
            if (type == ASSIGN) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   933
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   934
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   935
                // Get initializer expression. Suppress IN if not statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   936
                init = assignmentExpression(!isStatement);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   937
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   938
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   939
            // Allocate var node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   940
            final VarNode var = new VarNode(varLine, varToken, finish, name, init);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   941
            vars.add(var);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   942
            appendStatement(var);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   943
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   944
            if (type != COMMARIGHT) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   945
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   946
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   947
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   948
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   949
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   950
        // If is a statement then handle end of line.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   951
        if (isStatement) {
16153
60de45bf54b0 8005703: Offsets miscalculated for blocks
jlaskey
parents: 16151
diff changeset
   952
            boolean semicolon = type == SEMICOLON;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   953
            endOfLine();
16153
60de45bf54b0 8005703: Offsets miscalculated for blocks
jlaskey
parents: 16151
diff changeset
   954
            if (semicolon) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   955
                lc.getCurrentBlock().setFinish(finish);
16153
60de45bf54b0 8005703: Offsets miscalculated for blocks
jlaskey
parents: 16151
diff changeset
   956
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   958
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
        return vars;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   961
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   963
     * EmptyStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
     *      ;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   965
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   966
     * See 12.3
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
     * Parse an empty statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   970
    private void emptyStatement() {
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
   971
        if (env._empty_statements) {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   972
            appendStatement(new EmptyNode(line, token, Token.descPosition(token) + Token.descLength(token)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   973
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   974
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   975
        // SEMICOLON checked in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   976
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   977
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   978
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   979
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   980
     * ExpressionStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   981
     *      Expression ; // [lookahead ~( or  function )]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   982
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   983
     * See 12.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   984
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   985
     * Parse an expression used in a statement block.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   986
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   987
    private void expressionStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   988
        // Lookahead checked in caller.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   989
        final int  expressionLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   990
        final long expressionToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   991
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   992
        // Get expression and add as statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   993
        final Node expression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   994
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   995
        ExecuteNode executeNode = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   996
        if (expression != null) {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
   997
            executeNode = new ExecuteNode(expressionLine, expressionToken, finish, expression);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
   998
            appendStatement(executeNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   999
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1000
            expect(null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1001
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1002
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1003
        endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1004
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1005
        if (executeNode != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1006
            executeNode.setFinish(finish);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1007
            lc.getCurrentBlock().setFinish(finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1008
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1009
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1010
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1011
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1012
     * IfStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1013
     *      if ( Expression ) Statement else Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1014
     *      if ( Expression ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1015
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1016
     * See 12.5
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1017
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1018
     * Parse an IF statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1019
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1020
    private void ifStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1021
        // Capture IF token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1022
        final int  ifLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1023
        final long ifToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1024
         // IF tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1025
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1026
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1027
        expect(LPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1028
        final Node test = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1029
        expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1030
        final Block pass = getStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1031
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1032
        Block fail = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1033
        if (type == ELSE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1034
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1035
            fail = getStatement();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1036
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1037
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1038
        appendStatement(new IfNode(ifLine, ifToken, fail != null ? fail.getFinish() : pass.getFinish(), test, pass, fail));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1039
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1040
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1041
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1042
     * ... IterationStatement:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1043
     *           ...
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1044
     *           for ( Expression[NoIn]?; Expression? ; Expression? ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1045
     *           for ( var VariableDeclarationList[NoIn]; Expression? ; Expression? ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1046
     *           for ( LeftHandSideExpression in Expression ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1047
     *           for ( var VariableDeclaration[NoIn] in Expression ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1048
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1049
     * See 12.6
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1050
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1051
     * Parse a FOR statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1052
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1053
    private void forStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1054
        // Create FOR node, capturing FOR token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1055
        ForNode forNode = new ForNode(line, token, Token.descPosition(token), null, null, null, null, ForNode.IS_FOR);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1056
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1057
        // Set up new block for scope of vars. Captures first token.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1058
        Block outer = newBlock();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1059
        lc.push(forNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1060
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1061
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1062
            // FOR tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1063
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1064
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1065
            // Nashorn extension: for each expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1066
            // iterate property values rather than property names.
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
  1067
            if (!env._no_syntax_extensions && type == IDENT && "each".equals(getValue())) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1068
                forNode = forNode.setIsForEach(lc);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1069
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1070
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1071
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1072
            expect(LPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1073
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1074
            List<VarNode> vars = null;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1075
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1076
            switch (type) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1077
            case VAR:
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1078
                // Var statements captured in for outer block.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1079
                vars = variableStatement(false);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1080
                break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1081
            case SEMICOLON:
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1082
                break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1083
            default:
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1084
                final Node expression = expression(unaryExpression(), COMMARIGHT.getPrecedence(), true);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1085
                forNode = forNode.setInit(lc, expression);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1086
                break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1087
            }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1088
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1089
            switch (type) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1090
            case SEMICOLON:
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1091
                // for (init; test; modify)
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1092
                expect(SEMICOLON);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1093
                if (type != SEMICOLON) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1094
                    forNode = forNode.setTest(lc, expression());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1095
                }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1096
                expect(SEMICOLON);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1097
                if (type != RPAREN) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1098
                    forNode = forNode.setModify(lc, expression());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1099
                }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1100
                break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1101
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1102
            case IN:
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1103
                forNode = forNode.setIsForIn(lc);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1104
                if (vars != null) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1105
                    // for (var i in obj)
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1106
                    if (vars.size() == 1) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1107
                        forNode = forNode.setInit(lc, new IdentNode(vars.get(0).getName()));
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1108
                    } else {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1109
                        // for (var i, j in obj) is invalid
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1110
                        throw error(AbstractParser.message("many.vars.in.for.in.loop"), vars.get(1).getToken());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1111
                    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1112
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1113
                } else {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1114
                    // for (expr in obj)
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1115
                    final Node init = forNode.getInit();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1116
                    assert init != null : "for..in init expression can not be null here";
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1117
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1118
                    // check if initial expression is a valid L-value
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1119
                    if (!(init instanceof AccessNode ||
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1120
                          init instanceof IndexNode ||
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1121
                          init instanceof IdentNode)) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1122
                        throw error(AbstractParser.message("not.lvalue.for.in.loop"), init.getToken());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1123
                    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1124
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1125
                    if (init instanceof IdentNode) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1126
                        if (!checkIdentLValue((IdentNode)init)) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1127
                            throw error(AbstractParser.message("not.lvalue.for.in.loop"), init.getToken());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1128
                        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1129
                        verifyStrictIdent((IdentNode)init, "for-in iterator");
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1130
                    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1131
                }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1132
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1133
                next();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1134
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1135
                // Get the collection expression.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1136
                forNode = forNode.setModify(lc, expression());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1137
                break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1138
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1139
            default:
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1140
                expect(SEMICOLON);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1141
                break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1142
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1143
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1144
            expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1145
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1146
            // Set the for body.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1147
            final Block body = getStatement();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1148
            forNode = forNode.setBody(lc, body);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1149
            forNode.setFinish(body.getFinish());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1150
            outer.setFinish(body.getFinish());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1151
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1152
            appendStatement(forNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1153
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1154
            lc.pop(forNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1155
            outer = restoreBlock(outer);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1156
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1157
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1158
        appendStatement(new ExecuteNode(outer.getLineNumber(), outer.getToken(), outer.getFinish(), outer));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1159
     }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1160
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1161
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1162
     * ... IterationStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1163
     *           ...
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1164
     *           Expression[NoIn]?; Expression? ; Expression?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1165
     *           var VariableDeclarationList[NoIn]; Expression? ; Expression?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1166
     *           LeftHandSideExpression in Expression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1167
     *           var VariableDeclaration[NoIn] in Expression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1168
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1169
     * See 12.6
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1170
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1171
     * Parse the control section of a FOR statement.  Also used for
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1172
     * comprehensions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1173
     * @param forNode Owning FOR.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1174
     */
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1175
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1176
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1177
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1178
     * ...IterationStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1179
     *           ...
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1180
     *           while ( Expression ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1181
     *           ...
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1182
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1183
     * See 12.6
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1184
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1185
     * Parse while statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1186
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1187
    private void whileStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1188
        // Capture WHILE token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1189
        final int  whileLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1190
        final long whileToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1191
        // WHILE tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1192
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1193
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1194
        // Construct WHILE node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1195
        WhileNode whileNode = new WhileNode(whileLine, whileToken, Token.descPosition(whileToken), false);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1196
        lc.push(whileNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1197
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1198
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1199
            expect(LPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1200
            whileNode = whileNode.setTest(lc, expression());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1201
            expect(RPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1202
            whileNode = whileNode.setBody(lc, getStatement());
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1203
            appendStatement(whileNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1204
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1205
            lc.pop(whileNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1206
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1207
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1208
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1209
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1210
     * ...IterationStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1211
     *           ...
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1212
     *           do Statement while( Expression ) ;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1213
     *           ...
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1214
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1215
     * See 12.6
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1216
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1217
     * Parse DO WHILE statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1218
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1219
    private void doStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1220
        // Capture DO token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1221
        final int  doLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1222
        final long doToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1223
        // DO tested in the caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1224
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1225
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1226
        WhileNode doWhileNode = new WhileNode(doLine, doToken, Token.descPosition(doToken), true);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1227
        lc.push(doWhileNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1228
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1229
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1230
           // Get DO body.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1231
            doWhileNode = doWhileNode.setBody(lc, getStatement());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1232
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1233
            expect(WHILE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1234
            expect(LPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1235
            doWhileNode = doWhileNode.setTest(lc, expression());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1236
            expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1237
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1238
            if (type == SEMICOLON) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1239
                endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1240
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1241
            doWhileNode.setFinish(finish);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1242
            appendStatement(doWhileNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1243
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1244
            lc.pop(doWhileNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1245
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1246
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1247
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1248
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1249
     * ContinueStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1250
     *      continue Identifier? ; // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1251
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1252
     * See 12.7
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1253
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1254
     * Parse CONTINUE statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1255
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1256
    private void continueStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1257
        // Capture CONTINUE token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1258
        final int  continueLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1259
        final long continueToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1260
        // CONTINUE tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1261
        nextOrEOL();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1262
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1263
        LabelNode labelNode = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1264
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1265
        // SEMICOLON or label.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1266
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1267
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1268
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1269
        case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1270
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1271
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1272
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1273
            final IdentNode ident = getIdent();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1274
            labelNode = lc.findLabel(ident.getName());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1275
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1276
            if (labelNode == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1277
                throw error(AbstractParser.message("undefined.label", ident.getName()), ident.getToken());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1278
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1279
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1280
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1281
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1282
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1283
        final IdentNode label = labelNode == null ? null : labelNode.getLabel();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1284
        final LoopNode targetNode = lc.getContinueTo(label);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1285
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1286
        if (targetNode == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1287
            throw error(AbstractParser.message("illegal.continue.stmt"), continueToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1288
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1289
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1290
        endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1291
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1292
        // Construct and add CONTINUE node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1293
        appendStatement(new ContinueNode(continueLine, continueToken, finish, label == null ? null : new IdentNode(label)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1294
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1295
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1296
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1297
     * BreakStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1298
     *      break Identifier? ; // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1299
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1300
     * See 12.8
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1301
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1302
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1303
    private void breakStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1304
        // Capture BREAK token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1305
        final int  breakLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1306
        final long breakToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1307
        // BREAK tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1308
        nextOrEOL();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1309
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1310
        LabelNode labelNode = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1311
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1312
        // SEMICOLON or label.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1313
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1314
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1315
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1316
        case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1317
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1318
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1319
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1320
            final IdentNode ident = getIdent();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1321
            labelNode = lc.findLabel(ident.getName());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1322
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1323
            if (labelNode == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1324
                throw error(AbstractParser.message("undefined.label", ident.getName()), ident.getToken());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1325
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1326
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1327
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1328
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1329
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1330
        //either an explicit label - then get its node or just a "break" - get first breakable
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1331
        //targetNode is what we are breaking out from.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1332
        final IdentNode label = labelNode == null ? null : labelNode.getLabel();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1333
        final BreakableNode targetNode = lc.getBreakable(label);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1334
        if (targetNode == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1335
            throw error(AbstractParser.message("illegal.break.stmt"), breakToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1336
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1337
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1338
        endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1339
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1340
        // Construct and add BREAK node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1341
        appendStatement(new BreakNode(breakLine, breakToken, finish, label == null ? null : new IdentNode(label)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1342
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1343
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1344
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1345
     * ReturnStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1346
     *      return Expression? ; // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1347
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1348
     * See 12.9
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1349
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1350
     * Parse RETURN statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1351
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1352
    private void returnStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1353
        // check for return outside function
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1354
        if (lc.getCurrentFunction().getKind() == FunctionNode.Kind.SCRIPT) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1355
            throw error(AbstractParser.message("invalid.return"));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1356
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1357
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1358
        // Capture RETURN token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1359
        final int  returnLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1360
        final long returnToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1361
        // RETURN tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1362
        nextOrEOL();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1363
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1364
        Node expression = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1365
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1366
        // SEMICOLON or expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1367
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1368
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1369
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1370
        case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1371
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1372
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1373
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1374
            expression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1375
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1376
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1377
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1378
        endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1379
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1380
        // Construct and add RETURN node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1381
        appendStatement(new ReturnNode(returnLine, returnToken, finish, expression));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1382
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1383
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1384
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1385
     * YieldStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1386
     *      yield Expression? ; // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1387
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1388
     * JavaScript 1.8
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1389
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1390
     * Parse YIELD statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1391
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1392
    private void yieldStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1393
        // Capture YIELD token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1394
        final int  yieldLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1395
        final long yieldToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1396
        // YIELD tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1397
        nextOrEOL();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1398
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1399
        Node expression = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1400
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1401
        // SEMICOLON or expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1402
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1403
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1404
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1405
        case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1406
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1407
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1408
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1409
            expression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1410
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1411
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1412
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1413
        endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1414
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1415
        // Construct and add YIELD node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1416
        appendStatement(new ReturnNode(yieldLine, yieldToken, finish, expression));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1417
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1418
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1419
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1420
     * WithStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1421
     *      with ( Expression ) Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1422
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1423
     * See 12.10
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1424
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1425
     * Parse WITH statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1426
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1427
    private void withStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1428
        // Capture WITH token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1429
        final int  withLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1430
        final long withToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1431
        // WITH tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1432
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1433
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1434
        // ECMA 12.10.1 strict mode restrictions
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1435
        if (isStrictMode) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1436
            throw error(AbstractParser.message("strict.no.with"), withToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1437
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1438
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1439
        // Get WITH expression.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1440
        WithNode withNode = new WithNode(withLine, withToken, finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1441
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1442
        try {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1443
            lc.push(withNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1444
            expect(LPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1445
            withNode = withNode.setExpression(lc, expression());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1446
            expect(RPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1447
            withNode = withNode.setBody(lc, getStatement());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1448
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1449
            lc.pop(withNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1450
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1451
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1452
        appendStatement(withNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1453
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1454
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1455
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1456
     * SwitchStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1457
     *      switch ( Expression ) CaseBlock
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1458
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1459
     * CaseBlock :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1460
     *      { CaseClauses? }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1461
     *      { CaseClauses? DefaultClause CaseClauses }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1462
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1463
     * CaseClauses :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1464
     *      CaseClause
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1465
     *      CaseClauses CaseClause
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1466
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1467
     * CaseClause :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1468
     *      case Expression : StatementList?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1469
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1470
     * DefaultClause :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1471
     *      default : StatementList?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1472
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1473
     * See 12.11
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1474
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1475
     * Parse SWITCH statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1476
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1477
    private void switchStatement() {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1478
        final int  switchLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1479
        final long switchToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1480
        // SWITCH tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1481
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1482
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1483
        // Create and add switch statement.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1484
        SwitchNode switchNode = new SwitchNode(switchLine, switchToken, Token.descPosition(switchToken), null, new ArrayList<CaseNode>(), null);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1485
        lc.push(switchNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1486
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1487
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1488
            expect(LPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1489
            switchNode = switchNode.setExpression(lc, expression());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1490
            expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1491
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1492
            expect(LBRACE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1493
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1494
            // Prepare to accumulate cases.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1495
            final List<CaseNode> cases = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1496
            CaseNode defaultCase = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1497
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1498
            while (type != RBRACE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1499
                // Prepare for next case.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1500
                Node caseExpression = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1501
                final long caseToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1502
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1503
                switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1504
                case CASE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1505
                    next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1506
                    caseExpression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1507
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1508
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1509
                case DEFAULT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1510
                    if (defaultCase != null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1511
                        throw error(AbstractParser.message("duplicate.default.in.switch"));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1512
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1513
                    next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1514
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1515
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1516
                default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1517
                    // Force an error.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1518
                    expect(CASE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1519
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1520
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1521
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1522
                expect(COLON);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1523
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1524
                // Get CASE body.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1525
                final Block statements = getBlock(false);
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1526
                final CaseNode caseNode = new CaseNode(caseToken, finish, caseExpression, statements);
16153
60de45bf54b0 8005703: Offsets miscalculated for blocks
jlaskey
parents: 16151
diff changeset
  1527
                statements.setFinish(finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1528
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1529
                if (caseExpression == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1530
                    defaultCase = caseNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1531
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1532
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1533
                cases.add(caseNode);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1534
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1535
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1536
            switchNode = switchNode.setCases(lc, cases, defaultCase);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1537
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1538
            switchNode.setFinish(finish);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1539
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1540
            appendStatement(switchNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1541
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1542
            lc.pop(switchNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1543
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1544
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1545
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1546
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1547
     * LabelledStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1548
     *      Identifier : Statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1549
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1550
     * See 12.12
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1551
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1552
     * Parse label statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1553
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1554
    private void labelStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1555
        // Capture label token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1556
        final long labelToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1557
        // Get label ident.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1558
        final IdentNode ident = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1559
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1560
        expect(COLON);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1561
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1562
        if (lc.findLabel(ident.getName()) != null) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1563
            throw error(AbstractParser.message("duplicate.label", ident.getName()), labelToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1564
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1565
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1566
        LabelNode labelNode = new LabelNode(line, labelToken, finish, ident, null);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1567
        try {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1568
            lc.push(labelNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1569
            labelNode = labelNode.setBody(lc, getStatement());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1570
            labelNode.setFinish(finish);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1571
            appendStatement(labelNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1572
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1573
            assert lc.peek() instanceof LabelNode;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1574
            lc.pop(labelNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1575
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1576
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1577
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1578
   /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1579
     * ThrowStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1580
     *      throw Expression ; // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1581
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1582
     * See 12.13
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1583
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1584
     * Parse throw statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1585
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1586
    private void throwStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1587
        // Capture THROW token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1588
        final int  throwLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1589
        final long throwToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1590
        // THROW tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1591
        nextOrEOL();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1592
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1593
        Node expression = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1594
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1595
        // SEMICOLON or expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1596
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1597
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1598
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1599
        case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1600
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1601
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1602
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1603
            expression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1604
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1605
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1606
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1607
        if (expression == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1608
            throw error(AbstractParser.message("expected.operand", type.getNameOrType()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1609
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1610
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1611
        endOfLine();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1612
17745
86e5a15b3b20 8014426: Original exception no longer thrown away when a finally rethrows
lagergren
parents: 17524
diff changeset
  1613
        appendStatement(new ThrowNode(throwLine, throwToken, finish, expression, 0));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1614
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1615
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1616
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1617
     * TryStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1618
     *      try Block Catch
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1619
     *      try Block Finally
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1620
     *      try Block Catch Finally
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1621
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1622
     * Catch :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1623
     *      catch( Identifier if Expression ) Block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1624
     *      catch( Identifier ) Block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1625
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1626
     * Finally :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1627
     *      finally Block
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1628
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1629
     * See 12.14
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1630
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1631
     * Parse TRY statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1632
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1633
    private void tryStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1634
        // Capture TRY token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1635
        final int  tryLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1636
        final long tryToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1637
        // TRY tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1638
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1639
16239
fbae49f786c6 8008215: break in catch clause causes java.lang.VerifyError: Inconsistent stackmap
hannesw
parents: 16237
diff changeset
  1640
        // Container block needed to act as target for labeled break statements
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1641
        Block outer = newBlock();
16239
fbae49f786c6 8008215: break in catch clause causes java.lang.VerifyError: Inconsistent stackmap
hannesw
parents: 16237
diff changeset
  1642
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1643
        // Create try.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1644
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1645
        try {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1646
            final Block       tryBody     = getBlock(true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1647
            final List<Block> catchBlocks = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1648
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1649
            while (type == CATCH) {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1650
                final int  catchLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1651
                final long catchToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1652
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1653
                expect(LPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1654
                final IdentNode exception = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1655
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1656
                // ECMA 12.4.1 strict mode restrictions
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1657
                verifyStrictIdent(exception, "catch argument");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1658
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1659
                // Check for conditional catch.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1660
                Node ifExpression = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1661
                if (type == IF) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1662
                    next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1663
                    // Get the exception condition.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1664
                    ifExpression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1665
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1666
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1667
                expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1668
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1669
                Block catchBlock = newBlock();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1670
                try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1671
                    // Get CATCH body.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1672
                    final Block catchBody = getBlock(true);
17745
86e5a15b3b20 8014426: Original exception no longer thrown away when a finally rethrows
lagergren
parents: 17524
diff changeset
  1673
                    final CatchNode catchNode = new CatchNode(catchLine, catchToken, finish, exception, ifExpression, catchBody, 0);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1674
                    appendStatement(catchNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1675
                } finally {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1676
                    catchBlock = restoreBlock(catchBlock);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1677
                    catchBlocks.add(catchBlock);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1678
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1679
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1680
                // If unconditional catch then should to be the end.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1681
                if (ifExpression == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1682
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1683
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1684
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1685
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1686
            // Prepare to capture finally statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1687
            Block finallyStatements = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1688
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1689
            if (type == FINALLY) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1690
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1691
                finallyStatements = getBlock(true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1692
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1693
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1694
            // Need at least one catch or a finally.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1695
            if (catchBlocks.isEmpty() && finallyStatements == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1696
                throw error(AbstractParser.message("missing.catch.or.finally"), tryToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1697
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1698
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1699
            final TryNode tryNode = new TryNode(tryLine, tryToken, Token.descPosition(tryToken), tryBody, catchBlocks, finallyStatements);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1700
            // Add try.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1701
            assert lc.peek() == outer;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1702
            appendStatement(tryNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1703
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1704
            tryNode.setFinish(finish);
16239
fbae49f786c6 8008215: break in catch clause causes java.lang.VerifyError: Inconsistent stackmap
hannesw
parents: 16237
diff changeset
  1705
            outer.setFinish(finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1706
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1707
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1708
            outer = restoreBlock(outer);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1709
        }
16239
fbae49f786c6 8008215: break in catch clause causes java.lang.VerifyError: Inconsistent stackmap
hannesw
parents: 16237
diff changeset
  1710
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1711
        appendStatement(new ExecuteNode(outer.getLineNumber(), outer.getToken(), outer.getFinish(), outer));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1712
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1713
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1714
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1715
     * DebuggerStatement :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1716
     *      debugger ;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1717
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1718
     * See 12.15
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1719
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1720
     * Parse debugger statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1721
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1722
    private void  debuggerStatement() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1723
        // Capture DEBUGGER token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1724
        final int  debuggerLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1725
        final long debuggerToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1726
        // DEBUGGER tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1727
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1728
        endOfLine();
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1729
        appendStatement(new ExecuteNode(debuggerLine, debuggerToken, finish, new RuntimeNode(debuggerToken, finish, RuntimeNode.Request.DEBUGGER, new ArrayList<Node>())));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1730
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1731
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1732
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1733
     * PrimaryExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1734
     *      this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1735
     *      Identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1736
     *      Literal
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1737
     *      ArrayLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1738
     *      ObjectLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1739
     *      ( Expression )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1740
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1741
     *  See 11.1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1742
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1743
     * Parse primary expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1744
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1745
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1746
    @SuppressWarnings("fallthrough")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1747
    private Node primaryExpression() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1748
        // Capture first token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1749
        final int  primaryLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1750
        final long primaryToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1751
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1752
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1753
        case THIS:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1754
            final String name = type.getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1755
            next();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1756
            return new IdentNode(primaryToken, finish, name);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1757
        case IDENT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1758
            final IdentNode ident = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1759
            if (ident == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1760
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1761
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1762
            detectSpecialProperty(ident);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1763
            return ident;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1764
        case OCTAL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1765
            if (isStrictMode) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1766
               throw error(AbstractParser.message("strict.no.octal"), token);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1767
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1768
        case STRING:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1769
        case ESCSTRING:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1770
        case DECIMAL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1771
        case HEXADECIMAL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1772
        case FLOATING:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1773
        case REGEX:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1774
        case XML:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1775
            return getLiteral();
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1776
        case EXECSTRING:
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1777
            return execString(primaryLine, primaryToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1778
        case FALSE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1779
            next();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1780
            return LiteralNode.newInstance(primaryToken, finish, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1781
        case TRUE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1782
            next();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1783
            return LiteralNode.newInstance(primaryToken, finish, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1784
        case NULL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1785
            next();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1786
            return LiteralNode.newInstance(primaryToken, finish);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1787
        case LBRACKET:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1788
            return arrayLiteral();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1789
        case LBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1790
            return objectLiteral();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1791
        case LPAREN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1792
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1793
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1794
            final Node expression = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1795
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1796
            expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1797
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1798
            return expression;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1799
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1800
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1801
            // In this context some operator tokens mark the start of a literal.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1802
            if (lexer.scanLiteral(primaryToken, type)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1803
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1804
                return getLiteral();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1805
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1806
            if (isNonStrictModeIdent()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1807
                return getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1808
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1809
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1810
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1811
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1812
        return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1813
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1814
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1815
    /**
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1816
     * Convert execString to a call to $EXEC.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1817
     *
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1818
     * @param primaryToken Original string token.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1819
     * @return callNode to $EXEC.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1820
     */
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1821
    Node execString(final int primaryLine, final long primaryToken) {
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1822
        // Synthesize an ident to call $EXEC.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1823
        final IdentNode execIdent = new IdentNode(primaryToken, finish, ScriptingFunctions.EXEC_NAME);
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1824
        // Skip over EXECSTRING.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1825
        next();
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1826
        // Set up argument list for call.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1827
        final List<Node> arguments = new ArrayList<>();
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1828
        // Skip beginning of edit string expression.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1829
        expect(LBRACE);
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1830
        // Add the following expression to arguments.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1831
        arguments.add(expression());
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1832
        // Skip ending of edit string expression.
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1833
        expect(RBRACE);
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1834
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  1835
        return new CallNode(primaryLine, primaryToken, finish, execIdent, arguments);
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16206
diff changeset
  1836
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1837
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1838
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1839
     * ArrayLiteral :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1840
     *      [ Elision? ]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1841
     *      [ ElementList ]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1842
     *      [ ElementList , Elision? ]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1843
     *      [ expression for (LeftHandExpression in expression) ( (if ( Expression ) )? ]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1844
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1845
     * ElementList : Elision? AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1846
     *      ElementList , Elision? AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1847
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1848
     * Elision :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1849
     *      ,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1850
     *      Elision ,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1851
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1852
     * See 12.1.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1853
     * JavaScript 1.8
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1854
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1855
     * Parse array literal.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1856
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1857
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1858
    private Node arrayLiteral() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1859
        // Capture LBRACKET token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1860
        final long arrayToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1861
        // LBRACKET tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1862
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1863
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1864
        // Prepare to accummulating elements.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1865
        final List<Node> elements = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1866
        // Track elisions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1867
        boolean elision = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1868
loop:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1869
        while (true) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1870
             switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1871
            case RBRACKET:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1872
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1873
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1874
                break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1875
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1876
            case COMMARIGHT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1877
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1878
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1879
                // If no prior expression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1880
                if (elision) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1881
                    elements.add(null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1882
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1883
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1884
                elision = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1885
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1886
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1887
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1888
            default:
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1889
                if (!elision) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1890
                    throw error(AbstractParser.message("expected.comma", type.getNameOrType()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1891
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1892
                // Add expression element.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1893
                final Node expression = assignmentExpression(false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1894
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1895
                if (expression != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1896
                    elements.add(expression);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1897
                } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1898
                    expect(RBRACKET);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1899
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1900
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1901
                elision = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1902
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1903
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1904
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1905
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  1906
        return LiteralNode.newInstance(arrayToken, finish, elements);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1907
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1908
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1909
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1910
     * ObjectLiteral :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1911
     *      { }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1912
     *      { PropertyNameAndValueList } { PropertyNameAndValueList , }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1913
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1914
     * PropertyNameAndValueList :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1915
     *      PropertyAssignment
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1916
     *      PropertyNameAndValueList , PropertyAssignment
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1917
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1918
     * See 11.1.5
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1919
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1920
     * Parse an object literal.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1921
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1922
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1923
    private Node objectLiteral() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1924
        // Capture LBRACE token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1925
        final long objectToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1926
        // LBRACE tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1927
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1928
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1929
        // Object context.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1930
        // Prepare to accumulate elements.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1931
       // final List<Node> elements = new ArrayList<>();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1932
        final Map<String, PropertyNode> map = new LinkedHashMap<>();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1933
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1934
        // Create a block for the object literal.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1935
            boolean commaSeen = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1936
loop:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1937
            while (true) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1938
                switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1939
                case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1940
                    next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1941
                    break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1942
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1943
                case COMMARIGHT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1944
                    next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1945
                    commaSeen = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1946
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1947
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1948
                default:
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1949
                    if (!commaSeen) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1950
                        throw error(AbstractParser.message("expected.comma", type.getNameOrType()));
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1951
                    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1952
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1953
                    commaSeen = false;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1954
                    // Get and add the next property.
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1955
                    final PropertyNode property = propertyAssignment();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1956
                    final String key = property.getKeyName();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1957
                    final PropertyNode existingProperty = map.get(key);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1958
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1959
                    if (existingProperty == null) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1960
                        map.put(key, property);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1961
                       // elements.add(property);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1962
                        break;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1963
                    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1964
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1965
                    // ECMA section 11.1.5 Object Initialiser
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1966
                    // point # 4 on property assignment production
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1967
                    final Node         value  = property.getValue();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1968
                    final FunctionNode getter = property.getGetter();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1969
                    final FunctionNode setter = property.getSetter();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1970
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1971
                    final Node         prevValue  = existingProperty.getValue();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1972
                    final FunctionNode prevGetter = existingProperty.getGetter();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1973
                    final FunctionNode prevSetter = existingProperty.getSetter();
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1974
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1975
                    boolean redefinitionOk = true;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1976
                    // ECMA 11.1.5 strict mode restrictions
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1977
                    if (isStrictMode) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1978
                        if (value != null && prevValue != null) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1979
                            redefinitionOk = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1980
                        }
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1981
                    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1982
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1983
                    final boolean isPrevAccessor = prevGetter != null || prevSetter != null;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  1984
                    final boolean isAccessor     = getter != null     || setter != null;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1985
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1986
                    // data property redefined as accessor property
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1987
                    if (prevValue != null && isAccessor) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1988
                        redefinitionOk = false;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1989
                    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1990
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1991
                    // accessor property redefined as data
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1992
                    if (isPrevAccessor && value != null) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1993
                        redefinitionOk = false;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1994
                    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1995
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1996
                    if (isAccessor && isPrevAccessor) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1997
                        if (getter != null && prevGetter != null ||
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1998
                            setter != null && prevSetter != null) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  1999
                            redefinitionOk = false;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2000
                        }
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2001
                    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2002
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2003
                    if (!redefinitionOk) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2004
                        throw error(AbstractParser.message("property.redefinition", key.toString()), property.getToken());
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2005
                    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2006
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2007
                    PropertyNode newProperty = existingProperty;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2008
                    if (value != null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2009
                        if (prevValue == null) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2010
                            map.put(key, newProperty = newProperty.setValue(value));
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2011
                        } else {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2012
                            final long propertyToken = Token.recast(newProperty.getToken(), COMMARIGHT);
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2013
                            map.put(key, newProperty = newProperty.setValue(new BinaryNode(propertyToken, prevValue, value)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2014
                        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2015
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2016
                        map.put(key, newProperty = newProperty.setGetter(null).setSetter(null));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2017
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2018
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2019
                    if (getter != null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2020
                        map.put(key, newProperty = newProperty.setGetter(getter));
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2021
                    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2022
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2023
                    if (setter != null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2024
                        map.put(key, newProperty = newProperty.setSetter(setter));
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2025
                    }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2026
                    break;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2027
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2028
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2029
17981
9b8e085aa1fe 8015955: ObjectNode.elements should be stronger typed
attila
parents: 17973
diff changeset
  2030
        return new ObjectNode(objectToken, finish, new ArrayList<>(map.values()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2031
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2032
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2033
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2034
     * PropertyName :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2035
     *      IdentifierName
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2036
     *      StringLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2037
     *      NumericLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2038
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2039
     * See 11.1.5
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2040
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2041
     * @return PropertyName node
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2042
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2043
    @SuppressWarnings("fallthrough")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2044
    private PropertyKey propertyName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2045
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2046
        case IDENT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2047
            return getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2048
        case OCTAL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2049
            if (isStrictMode) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2050
                throw error(AbstractParser.message("strict.no.octal"), token);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2051
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2052
        case STRING:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2053
        case ESCSTRING:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2054
        case DECIMAL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2055
        case HEXADECIMAL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2056
        case FLOATING:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2057
            return getLiteral();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2058
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2059
            return getIdentifierName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2060
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2061
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2062
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2063
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2064
     * PropertyAssignment :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2065
     *      PropertyName : AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2066
     *      get PropertyName ( ) { FunctionBody }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2067
     *      set PropertyName ( PropertySetParameterList ) { FunctionBody }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2068
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2069
     * PropertySetParameterList :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2070
     *      Identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2071
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2072
     * PropertyName :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2073
     *      IdentifierName
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2074
     *      StringLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2075
     *      NumericLiteral
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2076
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2077
     * See 11.1.5
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2078
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2079
     * Parse an object literal property.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2080
     * @return Property or reference node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2081
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2082
    private PropertyNode propertyAssignment() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2083
        // Capture firstToken.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2084
        final long propertyToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2085
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2086
        FunctionNode functionNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2087
        PropertyKey propertyName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2088
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2089
        if (type == IDENT) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2090
            // Get IDENT.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2091
            final String ident = (String)expectValue(IDENT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2092
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2093
            if (type != COLON) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2094
                final long getSetToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2095
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2096
                switch (ident) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2097
                case "get":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2098
                    final PropertyKey getIdent = propertyName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2099
                    final String getterName = getIdent.getPropertyName();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2100
                    final IdentNode getNameNode = new IdentNode(((Node)getIdent).getToken(), finish, "get " + getterName);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2101
                    expect(LPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2102
                    expect(RPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2103
                    functionNode = functionBody(getSetToken, getNameNode, new ArrayList<IdentNode>(), FunctionNode.Kind.GETTER);
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2104
                    return new PropertyNode(propertyToken, finish, getIdent, null, functionNode, null);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2105
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2106
                case "set":
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2107
                    final PropertyKey setIdent = propertyName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2108
                    final String setterName = setIdent.getPropertyName();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2109
                    final IdentNode setNameNode = new IdentNode(((Node)setIdent).getToken(), finish, "set " + setterName);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2110
                    expect(LPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2111
                    final IdentNode argIdent = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2112
                    verifyStrictIdent(argIdent, "setter argument");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2113
                    expect(RPAREN);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2114
                    List<IdentNode> parameters = new ArrayList<>();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2115
                    parameters.add(argIdent);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2116
                    functionNode = functionBody(getSetToken, setNameNode, parameters, FunctionNode.Kind.SETTER);
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2117
                    return new PropertyNode(propertyToken, finish, setIdent, null, null, functionNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2118
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2119
                default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2120
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2121
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2122
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2123
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2124
            propertyName =  new IdentNode(propertyToken, finish, ident);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2125
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2126
            propertyName = propertyName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2127
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2128
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2129
        expect(COLON);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2130
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2131
        return new PropertyNode(propertyToken, finish, propertyName, assignmentExpression(false), null, null);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2132
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2133
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2134
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2135
     * LeftHandSideExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2136
     *      NewExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2137
     *      CallExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2138
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2139
     * CallExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2140
     *      MemberExpression Arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2141
     *      CallExpression Arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2142
     *      CallExpression [ Expression ]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2143
     *      CallExpression . IdentifierName
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2144
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2145
     * See 11.2
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2146
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2147
     * Parse left hand side expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2148
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2149
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2150
    private Node leftHandSideExpression() {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2151
        int  callLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2152
        long callToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2153
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2154
        Node lhs = memberExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2155
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2156
        if (type == LPAREN) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2157
            final List<Node> arguments = argumentList();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2159
            // Catch special functions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2160
            if (lhs instanceof IdentNode) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2161
                detectSpecialFunction((IdentNode)lhs);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2162
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2163
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2164
            lhs = new CallNode(callLine, callToken, finish, lhs, arguments);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2165
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2166
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2167
loop:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2168
        while (true) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2169
            // Capture token.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2170
            callLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2171
            callToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2172
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2173
            switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2174
            case LPAREN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2175
                // Get NEW or FUNCTION arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2176
                final List<Node> arguments = argumentList();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2177
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2178
                // Create call node.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2179
                lhs = new CallNode(callLine, callToken, finish, lhs, arguments);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2180
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2181
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2183
            case LBRACKET:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2184
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2185
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2186
                // Get array index.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2187
                final Node rhs = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2188
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2189
                expect(RBRACKET);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2190
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2191
                // Create indexing node.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2192
                lhs = new IndexNode(callToken, finish, lhs, rhs);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2193
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2194
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2196
            case PERIOD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2197
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2198
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2199
                final IdentNode property = getIdentifierName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2200
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2201
                // Create property access node.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2202
                lhs = new AccessNode(callToken, finish, lhs, property);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2203
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2204
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2205
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2206
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2207
                break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2208
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2209
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2210
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2211
        return lhs;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2212
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2213
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2214
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2215
     * NewExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2216
     *      MemberExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2217
     *      new NewExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2218
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2219
     * See 11.2
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2220
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2221
     * Parse new expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2222
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2223
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2224
    private Node newExpression() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2225
        final long newToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2226
        // NEW is tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2227
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2228
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2229
        // Get function base.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2230
        final int  callLine    = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2231
        final Node constructor = memberExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2232
        if (constructor == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2233
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2234
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2235
        // Get arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2236
        List<Node> arguments;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2237
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2238
        // Allow for missing arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2239
        if (type == LPAREN) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2240
            arguments = argumentList();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2241
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2242
            arguments = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2243
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2244
16196
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16191
diff changeset
  2245
        // Nashorn extension: This is to support the following interface implementation
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16191
diff changeset
  2246
        // syntax:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2247
        //
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2248
        //     var r = new java.lang.Runnable() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2249
        //         run: function() { println("run"); }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2250
        //     };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2251
        //
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2252
        // The object literal following the "new Constructor()" expresssion
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2253
        // is passed as an additional (last) argument to the constructor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2254
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
  2255
        if (!env._no_syntax_extensions && type == LBRACE) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2256
            arguments.add(objectLiteral());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2257
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2258
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2259
        final CallNode callNode = new CallNode(callLine, constructor.getToken(), finish, constructor, arguments);
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2260
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2261
        return new UnaryNode(newToken, callNode);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2262
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2263
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2264
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2265
     * MemberExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2266
     *      PrimaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2267
     *      FunctionExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2268
     *      MemberExpression [ Expression ]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2269
     *      MemberExpression . IdentifierName
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2270
     *      new MemberExpression Arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2271
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2272
     * See 11.2
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2273
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2274
     * Parse member expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2275
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2276
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2277
    private Node memberExpression() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2278
        // Prepare to build operation.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2279
        Node lhs;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2280
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2281
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2282
        case NEW:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2283
            // Get new exppression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2284
            lhs = newExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2285
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2286
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2287
        case FUNCTION:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2288
            // Get function expression.
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2289
            lhs = functionExpression(false, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2290
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2291
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2292
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2293
            // Get primary expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2294
            lhs = primaryExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2295
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2296
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2297
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2298
loop:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2299
        while (true) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2300
            // Capture token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2301
            final long callToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2302
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2303
            switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2304
            case LBRACKET:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2305
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2306
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2307
                // Get array index.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2308
                final Node index = expression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2309
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2310
                expect(RBRACKET);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2311
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2312
                // Create indexing node.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2313
                lhs = new IndexNode(callToken, finish, lhs, index);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2314
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2315
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2316
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2317
            case PERIOD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2318
                if (lhs == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2319
                    throw error(AbstractParser.message("expected.operand", type.getNameOrType()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2320
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2321
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2322
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2323
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2324
                final IdentNode property = getIdentifierName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2325
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2326
                // Create property access node.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2327
                lhs = new AccessNode(callToken, finish, lhs, property);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2328
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2329
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2330
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2331
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2332
                break loop;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2333
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2334
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2335
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2336
        return lhs;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2337
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2338
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2339
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2340
     * Arguments :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2341
     *      ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2342
     *      ( ArgumentList )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2343
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2344
     * ArgumentList :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2345
     *      AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2346
     *      ArgumentList , AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2347
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2348
     * See 11.2
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2349
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2350
     * Parse function call arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2351
     * @return Argument list.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2352
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2353
    private List<Node> argumentList() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2354
        // Prepare to accumulate list of arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2355
        final List<Node> nodeList = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2356
        // LPAREN tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2357
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2358
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2359
        // Track commas.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2360
        boolean first = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2361
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2362
        while (type != RPAREN) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2363
            // Comma prior to every argument except the first.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2364
            if (!first) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2365
                expect(COMMARIGHT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2366
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2367
                first = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2368
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2369
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2370
            // Get argument expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2371
            nodeList.add(assignmentExpression(false));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2372
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2373
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2374
        expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2375
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2376
        return nodeList;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2377
   }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2378
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2379
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2380
     * FunctionDeclaration :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2381
     *      function Identifier ( FormalParameterList? ) { FunctionBody }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2382
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2383
     * FunctionExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2384
     *      function Identifier? ( FormalParameterList? ) { FunctionBody }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2385
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2386
     * See 13
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2387
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2388
     * Parse function declaration.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2389
     * @param isStatement True if for is a statement.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2390
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2391
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2392
     */
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2393
    private Node functionExpression(final boolean isStatement, final boolean topLevel) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2394
        final long functionToken = token;
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2395
        final int  functionLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2396
        // FUNCTION is tested in caller.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2397
        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2398
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2399
        IdentNode name = null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2400
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2401
        if (type == IDENT || isNonStrictModeIdent()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2402
            name = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2403
            verifyStrictIdent(name, "function name");
16196
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16191
diff changeset
  2404
        } else if (isStatement) {
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16191
diff changeset
  2405
            // Nashorn extension: anonymous function statements
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
  2406
            if (env._no_syntax_extensions || !env._anon_functions) {
16196
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16191
diff changeset
  2407
                expect(IDENT);
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16191
diff changeset
  2408
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2409
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2410
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2411
        // name is null, generate anonymous name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2412
        boolean isAnonymous = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2413
        if (name == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2414
            final String tmpName = "_L" + source.getLine(Token.descPosition(token));
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2415
            name = new IdentNode(functionToken, Token.descPosition(functionToken), tmpName);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2416
            isAnonymous = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2417
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2418
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2419
        expect(LPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2420
        final List<IdentNode> parameters = formalParameterList();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2421
        expect(RPAREN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2422
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2423
        FunctionNode functionNode = functionBody(functionToken, name, parameters, FunctionNode.Kind.NORMAL);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2424
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2425
        if (isStatement) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2426
            if (topLevel) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2427
                functionNode = functionNode.setFlag(lc, FunctionNode.IS_DECLARED);
17257
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 17255
diff changeset
  2428
            } else if (isStrictMode) {
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 17255
diff changeset
  2429
                throw error(JSErrorType.SYNTAX_ERROR, AbstractParser.message("strict.no.func.decl.here"), functionToken);
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 17255
diff changeset
  2430
            } else if (env._function_statement == ScriptEnvironment.FunctionStatementBehavior.ERROR) {
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 17255
diff changeset
  2431
                throw error(JSErrorType.SYNTAX_ERROR, AbstractParser.message("no.func.decl.here"), functionToken);
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 17255
diff changeset
  2432
            } else if (env._function_statement == ScriptEnvironment.FunctionStatementBehavior.WARNING) {
a2232050cd8f 8008814: Configurable ignore/warning/error behavior for function declaration as statement
attila
parents: 17255
diff changeset
  2433
                warning(JSErrorType.SYNTAX_ERROR, AbstractParser.message("no.func.decl.here.warn"), functionToken);
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2434
            }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2435
            if (ARGUMENTS.symbolName().equals(name.getName())) {
17249
a2014831ae7a 8013325: function named 'arguments' should set DEFINES_ARGUMENTS flag in its parent, not itself
attila
parents: 17233
diff changeset
  2436
                lc.setFlag(lc.getCurrentFunction(), FunctionNode.DEFINES_ARGUMENTS);
16206
83069fa0935b 8006529: Methods always get callee - it should be conditional
attila
parents: 16201
diff changeset
  2437
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2438
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2439
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2440
        if (isAnonymous) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2441
            functionNode = functionNode.setFlag(lc, FunctionNode.IS_ANONYMOUS);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2442
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2443
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2444
        final int arity = parameters.size();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2445
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2446
        final boolean strict = functionNode.isStrict();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2447
        if (arity > 1) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2448
            final HashSet<String> parametersSet = new HashSet<>(arity);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2449
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2450
            for (int i = arity - 1; i >= 0; i--) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2451
                final IdentNode parameter = parameters.get(i);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2452
                String parameterName = parameter.getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2453
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2454
                if (ARGUMENTS.symbolName().equals(parameterName)) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2455
                    functionNode = functionNode.setFlag(lc, FunctionNode.DEFINES_ARGUMENTS);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2456
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2457
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2458
                if (parametersSet.contains(parameterName)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2459
                    // redefinition of parameter name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2460
                    if (strict) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2461
                        throw error(AbstractParser.message("strict.param.redefinition", parameterName), parameter.getToken());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2462
                    }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2463
                    // rename in non-strict mode
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2464
                    parameterName = functionNode.uniqueName(parameterName);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2465
                    final long parameterToken = parameter.getToken();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2466
                    parameters.set(i, new IdentNode(parameterToken, Token.descPosition(parameterToken), functionNode.uniqueName(parameterName)));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2467
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2468
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2469
                parametersSet.add(parameterName);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2470
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2471
        } else if (arity == 1) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2472
            if (ARGUMENTS.symbolName().equals(parameters.get(0).getName())) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2473
                functionNode = functionNode.setFlag(lc, FunctionNode.DEFINES_ARGUMENTS);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2474
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2475
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2476
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2477
        if (isStatement) {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2478
            final VarNode varNode = new VarNode(functionLine, functionToken, finish, name, functionNode, VarNode.IS_STATEMENT);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2479
            if (topLevel) {
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2480
                functionDeclarations.add(varNode);
16191
7dd981da8e11 8006755: Functions inside with statements dont get correct scope
sundar
parents: 16187
diff changeset
  2481
            } else {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2482
                appendStatement(varNode);
16191
7dd981da8e11 8006755: Functions inside with statements dont get correct scope
sundar
parents: 16187
diff changeset
  2483
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2484
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2485
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2486
        return functionNode;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2487
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2488
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2489
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2490
     * FormalParameterList :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2491
     *      Identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2492
     *      FormalParameterList , Identifier
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2493
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2494
     * See 13
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2495
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2496
     * Parse function parameter list.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2497
     * @return List of parameter nodes.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2498
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2499
    private List<IdentNode> formalParameterList() {
17973
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2500
        return formalParameterList(RPAREN);
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2501
    }
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2502
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2503
    /**
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2504
     * Same as the other method of the same name - except that the end
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2505
     * token type expected is passed as argument to this method.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2506
     *
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2507
     * FormalParameterList :
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2508
     *      Identifier
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2509
     *      FormalParameterList , Identifier
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2510
     *
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2511
     * See 13
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2512
     *
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2513
     * Parse function parameter list.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2514
     * @return List of parameter nodes.
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2515
     */
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2516
    private List<IdentNode> formalParameterList(final TokenType endType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2517
        // Prepare to gather parameters.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2518
        final List<IdentNode> parameters = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2519
        // Track commas.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2520
        boolean first = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2521
17973
d220c8157f25 8015345: Function("}),print('test'),({") should throw SyntaxError
sundar
parents: 17745
diff changeset
  2522
        while (type != endType) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2523
            // Comma prior to every argument except the first.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2524
            if (!first) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2525
                expect(COMMARIGHT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2526
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2527
                first = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2528
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2529
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2530
            // Get and add parameter.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2531
            final IdentNode ident = getIdent();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2532
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2533
            // ECMA 13.1 strict mode restrictions
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2534
            verifyStrictIdent(ident, "function parameter");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2535
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2536
            parameters.add(ident);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2537
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2538
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2539
        return parameters;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2540
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2541
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2542
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2543
     * FunctionBody :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2544
     *      SourceElements?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2545
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2546
     * See 13
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2547
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2548
     * Parse function body.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2549
     * @return function node (body.)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2550
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2551
    private FunctionNode functionBody(final long firstToken, final IdentNode ident, final List<IdentNode> parameters, final FunctionNode.Kind kind) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2552
        FunctionNode functionNode = null;
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2553
        long lastToken = 0L;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2554
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2555
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2556
            // Create a new function block.
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2557
            functionNode = newFunctionNode(firstToken, ident, parameters, kind);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2558
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2559
            // Nashorn extension: expression closures
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16252
diff changeset
  2560
            if (!env._no_syntax_extensions && type != LBRACE) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2561
                /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2562
                 * Example:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2563
                 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2564
                 * function square(x) x * x;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2565
                 * print(square(3));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2566
                 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2567
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2568
                // just expression as function body
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2569
                final Node expr = expression();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2570
                assert lc.getCurrentBlock() == lc.getFunctionBody(functionNode);
16201
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16196
diff changeset
  2571
                // create a return statement - this creates code in itself and does not need to be
889ddb179cdf 8007062: Split Lower up into Lower/Attr/FinalizeTypes. Integrate AccessSpecalizer into FinalizeTypes.
lagergren
parents: 16196
diff changeset
  2572
                // wrapped into an ExecuteNode
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2573
                final ReturnNode returnNode = new ReturnNode(functionNode.getLineNumber(), expr.getToken(), finish, expr);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2574
                appendStatement(returnNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2575
                lastToken = token;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2576
                functionNode.setFinish(Token.descPosition(token) + Token.descLength(token));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2577
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2578
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2579
                expect(LBRACE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2580
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2581
                // Gather the function elements.
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2582
                final List<Statement> prevFunctionDecls = functionDeclarations;
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2583
                functionDeclarations = new ArrayList<>();
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2584
                try {
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2585
                    sourceElements();
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2586
                    addFunctionDeclarations(functionNode);
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2587
                } finally {
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2588
                    functionDeclarations = prevFunctionDecls;
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2589
                }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2590
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2591
                lastToken = token;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2592
                expect(RBRACE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2593
                functionNode.setFinish(finish);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2594
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2595
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2596
        } finally {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2597
            functionNode = restoreFunctionNode(functionNode, lastToken);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2598
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2599
        return functionNode;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2600
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2601
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2602
    private void addFunctionDeclarations(final FunctionNode functionNode) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2603
        assert lc.peek() == lc.getFunctionBody(functionNode);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2604
        VarNode lastDecl = null;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2605
        for (int i = functionDeclarations.size() - 1; i >= 0; i--) {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2606
            Statement decl = functionDeclarations.get(i);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2607
            if (lastDecl == null && decl instanceof VarNode) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2608
                decl = lastDecl = ((VarNode)decl).setFlag(VarNode.IS_LAST_FUNCTION_DECLARATION);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2609
                lc.setFlag(functionNode, FunctionNode.HAS_FUNCTION_DECLARATIONS);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2610
            }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2611
            prependStatement(decl);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2612
        }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2613
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2614
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2615
    private static RuntimeNode referenceError(final Node lhs, final Node rhs) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2616
        final ArrayList<Node> args = new ArrayList<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2617
        args.add(lhs);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2618
        if (rhs == null) {
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2619
            args.add(LiteralNode.newInstance(lhs.getToken(), lhs.getFinish()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2620
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2621
            args.add(rhs);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2622
        }
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2623
        args.add(LiteralNode.newInstance(lhs.getToken(), lhs.getFinish(), lhs.toString()));
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2624
        return new RuntimeNode(lhs.getToken(), lhs.getFinish(), RuntimeNode.Request.REFERENCE_ERROR, args);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2625
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2626
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2627
    /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2628
     * parse LHS [a, b, ..., c].
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2629
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2630
     * JavaScript 1.8.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2631
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2632
    //private Node destructureExpression() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2633
    //    return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2634
    //}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2635
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2636
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2637
     * PostfixExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2638
     *      LeftHandSideExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2639
     *      LeftHandSideExpression ++ // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2640
     *      LeftHandSideExpression -- // [no LineTerminator here]
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2641
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2642
     * See 11.3
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2643
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2644
     * UnaryExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2645
     *      PostfixExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2646
     *      delete UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2647
     *      Node UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2648
     *      typeof UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2649
     *      ++ UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2650
     *      -- UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2651
     *      + UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2652
     *      - UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2653
     *      ~ UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2654
     *      ! UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2655
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2656
     * See 11.4
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2657
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2658
     * Parse unary expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2659
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2660
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2661
    private Node unaryExpression() {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2662
        final int  unaryLine  = line;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2663
        final long unaryToken = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2664
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2665
        switch (type) {
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2666
        case DELETE: {
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2667
            next();
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2668
            final Node expr = unaryExpression();
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2669
            if (expr instanceof BaseNode || expr instanceof IdentNode) {
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2670
                return new UnaryNode(unaryToken, expr);
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2671
            }
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2672
            appendStatement(new ExecuteNode(unaryLine, unaryToken, finish, expr));
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2673
            return LiteralNode.newInstance(unaryToken, finish, true);
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2674
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2675
        case VOID:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2676
        case TYPEOF:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2677
        case ADD:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2678
        case SUB:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2679
        case BIT_NOT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2680
        case NOT:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2681
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2682
            final Node expr = unaryExpression();
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2683
            return new UnaryNode(unaryToken, expr);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2684
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2685
        case INCPREFIX:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2686
        case DECPREFIX:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2687
            final TokenType opType = type;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2688
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2689
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2690
            final Node lhs = leftHandSideExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2691
            // ++, -- without operand..
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2692
            if (lhs == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2693
                // error would have been issued when looking for 'lhs'
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2694
                return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2695
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2696
            if (!(lhs instanceof AccessNode ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2697
                  lhs instanceof IndexNode ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2698
                  lhs instanceof IdentNode)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2699
                return referenceError(lhs, null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2700
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2701
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2702
            if (lhs instanceof IdentNode) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2703
                if (!checkIdentLValue((IdentNode)lhs)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2704
                    return referenceError(lhs, null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2705
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2706
                verifyStrictIdent((IdentNode)lhs, "operand for " + opType.getName() + " operator");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2707
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2708
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2709
            return incDecExpression(unaryToken, opType, lhs, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2710
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2711
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2712
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2713
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2714
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2715
        Node expression = leftHandSideExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2716
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2717
        if (last != EOL) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2718
            switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2719
            case INCPREFIX:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2720
            case DECPREFIX:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2721
                final TokenType opType = type;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2722
                final Node lhs = expression;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2723
                if (!(lhs instanceof AccessNode ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2724
                   lhs instanceof IndexNode ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2725
                   lhs instanceof IdentNode)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2726
                    next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2727
                    return referenceError(lhs, null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2728
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2729
                if (lhs instanceof IdentNode) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16262
diff changeset
  2730
                    if (!checkIdentLValue((IdentNode)lhs)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2731
                        next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2732
                        return referenceError(lhs, null);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2733
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2734
                    verifyStrictIdent((IdentNode)lhs, "operand for " + opType.getName() + " operator");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2735
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2736
                expression = incDecExpression(token, type, expression, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2737
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2738
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2739
            default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2740
                break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2741
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2742
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2743
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2744
        if (expression == null) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2745
            throw error(AbstractParser.message("expected.operand", type.getNameOrType()));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2746
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2747
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2748
        return expression;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2749
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2750
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2751
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2752
     * MultiplicativeExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2753
     *      UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2754
     *      MultiplicativeExpression * UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2755
     *      MultiplicativeExpression / UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2756
     *      MultiplicativeExpression % UnaryExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2757
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2758
     * See 11.5
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2759
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2760
     * AdditiveExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2761
     *      MultiplicativeExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2762
     *      AdditiveExpression + MultiplicativeExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2763
     *      AdditiveExpression - MultiplicativeExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2764
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2765
     * See 11.6
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2766
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2767
     * ShiftExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2768
     *      AdditiveExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2769
     *      ShiftExpression << AdditiveExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2770
     *      ShiftExpression >> AdditiveExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2771
     *      ShiftExpression >>> AdditiveExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2772
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2773
     * See 11.7
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2774
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2775
     * RelationalExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2776
     *      ShiftExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2777
     *      RelationalExpression < ShiftExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2778
     *      RelationalExpression > ShiftExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2779
     *      RelationalExpression <= ShiftExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2780
     *      RelationalExpression >= ShiftExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2781
     *      RelationalExpression instanceof ShiftExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2782
     *      RelationalExpression in ShiftExpression // if !noIf
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2783
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2784
     * See 11.8
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2785
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2786
     *      RelationalExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2787
     *      EqualityExpression == RelationalExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2788
     *      EqualityExpression != RelationalExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2789
     *      EqualityExpression === RelationalExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2790
     *      EqualityExpression !== RelationalExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2791
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2792
     * See 11.9
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2793
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2794
     * BitwiseANDExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2795
     *      EqualityExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2796
     *      BitwiseANDExpression & EqualityExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2797
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2798
     * BitwiseXORExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2799
     *      BitwiseANDExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2800
     *      BitwiseXORExpression ^ BitwiseANDExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2801
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2802
     * BitwiseORExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2803
     *      BitwiseXORExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2804
     *      BitwiseORExpression | BitwiseXORExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2805
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2806
     * See 11.10
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2807
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2808
     * LogicalANDExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2809
     *      BitwiseORExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2810
     *      LogicalANDExpression && BitwiseORExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2811
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2812
     * LogicalORExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2813
     *      LogicalANDExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2814
     *      LogicalORExpression || LogicalANDExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2815
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2816
     * See 11.11
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2817
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2818
     * ConditionalExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2819
     *      LogicalORExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2820
     *      LogicalORExpression ? AssignmentExpression : AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2821
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2822
     * See 11.12
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2823
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2824
     * AssignmentExpression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2825
     *      ConditionalExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2826
     *      LeftHandSideExpression AssignmentOperator AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2827
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2828
     * AssignmentOperator :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2829
     *      = *= /= %= += -= <<= >>= >>>= &= ^= |=
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2830
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2831
     * See 11.13
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2832
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2833
     * Expression :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2834
     *      AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2835
     *      Expression , AssignmentExpression
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2836
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2837
     * See 11.14
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2838
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2839
     * Parse expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2840
     * @return Expression node.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2841
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2842
    private Node expression() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2843
        // TODO - Destructuring array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2844
        // Include commas in expression parsing.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2845
        return expression(unaryExpression(), COMMARIGHT.getPrecedence(), false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2846
    }
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2847
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2848
    private Node expression(final Node exprLhs, final int minPrecedence, final boolean noIn) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2849
        // Get the precedence of the next operator.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2850
        int precedence = type.getPrecedence();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2851
        Node lhs = exprLhs;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2852
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2853
        // While greater precedence.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2854
        while (type.isOperator(noIn) && precedence >= minPrecedence) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2855
            // Capture the operator token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2856
            final long op = token;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2857
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2858
            if (type == TERNARY) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2859
                // Skip operator.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2860
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2861
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2862
                // Pass expression. Middle expression of a conditional expression can be a "in"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2863
                // expression - even in the contexts where "in" is not permitted.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2864
                final Node rhs = expression(unaryExpression(), ASSIGN.getPrecedence(), false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2865
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2866
                expect(COLON);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2867
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2868
                // Fail expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2869
                final Node third = expression(unaryExpression(), ASSIGN.getPrecedence(), noIn);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2870
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2871
                // Build up node.
17523
cb4a7c901e0d 8013913: Removed Source field from all nodes except FunctionNode in order to save footprint
lagergren
parents: 17518
diff changeset
  2872
                lhs = new TernaryNode(op, lhs, rhs, third);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2873
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2874
                // Skip operator.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2875
                next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2876
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2877
                 // Get the next primary expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2878
                Node rhs = unaryExpression();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2879
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2880
                // Get precedence of next operator.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2881
                int nextPrecedence = type.getPrecedence();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2882
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2883
                // Subtask greater precedence.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2884
                while (type.isOperator(noIn) &&
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2885
                       (nextPrecedence > precedence ||
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2886
                       nextPrecedence == precedence && !type.isLeftAssociative())) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2887
                    rhs = expression(rhs, nextPrecedence, noIn);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2888
                    nextPrecedence = type.getPrecedence();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2889
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2890
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2891
                lhs = verifyAssignment(op, lhs, rhs);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2892
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2893
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2894
            precedence = type.getPrecedence();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2895
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2896
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2897
        return lhs;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2898
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2899
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2900
    private Node assignmentExpression(final boolean noIn) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2901
        // TODO - Handle decompose.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2902
        // Exclude commas in expression parsing.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2903
        return expression(unaryExpression(), ASSIGN.getPrecedence(), noIn);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2904
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2905
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2906
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2907
     * Parse an end of line.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2908
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2909
    private void endOfLine() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2910
        switch (type) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2911
        case SEMICOLON:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2912
        case EOL:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2913
            next();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2914
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2915
        case RPAREN:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2916
        case RBRACKET:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2917
        case RBRACE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2918
        case EOF:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2919
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2920
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2921
            if (last != EOL) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2922
                expect(SEMICOLON);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2923
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2924
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2925
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2926
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2927
16252
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
  2928
    @Override
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
  2929
    public String toString() {
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
  2930
        return "[JavaScript Parsing]";
3bfe9b68a0fa 8008648: Lazy JIT scope and callee semantics bugfixes. Broke out wallclock timer.
lagergren
parents: 16245
diff changeset
  2931
    }
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2932
17255
aa61d23e36e5 8013419: Streamline handling of with and eval
attila
parents: 17249
diff changeset
  2933
    private static void markEval(final LexicalContext lc) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2934
        final Iterator<FunctionNode> iter = lc.getFunctions();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2935
        boolean flaggedCurrentFn = false;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2936
        while (iter.hasNext()) {
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2937
            final FunctionNode fn = iter.next();
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2938
            if (!flaggedCurrentFn) {
17255
aa61d23e36e5 8013419: Streamline handling of with and eval
attila
parents: 17249
diff changeset
  2939
                lc.setFlag(fn, FunctionNode.HAS_EVAL);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2940
                flaggedCurrentFn = true;
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2941
            } else {
17255
aa61d23e36e5 8013419: Streamline handling of with and eval
attila
parents: 17249
diff changeset
  2942
                lc.setFlag(fn, FunctionNode.HAS_NESTED_EVAL);
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2943
            }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2944
            lc.setFlag(lc.getFunctionBody(fn), Block.NEEDS_SCOPE);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2945
        }
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2946
    }
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2947
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2948
    private void prependStatement(final Statement statement) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2949
        lc.prependStatement(statement);
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2950
    }
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2951
17524
703643aeb0d6 8013914: Removed explicit LineNumberNodes that were too brittle when code moves around, and also introduced unnecessary footprint. Introduced the Statement node and fixed dead code elimination issues that were discovered by the absense of labels for LineNumberNodes.
lagergren
parents: 17523
diff changeset
  2952
    private void appendStatement(final Statement statement) {
17233
72ccf78a8216 8010701: Immutable nodes - final iteration
lagergren
parents: 16530
diff changeset
  2953
        lc.appendStatement(statement);
16530
201d682e75f4 8010652: Eliminate non-child references in Block/FunctionNode, and make few node types immutable
attila
parents: 16525
diff changeset
  2954
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2955
}