| 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; | 
| } | 
|  | 
|  |