Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index ed6ff493133e54de3a27a2a267a5f2198b0e69e7..dc5c7d6b5e4cb4bb7c96919282c9f10b3c25985f 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -731,10 +731,14 @@ FunctionLiteral* Parser::ParseLazy(CompilationInfo* info, |
FunctionLiteralType type = |
shared_info->is_expression() ? EXPRESSION : DECLARATION; |
+ Handle<String> function_name = |
+ shared_info->is_anonymous() ? Handle<String>::null() : name; |
bool ok = true; |
- result = ParseFunctionLiteral(name, |
- false, // Strict mode name already checked. |
- RelocInfo::kNoPosition, type, &ok); |
+ result = ParseFunctionLiteral(function_name, |
+ false, // Strict mode name already checked. |
+ RelocInfo::kNoPosition, |
+ type, |
+ &ok); |
// Make sure the results agree. |
ASSERT(ok == (result != NULL)); |
} |
@@ -2842,8 +2846,11 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, |
CHECK_OK); |
} |
- result = ParseFunctionLiteral(name, is_strict_reserved_name, |
- function_token_position, NESTED, CHECK_OK); |
+ result = ParseFunctionLiteral(name, |
+ is_strict_reserved_name, |
+ function_token_position, |
+ EXPRESSION, |
+ CHECK_OK); |
} else { |
result = ParsePrimaryExpression(CHECK_OK); |
} |
@@ -3412,7 +3419,7 @@ ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter, |
ParseFunctionLiteral(name, |
false, // reserved words are allowed here |
RelocInfo::kNoPosition, |
- DECLARATION, |
+ EXPRESSION, |
CHECK_OK); |
// Allow any number of parameters for compatiabilty with JSC. |
// Specification only allows zero parameters for get and one for set. |
@@ -3619,25 +3626,22 @@ ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { |
} |
-FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
+FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name, |
bool name_is_strict_reserved, |
int function_token_position, |
FunctionLiteralType type, |
bool* ok) { |
// Function :: |
// '(' FormalParameterList? ')' '{' FunctionBody '}' |
- bool is_named = !var_name.is_null(); |
- // 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; |
+ // Anonymous functions were passed either the empty symbol or a null |
+ // handle as the function name. Remember if we were passed a non-empty |
+ // handle to decide whether to invoke function name inference. |
+ bool should_infer_name = function_name.is_null(); |
+ |
+ // We want a non-null handle as the function name. |
+ if (should_infer_name) { |
+ function_name = isolate()->factory()->empty_symbol(); |
} |
int num_parameters = 0; |
@@ -3655,7 +3659,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
bool has_duplicate_parameters = false; |
// Parse function body. |
{ LexicalScope lexical_scope(this, scope, isolate()); |
- top_scope_->SetScopeName(name); |
+ top_scope_->SetScopeName(function_name); |
// FormalParameterList :: |
// '(' (Identifier)*[','] ')' |
@@ -3705,7 +3709,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_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 (!function_name.is_null() && function_name->length() > 0) { |
+ if (type == EXPRESSION && function_name->length() > 0) { |
Variable* fvar = top_scope_->DeclareFunctionVar(function_name); |
VariableProxy* fproxy = |
top_scope_->NewUnresolved(function_name, inside_with()); |
@@ -3739,7 +3743,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_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(name, CHECK_OK); |
+ ReportInvalidPreparseData(function_name, CHECK_OK); |
} |
isolate()->counters()->total_preparse_skipped()->Increment( |
end_pos - function_block_pos); |
@@ -3769,7 +3773,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
// Validate strict mode. |
if (top_scope_->is_strict_mode()) { |
- if (IsEvalOrArguments(name)) { |
+ if (IsEvalOrArguments(function_name)) { |
int position = function_token_position != RelocInfo::kNoPosition |
? function_token_position |
: (start_pos > 0 ? start_pos - 1 : start_pos); |
@@ -3813,7 +3817,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
FunctionLiteral* function_literal = |
new(zone()) FunctionLiteral(isolate(), |
- name, |
+ function_name, |
scope, |
body, |
materialized_literal_count, |
@@ -3823,11 +3827,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
num_parameters, |
start_pos, |
end_pos, |
- (function_name->length() > 0), |
+ type == EXPRESSION, |
has_duplicate_parameters); |
function_literal->set_function_token_position(function_token_position); |
- if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal); |
+ if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); |
return function_literal; |
} |