--- old/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextFunctionNode.java 2016-04-26 11:37:25.787842446 +0200 +++ new/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextFunctionNode.java 2016-04-26 11:37:25.631842448 +0200 @@ -24,10 +24,12 @@ */ package jdk.nashorn.internal.parser; +import java.util.HashSet; import java.util.List; import jdk.nashorn.internal.codegen.Namespace; import jdk.nashorn.internal.ir.FunctionNode; import jdk.nashorn.internal.ir.IdentNode; +import jdk.nashorn.internal.ir.Module; /** * ParserContextNode that represents a function that is currently being parsed @@ -46,11 +48,11 @@ /** Line number for function declaration */ private final int line; - /** Function node kind, see {@link FunctionNode#Kind} */ + /** Function node kind, see {@link FunctionNode.Kind} */ private final FunctionNode.Kind kind; /** List of parameter identifiers for function */ - private final List parameters; + private List parameters; /** Token for function start */ private final long token; @@ -61,6 +63,14 @@ /** Opaque node for parser end state, see {@link Parser} */ private Object endParserState; + private HashSet parameterBoundNames; + private IdentNode duplicateParameterBinding; + private boolean simpleParameterList = true; + + private Module module; + + private int debugFlags; + /** * @param token The token for the function * @param ident External function name @@ -155,6 +165,10 @@ return parameters; } + void setParameters(List parameters) { + this.parameters = parameters; + } + /** * Set last token * @param token New last token @@ -194,4 +208,70 @@ public int getId() { return isProgram() ? -1 : Token.descPosition(token); } + + /** + * Returns the debug flags for this function. + * + * @return the debug flags + */ + int getDebugFlags() { + return debugFlags; + } + + /** + * Sets a debug flag for this function. + * + * @param debugFlag the debug flag + */ + void setDebugFlag(final int debugFlag) { + debugFlags |= debugFlag; + } + + public boolean isMethod() { + return getFlag(FunctionNode.ES6_IS_METHOD) != 0; + } + + public boolean isClassConstructor() { + return getFlag(FunctionNode.ES6_IS_CLASS_CONSTRUCTOR) != 0; + } + + public boolean isSubclassConstructor() { + return getFlag(FunctionNode.ES6_IS_SUBCLASS_CONSTRUCTOR) != 0; + } + + boolean addParameterBinding(final IdentNode bindingIdentifier) { + if (Parser.isArguments(bindingIdentifier)) { + setFlag(FunctionNode.DEFINES_ARGUMENTS); + } + + if (parameterBoundNames == null) { + parameterBoundNames = new HashSet<>(); + } + if (parameterBoundNames.add(bindingIdentifier.getName())) { + return true; + } else { + duplicateParameterBinding = bindingIdentifier; + return false; + } + } + + public IdentNode getDuplicateParameterBinding() { + return duplicateParameterBinding; + } + + public boolean isSimpleParameterList() { + return simpleParameterList; + } + + public void setSimpleParameterList(final boolean simpleParameterList) { + this.simpleParameterList = simpleParameterList; + } + + public Module getModule() { + return module; + } + + public void setModule(final Module module) { + this.module = module; + } }