| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 2c45f1503e55023b683a89a03871bb22776079cc..ed6ff493133e54de3a27a2a267a5f2198b0e69e7 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -2842,11 +2842,8 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack,
|
| name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
|
| CHECK_OK);
|
| }
|
| - result = ParseFunctionLiteral(name,
|
| - is_strict_reserved_name,
|
| - function_token_position,
|
| - EXPRESSION,
|
| - CHECK_OK);
|
| + result = ParseFunctionLiteral(name, is_strict_reserved_name,
|
| + function_token_position, NESTED, CHECK_OK);
|
| } else {
|
| result = ParsePrimaryExpression(CHECK_OK);
|
| }
|
| @@ -3415,7 +3412,7 @@ ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter,
|
| ParseFunctionLiteral(name,
|
| false, // reserved words are allowed here
|
| RelocInfo::kNoPosition,
|
| - EXPRESSION,
|
| + DECLARATION,
|
| CHECK_OK);
|
| // Allow any number of parameters for compatiabilty with JSC.
|
| // Specification only allows zero parameters for get and one for set.
|
| @@ -3622,23 +3619,25 @@ ZoneList<Expression*>* Parser::ParseArguments(bool* ok) {
|
| }
|
|
|
|
|
| -FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| +FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| bool name_is_strict_reserved,
|
| int function_token_position,
|
| FunctionLiteralType type,
|
| bool* ok) {
|
| // Function ::
|
| // '(' FormalParameterList? ')' '{' FunctionBody '}'
|
| - bool has_name = !function_name.is_null();
|
| - // The function's name, empty if the function is anonymous.
|
| - if (!has_name) {
|
| - function_name = isolate()->factory()->empty_symbol();
|
| - }
|
| + bool is_named = !var_name.is_null();
|
|
|
| - // The name of a named function expression, otherwise an empty handle.
|
| - Handle<String> self_name;
|
| - if (type == EXPRESSION && function_name->length() > 0) {
|
| - self_name = function_name;
|
| + // The name associated with this function. If it's a function expression,
|
| + // this is the actual function name, otherwise this is the name of the
|
| + // variable declared and initialized with the function (expression). In
|
| + // that case, we don't have a function name (it's empty).
|
| + Handle<String> name =
|
| + is_named ? var_name : isolate()->factory()->empty_symbol();
|
| + // The function name, if any.
|
| + Handle<String> function_name = isolate()->factory()->empty_symbol();
|
| + if (is_named && (type == EXPRESSION || type == NESTED)) {
|
| + function_name = name;
|
| }
|
|
|
| int num_parameters = 0;
|
| @@ -3656,7 +3655,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| bool has_duplicate_parameters = false;
|
| // Parse function body.
|
| { LexicalScope lexical_scope(this, scope, isolate());
|
| - top_scope_->SetScopeName(function_name);
|
| + top_scope_->SetScopeName(name);
|
|
|
| // FormalParameterList ::
|
| // '(' (Identifier)*[','] ')'
|
| @@ -3706,10 +3705,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| // NOTE: We create a proxy and resolve it here so that in the
|
| // future we can change the AST to only refer to VariableProxies
|
| // instead of Variables and Proxis as is the case now.
|
| - if (!self_name.is_null()) {
|
| - Variable* fvar = top_scope_->DeclareFunctionVar(self_name);
|
| + if (!function_name.is_null() && function_name->length() > 0) {
|
| + Variable* fvar = top_scope_->DeclareFunctionVar(function_name);
|
| VariableProxy* fproxy =
|
| - top_scope_->NewUnresolved(self_name, inside_with());
|
| + top_scope_->NewUnresolved(function_name, inside_with());
|
| fproxy->BindTo(fvar);
|
| body->Add(new(zone()) ExpressionStatement(
|
| new(zone()) Assignment(isolate(),
|
| @@ -3740,7 +3739,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| end_pos = entry.end_pos();
|
| if (end_pos <= function_block_pos) {
|
| // End position greater than end of stream is safe, and hard to check.
|
| - ReportInvalidPreparseData(function_name, CHECK_OK);
|
| + ReportInvalidPreparseData(name, CHECK_OK);
|
| }
|
| isolate()->counters()->total_preparse_skipped()->Increment(
|
| end_pos - function_block_pos);
|
| @@ -3770,7 +3769,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
|
|
| // Validate strict mode.
|
| if (top_scope_->is_strict_mode()) {
|
| - if (IsEvalOrArguments(function_name)) {
|
| + if (IsEvalOrArguments(name)) {
|
| int position = function_token_position != RelocInfo::kNoPosition
|
| ? function_token_position
|
| : (start_pos > 0 ? start_pos - 1 : start_pos);
|
| @@ -3814,7 +3813,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
|
|
| FunctionLiteral* function_literal =
|
| new(zone()) FunctionLiteral(isolate(),
|
| - function_name,
|
| + name,
|
| scope,
|
| body,
|
| materialized_literal_count,
|
| @@ -3824,11 +3823,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name,
|
| num_parameters,
|
| start_pos,
|
| end_pos,
|
| - type == EXPRESSION,
|
| + (function_name->length() > 0),
|
| has_duplicate_parameters);
|
| function_literal->set_function_token_position(function_token_position);
|
|
|
| - if (fni_ != NULL && !has_name) fni_->AddFunction(function_literal);
|
| + if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal);
|
| return function_literal;
|
| }
|
|
|
|
|