Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index 79c895b74f58b28d2cab7a84d72fb91d4d7e8189..4a5ae9b60c298b245bb27a64d3376f49abe76e38 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -5322,106 +5322,108 @@ BUILTIN(HandleApiCallAsConstructor) { |
return HandleApiCallAsFunctionOrConstructor(isolate, true, args); |
} |
+namespace { |
-static void Generate_LoadIC_Miss(MacroAssembler* masm) { |
- LoadIC::GenerateMiss(masm); |
-} |
+void Generate_LoadIC_Miss(CodeStubAssembler* assembler) { |
+ typedef compiler::Node Node; |
+ Node* receiver = assembler->Parameter(0); |
+ Node* name = assembler->Parameter(1); |
+ Node* slot = assembler->Parameter(2); |
+ Node* vector = assembler->Parameter(3); |
+ Node* context = assembler->Parameter(4); |
-static void Generate_LoadIC_Normal(MacroAssembler* masm) { |
- LoadIC::GenerateNormal(masm); |
+ assembler->TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name, |
+ slot, vector); |
} |
+void Generate_LoadIC_Normal(MacroAssembler* masm) { |
+ LoadIC::GenerateNormal(masm); |
+} |
-static void Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) { |
+void Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) { |
NamedLoadHandlerCompiler::GenerateLoadViaGetterForDeopt(masm); |
} |
+void Generate_LoadIC_Slow(CodeStubAssembler* assembler) { |
+ typedef compiler::Node Node; |
-static void Generate_LoadIC_Slow(MacroAssembler* masm) { |
- LoadIC::GenerateRuntimeGetProperty(masm); |
-} |
+ Node* receiver = assembler->Parameter(0); |
+ Node* name = assembler->Parameter(1); |
+ // Node* slot = assembler->Parameter(2); |
+ // Node* vector = assembler->Parameter(3); |
+ Node* context = assembler->Parameter(4); |
+ assembler->TailCallRuntime(Runtime::kGetProperty, context, receiver, name); |
+} |
-static void Generate_KeyedLoadIC_Slow(MacroAssembler* masm) { |
+void Generate_KeyedLoadIC_Slow(MacroAssembler* masm) { |
KeyedLoadIC::GenerateRuntimeGetProperty(masm); |
} |
- |
-static void Generate_KeyedLoadIC_Miss(MacroAssembler* masm) { |
+void Generate_KeyedLoadIC_Miss(MacroAssembler* masm) { |
KeyedLoadIC::GenerateMiss(masm); |
} |
- |
-static void Generate_KeyedLoadIC_Megamorphic(MacroAssembler* masm) { |
+void Generate_KeyedLoadIC_Megamorphic(MacroAssembler* masm) { |
KeyedLoadIC::GenerateMegamorphic(masm); |
} |
- |
-static void Generate_StoreIC_Miss(MacroAssembler* masm) { |
+void Generate_StoreIC_Miss(MacroAssembler* masm) { |
StoreIC::GenerateMiss(masm); |
} |
- |
-static void Generate_StoreIC_Normal(MacroAssembler* masm) { |
+void Generate_StoreIC_Normal(MacroAssembler* masm) { |
StoreIC::GenerateNormal(masm); |
} |
- |
-static void Generate_StoreIC_Slow(MacroAssembler* masm) { |
+void Generate_StoreIC_Slow(MacroAssembler* masm) { |
NamedStoreHandlerCompiler::GenerateSlow(masm); |
} |
- |
-static void Generate_KeyedStoreIC_Slow(MacroAssembler* masm) { |
+void Generate_KeyedStoreIC_Slow(MacroAssembler* masm) { |
ElementHandlerCompiler::GenerateStoreSlow(masm); |
} |
- |
-static void Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { |
+void Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { |
NamedStoreHandlerCompiler::GenerateStoreViaSetterForDeopt(masm); |
} |
-static void Generate_StoreIC_Megamorphic(MacroAssembler* masm) { |
+void Generate_StoreIC_Megamorphic(MacroAssembler* masm) { |
StoreIC::GenerateMegamorphic(masm); |
} |
-static void Generate_StoreIC_Megamorphic_Strict(MacroAssembler* masm) { |
+void Generate_StoreIC_Megamorphic_Strict(MacroAssembler* masm) { |
StoreIC::GenerateMegamorphic(masm); |
} |
- |
-static void Generate_KeyedStoreIC_Megamorphic(MacroAssembler* masm) { |
+void Generate_KeyedStoreIC_Megamorphic(MacroAssembler* masm) { |
KeyedStoreIC::GenerateMegamorphic(masm, SLOPPY); |
} |
- |
-static void Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) { |
+void Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) { |
KeyedStoreIC::GenerateMegamorphic(masm, STRICT); |
} |
- |
-static void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) { |
+void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) { |
KeyedStoreIC::GenerateMiss(masm); |
} |
- |
-static void Generate_Return_DebugBreak(MacroAssembler* masm) { |
+void Generate_Return_DebugBreak(MacroAssembler* masm) { |
DebugCodegen::GenerateDebugBreakStub(masm, |
DebugCodegen::SAVE_RESULT_REGISTER); |
} |
- |
-static void Generate_Slot_DebugBreak(MacroAssembler* masm) { |
+void Generate_Slot_DebugBreak(MacroAssembler* masm) { |
DebugCodegen::GenerateDebugBreakStub(masm, |
DebugCodegen::IGNORE_RESULT_REGISTER); |
} |
- |
-static void Generate_FrameDropper_LiveEdit(MacroAssembler* masm) { |
+void Generate_FrameDropper_LiveEdit(MacroAssembler* masm) { |
DebugCodegen::GenerateFrameDropperLiveEdit(masm); |
} |
+} // namespace |
Builtins::Builtins() : initialized_(false) { |
memset(builtins_, 0, sizeof(builtins_[0]) * builtin_count); |
@@ -5506,8 +5508,9 @@ Handle<Code> MacroAssemblerBuilder(Isolate* isolate, |
return isolate->factory()->NewCode(desc, flags, masm.CodeObject()); |
} |
-Handle<Code> CodeStubAssemblerBuilder(Isolate* isolate, |
- BuiltinDesc const* builtin_desc) { |
+// Builder for builtins implemented in TurboFan with JS linkage. |
+Handle<Code> CodeStubAssemblerBuilderJS(Isolate* isolate, |
+ BuiltinDesc const* builtin_desc) { |
Zone zone(isolate->allocator()); |
CodeStubAssembler assembler(isolate, &zone, builtin_desc->argc, |
builtin_desc->flags, builtin_desc->s_name); |
@@ -5518,6 +5521,25 @@ Handle<Code> CodeStubAssemblerBuilder(Isolate* isolate, |
return assembler.GenerateCode(); |
} |
+// Builder for builtins implemented in TurboFan with CallStub linkage. |
+Handle<Code> CodeStubAssemblerBuilderCS(Isolate* isolate, |
+ BuiltinDesc const* builtin_desc) { |
+ Zone zone(isolate->allocator()); |
+ // The interface descriptor with given key must be initialized at this point |
+ // and this construction just queries the details from the descriptors table. |
+ CallInterfaceDescriptor descriptor( |
+ isolate, static_cast<CallDescriptors::Key>(builtin_desc->argc)); |
+ // Ensure descriptor is already initialized. |
+ DCHECK_NOT_NULL(descriptor.GetFunctionType()); |
+ CodeStubAssembler assembler(isolate, &zone, descriptor, builtin_desc->flags, |
+ builtin_desc->s_name); |
+ // Generate the code/adaptor. |
+ typedef void (*Generator)(CodeStubAssembler*); |
+ Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator); |
+ g(&assembler); |
+ return assembler.GenerateCode(); |
+} |
+ |
} // namespace |
// Define array of pointers to generators and C builtin functions. |
@@ -5558,7 +5580,7 @@ void Builtins::InitBuiltinFunctionTable() { |
++functions; |
#define DEF_FUNCTION_PTR_T(aname, aargc) \ |
- functions->builder = &CodeStubAssemblerBuilder; \ |
+ functions->builder = &CodeStubAssemblerBuilderJS; \ |
functions->generator = FUNCTION_ADDR(Generate_##aname); \ |
functions->c_code = NULL; \ |
functions->s_name = #aname; \ |
@@ -5568,6 +5590,17 @@ void Builtins::InitBuiltinFunctionTable() { |
functions->argc = aargc; \ |
++functions; |
+#define DEF_FUNCTION_PTR_S(aname, kind, extra, interface_descriptor) \ |
+ functions->builder = &CodeStubAssemblerBuilderCS; \ |
+ functions->generator = FUNCTION_ADDR(Generate_##aname); \ |
+ functions->c_code = NULL; \ |
+ functions->s_name = #aname; \ |
+ functions->name = k##aname; \ |
+ functions->flags = Code::ComputeFlags(Code::kind, extra); \ |
+ functions->extra_args = BuiltinExtraArguments::kNone; \ |
+ functions->argc = CallDescriptors::interface_descriptor; \ |
+ ++functions; |
+ |
#define DEF_FUNCTION_PTR_H(aname, kind) \ |
functions->builder = &MacroAssemblerBuilder; \ |
functions->generator = FUNCTION_ADDR(Generate_##aname); \ |
@@ -5582,13 +5615,15 @@ void Builtins::InitBuiltinFunctionTable() { |
BUILTIN_LIST_C(DEF_FUNCTION_PTR_C) |
BUILTIN_LIST_A(DEF_FUNCTION_PTR_A) |
BUILTIN_LIST_T(DEF_FUNCTION_PTR_T) |
+ BUILTIN_LIST_S(DEF_FUNCTION_PTR_S) |
BUILTIN_LIST_H(DEF_FUNCTION_PTR_H) |
BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A) |
#undef DEF_FUNCTION_PTR_C |
#undef DEF_FUNCTION_PTR_A |
-#undef DEF_FUNCTION_PTR_H |
#undef DEF_FUNCTION_PTR_T |
+#undef DEF_FUNCTION_PTR_S |
+#undef DEF_FUNCTION_PTR_H |
} |
@@ -5598,6 +5633,11 @@ void Builtins::SetUp(Isolate* isolate, bool create_heap_objects) { |
// Create a scope for the handles in the builtins. |
HandleScope scope(isolate); |
+#define INITIALIZE_CALL_DESCRIPTOR(name, kind, extra, interface_descriptor) \ |
+ { interface_descriptor##Descriptor descriptor(isolate); } |
+ BUILTIN_LIST_S(INITIALIZE_CALL_DESCRIPTOR) |
+#undef INITIALIZE_CALL_DESCRIPTOR |
+ |
const BuiltinDesc* functions = builtin_function_table.functions(); |
// Traverse the list of builtins and generate an adaptor in a |
@@ -5918,6 +5958,11 @@ Handle<Code> Builtins::name() { \ |
Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \ |
return Handle<Code>(code_address); \ |
} |
+#define DEFINE_BUILTIN_ACCESSOR_S(name, kind, extra, interface_descriptor) \ |
+ Handle<Code> Builtins::name() { \ |
+ Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \ |
+ return Handle<Code>(code_address); \ |
+ } |
#define DEFINE_BUILTIN_ACCESSOR_H(name, kind) \ |
Handle<Code> Builtins::name() { \ |
Code** code_address = \ |
@@ -5927,11 +5972,13 @@ Handle<Code> Builtins::name() { \ |
BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) |
BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) |
BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) |
+BUILTIN_LIST_S(DEFINE_BUILTIN_ACCESSOR_S) |
BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
#undef DEFINE_BUILTIN_ACCESSOR_C |
#undef DEFINE_BUILTIN_ACCESSOR_A |
#undef DEFINE_BUILTIN_ACCESSOR_T |
+#undef DEFINE_BUILTIN_ACCESSOR_S |
#undef DEFINE_BUILTIN_ACCESSOR_H |
} // namespace internal |