diff --git a/src/ast.cc b/src/ast.cc index 5f085d3588..b98d2a654e 100644 --- a/src/ast.cc +++ b/src/ast.cc @@ -1143,7 +1143,7 @@ DONT_OPTIMIZE_NODE(WithStatement) DONT_OPTIMIZE_NODE(TryCatchStatement) DONT_OPTIMIZE_NODE(TryFinallyStatement) DONT_OPTIMIZE_NODE(DebuggerStatement) -DONT_OPTIMIZE_NODE(SharedFunctionInfoLiteral) +DONT_OPTIMIZE_NODE(NativeFunctionLiteral) DONT_SELFOPTIMIZE_NODE(DoWhileStatement) DONT_SELFOPTIMIZE_NODE(WhileStatement) diff --git a/src/ast.h b/src/ast.h index 71a51aba15..5c98064899 100644 --- a/src/ast.h +++ b/src/ast.h @@ -97,7 +97,7 @@ namespace internal { #define EXPRESSION_NODE_LIST(V) \ V(FunctionLiteral) \ - V(SharedFunctionInfoLiteral) \ + V(NativeFunctionLiteral) \ V(Conditional) \ V(VariableProxy) \ V(Literal) \ @@ -2380,23 +2380,18 @@ class FunctionLiteral V8_FINAL : public Expression { }; -class SharedFunctionInfoLiteral V8_FINAL : public Expression { +class NativeFunctionLiteral V8_FINAL : public Expression { public: - DECLARE_NODE_TYPE(SharedFunctionInfoLiteral) + DECLARE_NODE_TYPE(NativeFunctionLiteral) - Handle shared_function_info() const { - return shared_function_info_; - } + Handle name() const { return name_; } protected: - SharedFunctionInfoLiteral( - Isolate* isolate, - Handle shared_function_info) - : Expression(isolate), - shared_function_info_(shared_function_info) { } + NativeFunctionLiteral(Isolate* isolate, Handle name) + : Expression(isolate), name_(name) { } private: - Handle shared_function_info_; + Handle name_; }; @@ -3237,11 +3232,10 @@ class AstNodeFactory V8_FINAL BASE_EMBEDDED { return lit; } - SharedFunctionInfoLiteral* NewSharedFunctionInfoLiteral( - Handle shared_function_info) { - SharedFunctionInfoLiteral* lit = - new(zone_) SharedFunctionInfoLiteral(isolate_, shared_function_info); - VISIT_AND_RETURN(SharedFunctionInfoLiteral, lit) + NativeFunctionLiteral* NewNativeFunctionLiteral(Handle name) { + NativeFunctionLiteral* lit = + new(zone_) NativeFunctionLiteral(isolate_, name); + VISIT_AND_RETURN(NativeFunctionLiteral, lit) } ThisFunction* NewThisFunction() { diff --git a/src/full-codegen.cc b/src/full-codegen.cc index c4ae1d7fc0..308805a965 100644 --- a/src/full-codegen.cc +++ b/src/full-codegen.cc @@ -197,8 +197,8 @@ void BreakableStatementChecker::VisitFunctionLiteral(FunctionLiteral* expr) { } -void BreakableStatementChecker::VisitSharedFunctionInfoLiteral( - SharedFunctionInfoLiteral* expr) { +void BreakableStatementChecker::VisitNativeFunctionLiteral( + NativeFunctionLiteral* expr) { } @@ -1567,10 +1567,33 @@ void FullCodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { } -void FullCodeGenerator::VisitSharedFunctionInfoLiteral( - SharedFunctionInfoLiteral* expr) { - Comment cmnt(masm_, "[ SharedFunctionInfoLiteral"); - EmitNewClosure(expr->shared_function_info(), false); +void FullCodeGenerator::VisitNativeFunctionLiteral( + NativeFunctionLiteral* expr) { + Comment cmnt(masm_, "[ NativeFunctionLiteral"); + + // Compute the function template for the native function. + Handle name = expr->name(); + v8::Handle fun_template = + info_->extension()->GetNativeFunction(v8::Utils::ToLocal(name)); + ASSERT(!fun_template.IsEmpty()); + + // Instantiate the function and create a shared function info from it. + Handle fun = Utils::OpenHandle(*fun_template->GetFunction()); + const int literals = fun->NumberOfLiterals(); + Handle code = Handle(fun->shared()->code()); + Handle construct_stub = Handle(fun->shared()->construct_stub()); + bool is_generator = false; + Handle shared = + isolate()->factory()->NewSharedFunctionInfo(name, literals, is_generator, + code, Handle(fun->shared()->scope_info())); + shared->set_construct_stub(*construct_stub); + + // Copy the function data to the shared function info. + shared->set_function_data(fun->shared()->function_data()); + int parameters = fun->shared()->formal_parameter_count(); + shared->set_formal_parameter_count(parameters); + + EmitNewClosure(shared, false); } diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 8681026391..7fc2764b56 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -3983,12 +3983,12 @@ void HOptimizedGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { } -void HOptimizedGraphBuilder::VisitSharedFunctionInfoLiteral( - SharedFunctionInfoLiteral* expr) { +void HOptimizedGraphBuilder::VisitNativeFunctionLiteral( + NativeFunctionLiteral* expr) { ASSERT(!HasStackOverflow()); ASSERT(current_block() != NULL); ASSERT(current_block()->HasPredecessor()); - return Bailout(kSharedFunctionInfoLiteral); + return Bailout(kNativeFunctionLiteral); } diff --git a/src/objects.h b/src/objects.h index 8a48116f99..128948afa0 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1206,6 +1206,7 @@ class MaybeObject BASE_EMBEDDED { V(kModuleStatement, "Module statement") \ V(kModuleVariable, "Module variable") \ V(kModuleUrl, "Module url") \ + V(kNativeFunctionLiteral, "Native function literal") \ V(kNoCasesLeft, "no cases left") \ V(kNoEmptyArraysHereInEmitFastAsciiArrayJoin, \ "No empty arrays here in EmitFastAsciiArrayJoin") \ @@ -1249,7 +1250,6 @@ class MaybeObject BASE_EMBEDDED { V(kRegisterDidNotMatchExpectedRoot, "Register did not match expected root") \ V(kRegisterWasClobbered, "register was clobbered") \ V(kScopedBlock, "ScopedBlock") \ - V(kSharedFunctionInfoLiteral, "Shared function info literal") \ V(kSmiAdditionOverflow, "Smi addition overflow") \ V(kSmiSubtractionOverflow, "Smi subtraction overflow") \ V(kStackFrameTypesMustMatch, "stack frame types must match") \ diff --git a/src/parser.cc b/src/parser.cc index 05ae11e429..09d89f951f 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -1667,27 +1667,6 @@ Statement* Parser::ParseNativeDeclaration(bool* ok) { // because of lazy compilation. DeclarationScope(VAR)->ForceEagerCompilation(); - // Compute the function template for the native function. - v8::Handle fun_template = - extension_->GetNativeFunction(v8::Utils::ToLocal(name)); - ASSERT(!fun_template.IsEmpty()); - - // Instantiate the function and create a shared function info from it. - Handle fun = Utils::OpenHandle(*fun_template->GetFunction()); - const int literals = fun->NumberOfLiterals(); - Handle code = Handle(fun->shared()->code()); - Handle construct_stub = Handle(fun->shared()->construct_stub()); - bool is_generator = false; - Handle shared = - isolate()->factory()->NewSharedFunctionInfo(name, literals, is_generator, - code, Handle(fun->shared()->scope_info())); - shared->set_construct_stub(*construct_stub); - - // Copy the function data to the shared function info. - shared->set_function_data(fun->shared()->function_data()); - int parameters = fun->shared()->formal_parameter_count(); - shared->set_formal_parameter_count(parameters); - // TODO(1240846): It's weird that native function declarations are // introduced dynamically when we meet their declarations, whereas // other functions are set up when entering the surrounding scope. @@ -1695,8 +1674,7 @@ Statement* Parser::ParseNativeDeclaration(bool* ok) { Declaration* declaration = factory()->NewVariableDeclaration(proxy, VAR, top_scope_); Declare(declaration, true, CHECK_OK); - SharedFunctionInfoLiteral* lit = - factory()->NewSharedFunctionInfoLiteral(shared); + NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral(name); return factory()->NewExpressionStatement( factory()->NewAssignment( Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); diff --git a/src/prettyprinter.cc b/src/prettyprinter.cc index b1bac4cd4a..14ad707da7 100644 --- a/src/prettyprinter.cc +++ b/src/prettyprinter.cc @@ -297,10 +297,9 @@ void PrettyPrinter::VisitFunctionLiteral(FunctionLiteral* node) { } -void PrettyPrinter::VisitSharedFunctionInfoLiteral( - SharedFunctionInfoLiteral* node) { +void PrettyPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) { Print("("); - PrintLiteral(node->shared_function_info(), true); + PrintLiteral(node->name(), false); Print(")"); } @@ -982,10 +981,9 @@ void AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) { } -void AstPrinter::VisitSharedFunctionInfoLiteral( - SharedFunctionInfoLiteral* node) { - IndentedScope indent(this, "FUNC LITERAL"); - PrintLiteralIndented("SHARED INFO", node->shared_function_info(), true); +void AstPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) { + IndentedScope indent(this, "NATIVE FUNC LITERAL"); + PrintLiteralIndented("NAME", node->name(), false); } diff --git a/src/typing.cc b/src/typing.cc index 34bb64bd7d..3fd1ce5057 100644 --- a/src/typing.cc +++ b/src/typing.cc @@ -305,7 +305,7 @@ void AstTyper::VisitFunctionLiteral(FunctionLiteral* expr) { } -void AstTyper::VisitSharedFunctionInfoLiteral(SharedFunctionInfoLiteral* expr) { +void AstTyper::VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { }