diff --git a/mozilla/js/js2/parser.cpp b/mozilla/js/js2/parser.cpp index 7c14e343a7d..e9983d9755f 100644 --- a/mozilla/js/js2/parser.cpp +++ b/mozilla/js/js2/parser.cpp @@ -2815,9 +2815,11 @@ void JS::Parser::parseFunctionSignature(FunctionDefinition &fd) NodeQueue parameters; VariableBinding *optParameters = 0; + VariableBinding *namedParameters = 0; VariableBinding *restParameter = 0; #ifdef NEW_PARSER fd.optParameters = optParameters; + fd.namedParameters = namedParameters; fd.restParameter = restParameter; #endif if (!lexer.eat(true, Token::closeParenthesis)) { @@ -3583,7 +3585,6 @@ JS::VariableBinding *JS::Parser::parseAllParameters(FunctionDefinition &fd,NodeQ $$ = parseAllParameters(fd,params); } else if( lookahead(Token::assignment) ) { $1 = parseOptionalParameterPrime($1); - lexer.redesignate(true); // Safe: neither ',' nor '}' starts with a slash. if (!fd.optParameters) { fd.optParameters = $1; } @@ -3664,6 +3665,12 @@ JS::VariableBinding *JS::Parser::parseNamedRestParameters(FunctionDefinition &fd NodeQueue aliases; VariableBinding *$1; $1 = parseNamedParameter(aliases); + // The following marks the position in the list that named parameters + // may occur. It is not required that this particular parameter has + // aliases associated with it. + if (!fd.namedParameters) { + fd.namedParameters = $1; + } if (!fd.optParameters && $1->initializer) { fd.optParameters = $1; } @@ -3694,6 +3701,12 @@ JS::VariableBinding *JS::Parser::parseNamedParameters(FunctionDefinition &fd,Nod VariableBinding *$$,*$1; NodeQueue aliases; // List of aliases. $1 = parseNamedParameter(aliases); + // The following marks the position in the list that named parameters + // may occur. It is not required that this particular parameter has + // aliases associated with it. + if (!fd.namedParameters) { + fd.namedParameters = $1; + } if (!fd.optParameters && $1->initializer) { fd.optParameters = $1; } @@ -3779,7 +3792,7 @@ JS::VariableBinding *JS::Parser::parseOptionalParameterPrime(VariableBinding *$1 match(Token::assignment); $1->initializer = parseAssignmentExpression(); - lexer.redesignate(true); // Safe: neither ',' nor '}' starts with a slash. + lexer.redesignate(true); // Safe: looking for non-slash puncutation. $$ = $1; return $$; @@ -3805,7 +3818,6 @@ JS::VariableBinding *JS::Parser::parseNamedParameter(NodeQueue & $$->aliases = aliases.first; if( lookahead(Token::assignment) ) { $$ = parseOptionalParameterPrime($$); - //lexer.redesignate(true); // Safe: neither ',' nor '}' starts with a slash. } } return $$; diff --git a/mozilla/js/js2/parser.h b/mozilla/js/js2/parser.h index d1b48954fa7..1d4571efb52 100644 --- a/mozilla/js/js2/parser.h +++ b/mozilla/js/js2/parser.h @@ -449,6 +449,7 @@ namespace JavaScript { struct FunctionDefinition: FunctionName { VariableBinding *parameters; // Linked list of all parameters, including optional and rest parameters, if any VariableBinding *optParameters; // Pointer to first non-required parameter inside parameters list; nil if none + VariableBinding *namedParameters; // The first parameter after the named parameter marker. May or may not have aliases. VariableBinding *restParameter; // Pointer to rest parameter inside parameters list; nil if none ExprNode *resultType; // Result type expression or nil if not provided BlockStmtNode *body; // Body; nil if none diff --git a/mozilla/js2/src/parser.cpp b/mozilla/js2/src/parser.cpp index 7c14e343a7d..e9983d9755f 100644 --- a/mozilla/js2/src/parser.cpp +++ b/mozilla/js2/src/parser.cpp @@ -2815,9 +2815,11 @@ void JS::Parser::parseFunctionSignature(FunctionDefinition &fd) NodeQueue parameters; VariableBinding *optParameters = 0; + VariableBinding *namedParameters = 0; VariableBinding *restParameter = 0; #ifdef NEW_PARSER fd.optParameters = optParameters; + fd.namedParameters = namedParameters; fd.restParameter = restParameter; #endif if (!lexer.eat(true, Token::closeParenthesis)) { @@ -3583,7 +3585,6 @@ JS::VariableBinding *JS::Parser::parseAllParameters(FunctionDefinition &fd,NodeQ $$ = parseAllParameters(fd,params); } else if( lookahead(Token::assignment) ) { $1 = parseOptionalParameterPrime($1); - lexer.redesignate(true); // Safe: neither ',' nor '}' starts with a slash. if (!fd.optParameters) { fd.optParameters = $1; } @@ -3664,6 +3665,12 @@ JS::VariableBinding *JS::Parser::parseNamedRestParameters(FunctionDefinition &fd NodeQueue aliases; VariableBinding *$1; $1 = parseNamedParameter(aliases); + // The following marks the position in the list that named parameters + // may occur. It is not required that this particular parameter has + // aliases associated with it. + if (!fd.namedParameters) { + fd.namedParameters = $1; + } if (!fd.optParameters && $1->initializer) { fd.optParameters = $1; } @@ -3694,6 +3701,12 @@ JS::VariableBinding *JS::Parser::parseNamedParameters(FunctionDefinition &fd,Nod VariableBinding *$$,*$1; NodeQueue aliases; // List of aliases. $1 = parseNamedParameter(aliases); + // The following marks the position in the list that named parameters + // may occur. It is not required that this particular parameter has + // aliases associated with it. + if (!fd.namedParameters) { + fd.namedParameters = $1; + } if (!fd.optParameters && $1->initializer) { fd.optParameters = $1; } @@ -3779,7 +3792,7 @@ JS::VariableBinding *JS::Parser::parseOptionalParameterPrime(VariableBinding *$1 match(Token::assignment); $1->initializer = parseAssignmentExpression(); - lexer.redesignate(true); // Safe: neither ',' nor '}' starts with a slash. + lexer.redesignate(true); // Safe: looking for non-slash puncutation. $$ = $1; return $$; @@ -3805,7 +3818,6 @@ JS::VariableBinding *JS::Parser::parseNamedParameter(NodeQueue & $$->aliases = aliases.first; if( lookahead(Token::assignment) ) { $$ = parseOptionalParameterPrime($$); - //lexer.redesignate(true); // Safe: neither ',' nor '}' starts with a slash. } } return $$; diff --git a/mozilla/js2/src/parser.h b/mozilla/js2/src/parser.h index d1b48954fa7..1d4571efb52 100644 --- a/mozilla/js2/src/parser.h +++ b/mozilla/js2/src/parser.h @@ -449,6 +449,7 @@ namespace JavaScript { struct FunctionDefinition: FunctionName { VariableBinding *parameters; // Linked list of all parameters, including optional and rest parameters, if any VariableBinding *optParameters; // Pointer to first non-required parameter inside parameters list; nil if none + VariableBinding *namedParameters; // The first parameter after the named parameter marker. May or may not have aliases. VariableBinding *restParameter; // Pointer to rest parameter inside parameters list; nil if none ExprNode *resultType; // Result type expression or nil if not provided BlockStmtNode *body; // Body; nil if none