37 import static jdk.nashorn.internal.parser.TokenType.DECPOSTFIX;
38 import static jdk.nashorn.internal.parser.TokenType.DECPREFIX;
39 import static jdk.nashorn.internal.parser.TokenType.ELSE;
40 import static jdk.nashorn.internal.parser.TokenType.EOF;
41 import static jdk.nashorn.internal.parser.TokenType.EOL;
42 import static jdk.nashorn.internal.parser.TokenType.FINALLY;
43 import static jdk.nashorn.internal.parser.TokenType.FUNCTION;
44 import static jdk.nashorn.internal.parser.TokenType.IDENT;
45 import static jdk.nashorn.internal.parser.TokenType.IF;
46 import static jdk.nashorn.internal.parser.TokenType.INCPOSTFIX;
47 import static jdk.nashorn.internal.parser.TokenType.LBRACE;
48 import static jdk.nashorn.internal.parser.TokenType.LET;
49 import static jdk.nashorn.internal.parser.TokenType.LPAREN;
50 import static jdk.nashorn.internal.parser.TokenType.RBRACE;
51 import static jdk.nashorn.internal.parser.TokenType.RBRACKET;
52 import static jdk.nashorn.internal.parser.TokenType.RPAREN;
53 import static jdk.nashorn.internal.parser.TokenType.SEMICOLON;
54 import static jdk.nashorn.internal.parser.TokenType.TERNARY;
55 import static jdk.nashorn.internal.parser.TokenType.WHILE;
56
57 import java.util.ArrayDeque;
58 import java.util.ArrayList;
59 import java.util.Collections;
60 import java.util.Deque;
61 import java.util.HashMap;
62 import java.util.HashSet;
63 import java.util.Iterator;
64 import java.util.List;
65 import java.util.Map;
66 import jdk.internal.dynalink.support.NameCodec;
67 import jdk.nashorn.internal.codegen.CompilerConstants;
68 import jdk.nashorn.internal.codegen.Namespace;
69 import jdk.nashorn.internal.ir.AccessNode;
70 import jdk.nashorn.internal.ir.BaseNode;
71 import jdk.nashorn.internal.ir.BinaryNode;
72 import jdk.nashorn.internal.ir.Block;
73 import jdk.nashorn.internal.ir.BlockLexicalContext;
74 import jdk.nashorn.internal.ir.BlockStatement;
75 import jdk.nashorn.internal.ir.BreakNode;
76 import jdk.nashorn.internal.ir.BreakableNode;
2960 final ParserState parserState = (ParserState)data.getEndParserState();
2961 assert parserState != null;
2962
2963 stream.reset();
2964 lexer = parserState.createLexer(source, lexer, stream, scripting && !env._no_syntax_extensions);
2965 line = parserState.line;
2966 linePosition = parserState.linePosition;
2967 // Doesn't really matter, but it's safe to treat it as if there were a semicolon before
2968 // the RBRACE.
2969 type = SEMICOLON;
2970 k = -1;
2971 next();
2972
2973 return true;
2974 }
2975
2976 /**
2977 * Encapsulates part of the state of the parser, enough to reconstruct the state of both parser and lexer
2978 * for resuming parsing after skipping a function body.
2979 */
2980 private static class ParserState {
2981 private final int position;
2982 private final int line;
2983 private final int linePosition;
2984
2985 ParserState(final int position, final int line, final int linePosition) {
2986 this.position = position;
2987 this.line = line;
2988 this.linePosition = linePosition;
2989 }
2990
2991 Lexer createLexer(final Source source, final Lexer lexer, final TokenStream stream, final boolean scripting) {
2992 final Lexer newLexer = new Lexer(source, position, lexer.limit - position, stream, scripting, true);
2993 newLexer.restoreState(new Lexer.State(position, Integer.MAX_VALUE, line, -1, linePosition, SEMICOLON));
2994 return newLexer;
2995 }
2996 }
2997
2998 private void printAST(final FunctionNode functionNode) {
2999 if (functionNode.getFlag(FunctionNode.IS_PRINT_AST)) {
3000 env.getErr().println(new ASTWriter(functionNode));
3001 }
3002
3003 if (functionNode.getFlag(FunctionNode.IS_PRINT_PARSE)) {
|
37 import static jdk.nashorn.internal.parser.TokenType.DECPOSTFIX;
38 import static jdk.nashorn.internal.parser.TokenType.DECPREFIX;
39 import static jdk.nashorn.internal.parser.TokenType.ELSE;
40 import static jdk.nashorn.internal.parser.TokenType.EOF;
41 import static jdk.nashorn.internal.parser.TokenType.EOL;
42 import static jdk.nashorn.internal.parser.TokenType.FINALLY;
43 import static jdk.nashorn.internal.parser.TokenType.FUNCTION;
44 import static jdk.nashorn.internal.parser.TokenType.IDENT;
45 import static jdk.nashorn.internal.parser.TokenType.IF;
46 import static jdk.nashorn.internal.parser.TokenType.INCPOSTFIX;
47 import static jdk.nashorn.internal.parser.TokenType.LBRACE;
48 import static jdk.nashorn.internal.parser.TokenType.LET;
49 import static jdk.nashorn.internal.parser.TokenType.LPAREN;
50 import static jdk.nashorn.internal.parser.TokenType.RBRACE;
51 import static jdk.nashorn.internal.parser.TokenType.RBRACKET;
52 import static jdk.nashorn.internal.parser.TokenType.RPAREN;
53 import static jdk.nashorn.internal.parser.TokenType.SEMICOLON;
54 import static jdk.nashorn.internal.parser.TokenType.TERNARY;
55 import static jdk.nashorn.internal.parser.TokenType.WHILE;
56
57 import java.io.Serializable;
58 import java.util.ArrayDeque;
59 import java.util.ArrayList;
60 import java.util.Collections;
61 import java.util.Deque;
62 import java.util.HashMap;
63 import java.util.HashSet;
64 import java.util.Iterator;
65 import java.util.List;
66 import java.util.Map;
67 import jdk.internal.dynalink.support.NameCodec;
68 import jdk.nashorn.internal.codegen.CompilerConstants;
69 import jdk.nashorn.internal.codegen.Namespace;
70 import jdk.nashorn.internal.ir.AccessNode;
71 import jdk.nashorn.internal.ir.BaseNode;
72 import jdk.nashorn.internal.ir.BinaryNode;
73 import jdk.nashorn.internal.ir.Block;
74 import jdk.nashorn.internal.ir.BlockLexicalContext;
75 import jdk.nashorn.internal.ir.BlockStatement;
76 import jdk.nashorn.internal.ir.BreakNode;
77 import jdk.nashorn.internal.ir.BreakableNode;
2961 final ParserState parserState = (ParserState)data.getEndParserState();
2962 assert parserState != null;
2963
2964 stream.reset();
2965 lexer = parserState.createLexer(source, lexer, stream, scripting && !env._no_syntax_extensions);
2966 line = parserState.line;
2967 linePosition = parserState.linePosition;
2968 // Doesn't really matter, but it's safe to treat it as if there were a semicolon before
2969 // the RBRACE.
2970 type = SEMICOLON;
2971 k = -1;
2972 next();
2973
2974 return true;
2975 }
2976
2977 /**
2978 * Encapsulates part of the state of the parser, enough to reconstruct the state of both parser and lexer
2979 * for resuming parsing after skipping a function body.
2980 */
2981 private static class ParserState implements Serializable {
2982 private final int position;
2983 private final int line;
2984 private final int linePosition;
2985
2986 private static final long serialVersionUID = -2382565130754093694L;
2987
2988 ParserState(final int position, final int line, final int linePosition) {
2989 this.position = position;
2990 this.line = line;
2991 this.linePosition = linePosition;
2992 }
2993
2994 Lexer createLexer(final Source source, final Lexer lexer, final TokenStream stream, final boolean scripting) {
2995 final Lexer newLexer = new Lexer(source, position, lexer.limit - position, stream, scripting, true);
2996 newLexer.restoreState(new Lexer.State(position, Integer.MAX_VALUE, line, -1, linePosition, SEMICOLON));
2997 return newLexer;
2998 }
2999 }
3000
3001 private void printAST(final FunctionNode functionNode) {
3002 if (functionNode.getFlag(FunctionNode.IS_PRINT_AST)) {
3003 env.getErr().println(new ASTWriter(functionNode));
3004 }
3005
3006 if (functionNode.getFlag(FunctionNode.IS_PRINT_PARSE)) {
|