Index: src/builtins/builtins.cc |
diff --git a/src/builtins/builtins.cc b/src/builtins/builtins.cc |
index 95cff49e070bc32495acaf0b22d7d5560bbb4408..740842404bf6622f8ff9153eb3127bd655ed5f7b 100644 |
--- a/src/builtins/builtins.cc |
+++ b/src/builtins/builtins.cc |
@@ -3,14 +3,13 @@ |
// found in the LICENSE file. |
#include "src/builtins/builtins.h" |
-#include "src/builtins/builtins-utils.h" |
- |
-#include "src/api-arguments.h" |
-#include "src/api-natives.h" |
-#include "src/code-factory.h" |
-#include "src/ic/handler-compiler.h" |
-#include "src/ic/ic.h" |
-#include "src/vm-state-inl.h" |
+#include "src/code-events.h" |
+#include "src/code-stub-assembler.h" |
+#include "src/ic/ic-state.h" |
+#include "src/interface-descriptors.h" |
+#include "src/isolate.h" |
+#include "src/macro-assembler.h" |
+#include "src/objects.h" |
namespace v8 { |
namespace internal { |
@@ -19,469 +18,6 @@ namespace internal { |
#define FORWARD_DECLARE(Name) \ |
Object* Builtin_##Name(int argc, Object** args, Isolate* isolate); |
BUILTIN_LIST_C(FORWARD_DECLARE) |
-#undef FORWARD_DECLARE |
- |
-// ----------------------------------------------------------------------------- |
-// ES6 section 19.2 Function Objects |
- |
-// ES6 section 19.2.3.6 Function.prototype [ @@hasInstance ] ( V ) |
-void Builtins::Generate_FunctionPrototypeHasInstance( |
- CodeStubAssembler* assembler) { |
- using compiler::Node; |
- |
- Node* f = assembler->Parameter(0); |
- Node* v = assembler->Parameter(1); |
- Node* context = assembler->Parameter(4); |
- Node* result = assembler->OrdinaryHasInstance(context, f, v); |
- assembler->Return(result); |
-} |
- |
-// ----------------------------------------------------------------------------- |
-// ES6 section 25.3 Generator Objects |
- |
-namespace { |
- |
-void Generate_GeneratorPrototypeResume( |
- CodeStubAssembler* assembler, JSGeneratorObject::ResumeMode resume_mode, |
- char const* const method_name) { |
- typedef CodeStubAssembler::Label Label; |
- typedef compiler::Node Node; |
- |
- Node* receiver = assembler->Parameter(0); |
- Node* value = assembler->Parameter(1); |
- Node* context = assembler->Parameter(4); |
- Node* closed = |
- assembler->SmiConstant(Smi::FromInt(JSGeneratorObject::kGeneratorClosed)); |
- |
- // Check if the {receiver} is actually a JSGeneratorObject. |
- Label if_receiverisincompatible(assembler, Label::kDeferred); |
- assembler->GotoIf(assembler->WordIsSmi(receiver), &if_receiverisincompatible); |
- Node* receiver_instance_type = assembler->LoadInstanceType(receiver); |
- assembler->GotoUnless(assembler->Word32Equal( |
- receiver_instance_type, |
- assembler->Int32Constant(JS_GENERATOR_OBJECT_TYPE)), |
- &if_receiverisincompatible); |
- |
- // Check if the {receiver} is running or already closed. |
- Node* receiver_continuation = assembler->LoadObjectField( |
- receiver, JSGeneratorObject::kContinuationOffset); |
- Label if_receiverisclosed(assembler, Label::kDeferred), |
- if_receiverisrunning(assembler, Label::kDeferred); |
- assembler->GotoIf(assembler->SmiEqual(receiver_continuation, closed), |
- &if_receiverisclosed); |
- DCHECK_LT(JSGeneratorObject::kGeneratorExecuting, |
- JSGeneratorObject::kGeneratorClosed); |
- assembler->GotoIf(assembler->SmiLessThan(receiver_continuation, closed), |
- &if_receiverisrunning); |
- |
- // Resume the {receiver} using our trampoline. |
- Node* result = assembler->CallStub( |
- CodeFactory::ResumeGenerator(assembler->isolate()), context, value, |
- receiver, assembler->SmiConstant(Smi::FromInt(resume_mode))); |
- assembler->Return(result); |
- |
- assembler->Bind(&if_receiverisincompatible); |
- { |
- // The {receiver} is not a valid JSGeneratorObject. |
- Node* result = assembler->CallRuntime( |
- Runtime::kThrowIncompatibleMethodReceiver, context, |
- assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked( |
- method_name, TENURED)), |
- receiver); |
- assembler->Return(result); // Never reached. |
- } |
- |
- assembler->Bind(&if_receiverisclosed); |
- { |
- // The {receiver} is closed already. |
- Node* result = nullptr; |
- switch (resume_mode) { |
- case JSGeneratorObject::kNext: |
- result = assembler->CallRuntime(Runtime::kCreateIterResultObject, |
- context, assembler->UndefinedConstant(), |
- assembler->BooleanConstant(true)); |
- break; |
- case JSGeneratorObject::kReturn: |
- result = |
- assembler->CallRuntime(Runtime::kCreateIterResultObject, context, |
- value, assembler->BooleanConstant(true)); |
- break; |
- case JSGeneratorObject::kThrow: |
- result = assembler->CallRuntime(Runtime::kThrow, context, value); |
- break; |
- } |
- assembler->Return(result); |
- } |
- |
- assembler->Bind(&if_receiverisrunning); |
- { |
- Node* result = |
- assembler->CallRuntime(Runtime::kThrowGeneratorRunning, context); |
- assembler->Return(result); // Never reached. |
- } |
-} |
- |
-} // namespace |
- |
-// ES6 section 25.3.1.2 Generator.prototype.next ( value ) |
-void Builtins::Generate_GeneratorPrototypeNext(CodeStubAssembler* assembler) { |
- Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext, |
- "[Generator].prototype.next"); |
-} |
- |
-// ES6 section 25.3.1.3 Generator.prototype.return ( value ) |
-void Builtins::Generate_GeneratorPrototypeReturn(CodeStubAssembler* assembler) { |
- Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kReturn, |
- "[Generator].prototype.return"); |
-} |
- |
-// ES6 section 25.3.1.4 Generator.prototype.throw ( exception ) |
-void Builtins::Generate_GeneratorPrototypeThrow(CodeStubAssembler* assembler) { |
- Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow, |
- "[Generator].prototype.throw"); |
-} |
- |
-// ----------------------------------------------------------------------------- |
- |
-// |
- |
-namespace { |
- |
-// Returns the holder JSObject if the function can legally be called with this |
-// receiver. Returns nullptr if the call is illegal. |
-// TODO(dcarney): CallOptimization duplicates this logic, merge. |
-JSObject* GetCompatibleReceiver(Isolate* isolate, FunctionTemplateInfo* info, |
- JSObject* receiver) { |
- Object* recv_type = info->signature(); |
- // No signature, return holder. |
- if (!recv_type->IsFunctionTemplateInfo()) return receiver; |
- FunctionTemplateInfo* signature = FunctionTemplateInfo::cast(recv_type); |
- |
- // Check the receiver. Fast path for receivers with no hidden prototypes. |
- if (signature->IsTemplateFor(receiver)) return receiver; |
- if (!receiver->map()->has_hidden_prototype()) return nullptr; |
- for (PrototypeIterator iter(isolate, receiver, kStartAtPrototype, |
- PrototypeIterator::END_AT_NON_HIDDEN); |
- !iter.IsAtEnd(); iter.Advance()) { |
- JSObject* current = iter.GetCurrent<JSObject>(); |
- if (signature->IsTemplateFor(current)) return current; |
- } |
- return nullptr; |
-} |
- |
-template <bool is_construct> |
-MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper( |
- Isolate* isolate, Handle<HeapObject> function, |
- Handle<HeapObject> new_target, Handle<FunctionTemplateInfo> fun_data, |
- Handle<Object> receiver, BuiltinArguments args) { |
- Handle<JSObject> js_receiver; |
- JSObject* raw_holder; |
- if (is_construct) { |
- DCHECK(args.receiver()->IsTheHole(isolate)); |
- if (fun_data->instance_template()->IsUndefined(isolate)) { |
- v8::Local<ObjectTemplate> templ = |
- ObjectTemplate::New(reinterpret_cast<v8::Isolate*>(isolate), |
- ToApiHandle<v8::FunctionTemplate>(fun_data)); |
- fun_data->set_instance_template(*Utils::OpenHandle(*templ)); |
- } |
- Handle<ObjectTemplateInfo> instance_template( |
- ObjectTemplateInfo::cast(fun_data->instance_template()), isolate); |
- ASSIGN_RETURN_ON_EXCEPTION( |
- isolate, js_receiver, |
- ApiNatives::InstantiateObject(instance_template, |
- Handle<JSReceiver>::cast(new_target)), |
- Object); |
- args[0] = *js_receiver; |
- DCHECK_EQ(*js_receiver, *args.receiver()); |
- |
- raw_holder = *js_receiver; |
- } else { |
- DCHECK(receiver->IsJSReceiver()); |
- |
- if (!receiver->IsJSObject()) { |
- // This function cannot be called with the given receiver. Abort! |
- THROW_NEW_ERROR( |
- isolate, NewTypeError(MessageTemplate::kIllegalInvocation), Object); |
- } |
- |
- js_receiver = Handle<JSObject>::cast(receiver); |
- |
- if (!fun_data->accept_any_receiver() && |
- js_receiver->IsAccessCheckNeeded() && |
- !isolate->MayAccess(handle(isolate->context()), js_receiver)) { |
- isolate->ReportFailedAccessCheck(js_receiver); |
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
- } |
- |
- raw_holder = GetCompatibleReceiver(isolate, *fun_data, *js_receiver); |
- |
- if (raw_holder == nullptr) { |
- // This function cannot be called with the given receiver. Abort! |
- THROW_NEW_ERROR( |
- isolate, NewTypeError(MessageTemplate::kIllegalInvocation), Object); |
- } |
- } |
- |
- Object* raw_call_data = fun_data->call_code(); |
- if (!raw_call_data->IsUndefined(isolate)) { |
- DCHECK(raw_call_data->IsCallHandlerInfo()); |
- CallHandlerInfo* call_data = CallHandlerInfo::cast(raw_call_data); |
- Object* callback_obj = call_data->callback(); |
- v8::FunctionCallback callback = |
- v8::ToCData<v8::FunctionCallback>(callback_obj); |
- Object* data_obj = call_data->data(); |
- |
- LOG(isolate, ApiObjectAccess("call", JSObject::cast(*js_receiver))); |
- |
- FunctionCallbackArguments custom(isolate, data_obj, *function, raw_holder, |
- *new_target, &args[0] - 1, |
- args.length() - 1); |
- |
- Handle<Object> result = custom.Call(callback); |
- |
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
- if (result.is_null()) { |
- if (is_construct) return js_receiver; |
- return isolate->factory()->undefined_value(); |
- } |
- // Rebox the result. |
- result->VerifyApiCallResultType(); |
- if (!is_construct || result->IsJSObject()) return handle(*result, isolate); |
- } |
- |
- return js_receiver; |
-} |
- |
-} // namespace |
- |
-BUILTIN(HandleApiCall) { |
- HandleScope scope(isolate); |
- Handle<JSFunction> function = args.target<JSFunction>(); |
- Handle<Object> receiver = args.receiver(); |
- Handle<HeapObject> new_target = args.new_target(); |
- Handle<FunctionTemplateInfo> fun_data(function->shared()->get_api_func_data(), |
- isolate); |
- if (new_target->IsJSReceiver()) { |
- RETURN_RESULT_OR_FAILURE( |
- isolate, HandleApiCallHelper<true>(isolate, function, new_target, |
- fun_data, receiver, args)); |
- } else { |
- RETURN_RESULT_OR_FAILURE( |
- isolate, HandleApiCallHelper<false>(isolate, function, new_target, |
- fun_data, receiver, args)); |
- } |
-} |
- |
-Handle<Code> Builtins::CallFunction(ConvertReceiverMode mode, |
- TailCallMode tail_call_mode) { |
- switch (tail_call_mode) { |
- case TailCallMode::kDisallow: |
- switch (mode) { |
- case ConvertReceiverMode::kNullOrUndefined: |
- return CallFunction_ReceiverIsNullOrUndefined(); |
- case ConvertReceiverMode::kNotNullOrUndefined: |
- return CallFunction_ReceiverIsNotNullOrUndefined(); |
- case ConvertReceiverMode::kAny: |
- return CallFunction_ReceiverIsAny(); |
- } |
- break; |
- case TailCallMode::kAllow: |
- switch (mode) { |
- case ConvertReceiverMode::kNullOrUndefined: |
- return TailCallFunction_ReceiverIsNullOrUndefined(); |
- case ConvertReceiverMode::kNotNullOrUndefined: |
- return TailCallFunction_ReceiverIsNotNullOrUndefined(); |
- case ConvertReceiverMode::kAny: |
- return TailCallFunction_ReceiverIsAny(); |
- } |
- break; |
- } |
- UNREACHABLE(); |
- return Handle<Code>::null(); |
-} |
- |
-Handle<Code> Builtins::Call(ConvertReceiverMode mode, |
- TailCallMode tail_call_mode) { |
- switch (tail_call_mode) { |
- case TailCallMode::kDisallow: |
- switch (mode) { |
- case ConvertReceiverMode::kNullOrUndefined: |
- return Call_ReceiverIsNullOrUndefined(); |
- case ConvertReceiverMode::kNotNullOrUndefined: |
- return Call_ReceiverIsNotNullOrUndefined(); |
- case ConvertReceiverMode::kAny: |
- return Call_ReceiverIsAny(); |
- } |
- break; |
- case TailCallMode::kAllow: |
- switch (mode) { |
- case ConvertReceiverMode::kNullOrUndefined: |
- return TailCall_ReceiverIsNullOrUndefined(); |
- case ConvertReceiverMode::kNotNullOrUndefined: |
- return TailCall_ReceiverIsNotNullOrUndefined(); |
- case ConvertReceiverMode::kAny: |
- return TailCall_ReceiverIsAny(); |
- } |
- break; |
- } |
- UNREACHABLE(); |
- return Handle<Code>::null(); |
-} |
- |
-Handle<Code> Builtins::CallBoundFunction(TailCallMode tail_call_mode) { |
- switch (tail_call_mode) { |
- case TailCallMode::kDisallow: |
- return CallBoundFunction(); |
- case TailCallMode::kAllow: |
- return TailCallBoundFunction(); |
- } |
- UNREACHABLE(); |
- return Handle<Code>::null(); |
-} |
- |
-namespace { |
- |
-class RelocatableArguments : public BuiltinArguments, public Relocatable { |
- public: |
- RelocatableArguments(Isolate* isolate, int length, Object** arguments) |
- : BuiltinArguments(length, arguments), Relocatable(isolate) {} |
- |
- virtual inline void IterateInstance(ObjectVisitor* v) { |
- if (length() == 0) return; |
- v->VisitPointers(lowest_address(), highest_address() + 1); |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(RelocatableArguments); |
-}; |
- |
-} // namespace |
- |
-MaybeHandle<Object> Builtins::InvokeApiFunction(Isolate* isolate, |
- Handle<HeapObject> function, |
- Handle<Object> receiver, |
- int argc, |
- Handle<Object> args[]) { |
- DCHECK(function->IsFunctionTemplateInfo() || |
- (function->IsJSFunction() && |
- JSFunction::cast(*function)->shared()->IsApiFunction())); |
- |
- // Do proper receiver conversion for non-strict mode api functions. |
- if (!receiver->IsJSReceiver()) { |
- if (function->IsFunctionTemplateInfo() || |
- is_sloppy(JSFunction::cast(*function)->shared()->language_mode())) { |
- ASSIGN_RETURN_ON_EXCEPTION(isolate, receiver, |
- Object::ConvertReceiver(isolate, receiver), |
- Object); |
- } |
- } |
- |
- Handle<FunctionTemplateInfo> fun_data = |
- function->IsFunctionTemplateInfo() |
- ? Handle<FunctionTemplateInfo>::cast(function) |
- : handle(JSFunction::cast(*function)->shared()->get_api_func_data(), |
- isolate); |
- Handle<HeapObject> new_target = isolate->factory()->undefined_value(); |
- // Construct BuiltinArguments object: |
- // new target, function, arguments reversed, receiver. |
- const int kBufferSize = 32; |
- Object* small_argv[kBufferSize]; |
- Object** argv; |
- const int frame_argc = argc + BuiltinArguments::kNumExtraArgsWithReceiver; |
- if (frame_argc <= kBufferSize) { |
- argv = small_argv; |
- } else { |
- argv = new Object*[frame_argc]; |
- } |
- int cursor = frame_argc - 1; |
- argv[cursor--] = *receiver; |
- for (int i = 0; i < argc; ++i) { |
- argv[cursor--] = *args[i]; |
- } |
- DCHECK(cursor == BuiltinArguments::kArgcOffset); |
- argv[BuiltinArguments::kArgcOffset] = Smi::FromInt(frame_argc); |
- argv[BuiltinArguments::kTargetOffset] = *function; |
- argv[BuiltinArguments::kNewTargetOffset] = *new_target; |
- MaybeHandle<Object> result; |
- { |
- RelocatableArguments arguments(isolate, frame_argc, &argv[frame_argc - 1]); |
- result = HandleApiCallHelper<false>(isolate, function, new_target, fun_data, |
- receiver, arguments); |
- } |
- if (argv != small_argv) delete[] argv; |
- return result; |
-} |
- |
-// Helper function to handle calls to non-function objects created through the |
-// API. The object can be called as either a constructor (using new) or just as |
-// a function (without new). |
-MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor( |
- Isolate* isolate, bool is_construct_call, BuiltinArguments args) { |
- Handle<Object> receiver = args.receiver(); |
- |
- // Get the object called. |
- JSObject* obj = JSObject::cast(*receiver); |
- |
- // Set the new target. |
- HeapObject* new_target; |
- if (is_construct_call) { |
- // TODO(adamk): This should be passed through in args instead of |
- // being patched in here. We need to set a non-undefined value |
- // for v8::FunctionCallbackInfo::IsConstructCall() to get the |
- // right answer. |
- new_target = obj; |
- } else { |
- new_target = isolate->heap()->undefined_value(); |
- } |
- |
- // Get the invocation callback from the function descriptor that was |
- // used to create the called object. |
- DCHECK(obj->map()->is_callable()); |
- JSFunction* constructor = JSFunction::cast(obj->map()->GetConstructor()); |
- // TODO(ishell): turn this back to a DCHECK. |
- CHECK(constructor->shared()->IsApiFunction()); |
- Object* handler = |
- constructor->shared()->get_api_func_data()->instance_call_handler(); |
- DCHECK(!handler->IsUndefined(isolate)); |
- // TODO(ishell): remove this debugging code. |
- CHECK(handler->IsCallHandlerInfo()); |
- CallHandlerInfo* call_data = CallHandlerInfo::cast(handler); |
- Object* callback_obj = call_data->callback(); |
- v8::FunctionCallback callback = |
- v8::ToCData<v8::FunctionCallback>(callback_obj); |
- |
- // Get the data for the call and perform the callback. |
- Object* result; |
- { |
- HandleScope scope(isolate); |
- LOG(isolate, ApiObjectAccess("call non-function", obj)); |
- |
- FunctionCallbackArguments custom(isolate, call_data->data(), constructor, |
- obj, new_target, &args[0] - 1, |
- args.length() - 1); |
- Handle<Object> result_handle = custom.Call(callback); |
- if (result_handle.is_null()) { |
- result = isolate->heap()->undefined_value(); |
- } else { |
- result = *result_handle; |
- } |
- } |
- // Check for exceptions and return result. |
- RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
- return result; |
-} |
- |
-// Handle calls to non-function objects created through the API. This delegate |
-// function is used when the call is a normal function call. |
-BUILTIN(HandleApiCallAsFunction) { |
- return HandleApiCallAsFunctionOrConstructor(isolate, false, args); |
-} |
- |
-// Handle calls to non-function objects created through the API. This delegate |
-// function is used when the call is a construct call. |
-BUILTIN(HandleApiCallAsConstructor) { |
- return HandleApiCallAsFunctionOrConstructor(isolate, true, args); |
-} |
Builtins::Builtins() : initialized_(false) { |
memset(builtins_, 0, sizeof(builtins_[0]) * builtin_count); |
@@ -662,87 +198,6 @@ const char* Builtins::name(int index) { |
return ""; |
} |
-void Builtins::Generate_InterruptCheck(MacroAssembler* masm) { |
- masm->TailCallRuntime(Runtime::kInterrupt); |
-} |
- |
-void Builtins::Generate_StackCheck(MacroAssembler* masm) { |
- masm->TailCallRuntime(Runtime::kStackGuard); |
-} |
- |
-void Builtins::Generate_CallFunction_ReceiverIsNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined, |
- TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_CallFunction_ReceiverIsNotNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined, |
- TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_CallFunction_ReceiverIsAny(MacroAssembler* masm) { |
- Generate_CallFunction(masm, ConvertReceiverMode::kAny, |
- TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_TailCallFunction_ReceiverIsNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined, |
- TailCallMode::kAllow); |
-} |
- |
-void Builtins::Generate_TailCallFunction_ReceiverIsNotNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined, |
- TailCallMode::kAllow); |
-} |
- |
-void Builtins::Generate_TailCallFunction_ReceiverIsAny(MacroAssembler* masm) { |
- Generate_CallFunction(masm, ConvertReceiverMode::kAny, TailCallMode::kAllow); |
-} |
- |
-void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) { |
- Generate_CallBoundFunctionImpl(masm, TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_TailCallBoundFunction(MacroAssembler* masm) { |
- Generate_CallBoundFunctionImpl(masm, TailCallMode::kAllow); |
-} |
- |
-void Builtins::Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler* masm) { |
- Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined, |
- TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_Call_ReceiverIsNotNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined, |
- TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_Call_ReceiverIsAny(MacroAssembler* masm) { |
- Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kDisallow); |
-} |
- |
-void Builtins::Generate_TailCall_ReceiverIsNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined, |
- TailCallMode::kAllow); |
-} |
- |
-void Builtins::Generate_TailCall_ReceiverIsNotNullOrUndefined( |
- MacroAssembler* masm) { |
- Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined, |
- TailCallMode::kAllow); |
-} |
- |
-void Builtins::Generate_TailCall_ReceiverIsAny(MacroAssembler* masm) { |
- Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kAllow); |
-} |
- |
- |
#define DEFINE_BUILTIN_ACCESSOR(Name, ...) \ |
Handle<Code> Builtins::Name() { \ |
Code** code_address = reinterpret_cast<Code**>(builtin_address(k##Name)); \ |