diff options
Diffstat (limited to 'deps/v8/src/execution.cc')
-rw-r--r-- | deps/v8/src/execution.cc | 65 |
1 files changed, 41 insertions, 24 deletions
diff --git a/deps/v8/src/execution.cc b/deps/v8/src/execution.cc index ee4bd55534..edd329f5da 100644 --- a/deps/v8/src/execution.cc +++ b/deps/v8/src/execution.cc @@ -55,7 +55,8 @@ namespace { MUST_USE_RESULT MaybeHandle<Object> Invoke( Isolate* isolate, bool is_construct, Handle<Object> target, Handle<Object> receiver, int argc, Handle<Object> args[], - Handle<Object> new_target, Execution::MessageHandling message_handling) { + Handle<Object> new_target, Execution::MessageHandling message_handling, + Execution::Target execution_target) { DCHECK(!receiver->IsJSGlobalObject()); #ifdef USE_SIMULATOR @@ -113,20 +114,30 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke( // Placeholder for return value. Object* value = nullptr; - typedef Object* (*JSEntryFunction)(Object* new_target, Object* target, - Object* receiver, int argc, - Object*** args); - - Handle<Code> code = is_construct - ? isolate->factory()->js_construct_entry_code() - : isolate->factory()->js_entry_code(); + using JSEntryFunction = + GeneratedCode<Object*(Object * new_target, Object * target, + Object * receiver, int argc, Object*** args)>; + + Handle<Code> code; + switch (execution_target) { + case Execution::Target::kCallable: + code = is_construct ? isolate->factory()->js_construct_entry_code() + : isolate->factory()->js_entry_code(); + break; + case Execution::Target::kRunMicrotasks: + code = isolate->factory()->js_run_microtasks_entry_code(); + break; + default: + UNREACHABLE(); + } { // Save and restore context around invocation and block the // allocation of handles without explicit handle scopes. SaveContext save(isolate); SealHandleScope shs(isolate); - JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry()); + JSEntryFunction stub_entry = + JSEntryFunction::FromAddress(isolate, code->entry()); if (FLAG_clear_exceptions_on_js_entry) isolate->clear_pending_exception(); @@ -138,9 +149,8 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke( if (FLAG_profile_deserialization && target->IsJSFunction()) { PrintDeserializedCodeInfo(Handle<JSFunction>::cast(target)); } - RuntimeCallTimerScope timer(isolate, &RuntimeCallStats::JS_Execution); - value = CALL_GENERATED_CODE(isolate, stub_entry, orig_func, func, recv, - argc, argv); + RuntimeCallTimerScope timer(isolate, RuntimeCallCounterId::kJS_Execution); + value = stub_entry.Call(orig_func, func, recv, argc, argv); } #ifdef VERIFY_HEAP @@ -167,7 +177,8 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke( MaybeHandle<Object> CallInternal(Isolate* isolate, Handle<Object> callable, Handle<Object> receiver, int argc, Handle<Object> argv[], - Execution::MessageHandling message_handling) { + Execution::MessageHandling message_handling, + Execution::Target target) { // Convert calls on global objects to be calls on the global // receiver instead to avoid having a 'this' pointer which refers // directly to a global object. @@ -176,7 +187,8 @@ MaybeHandle<Object> CallInternal(Isolate* isolate, Handle<Object> callable, handle(Handle<JSGlobalObject>::cast(receiver)->global_proxy(), isolate); } return Invoke(isolate, false, callable, receiver, argc, argv, - isolate->factory()->undefined_value(), message_handling); + isolate->factory()->undefined_value(), message_handling, + target); } } // namespace @@ -186,7 +198,7 @@ MaybeHandle<Object> Execution::Call(Isolate* isolate, Handle<Object> callable, Handle<Object> receiver, int argc, Handle<Object> argv[]) { return CallInternal(isolate, callable, receiver, argc, argv, - MessageHandling::kReport); + MessageHandling::kReport, Execution::Target::kCallable); } @@ -203,15 +215,13 @@ MaybeHandle<Object> Execution::New(Isolate* isolate, Handle<Object> constructor, Handle<Object> argv[]) { return Invoke(isolate, true, constructor, isolate->factory()->undefined_value(), argc, argv, new_target, - MessageHandling::kReport); + MessageHandling::kReport, Execution::Target::kCallable); } -MaybeHandle<Object> Execution::TryCall(Isolate* isolate, - Handle<Object> callable, - Handle<Object> receiver, int argc, - Handle<Object> args[], - MessageHandling message_handling, - MaybeHandle<Object>* exception_out) { +MaybeHandle<Object> Execution::TryCall( + Isolate* isolate, Handle<Object> callable, Handle<Object> receiver, + int argc, Handle<Object> args[], MessageHandling message_handling, + MaybeHandle<Object>* exception_out, Target target) { bool is_termination = false; MaybeHandle<Object> maybe_result; if (exception_out != nullptr) *exception_out = MaybeHandle<Object>(); @@ -226,8 +236,8 @@ MaybeHandle<Object> Execution::TryCall(Isolate* isolate, catcher.SetVerbose(false); catcher.SetCaptureMessage(false); - maybe_result = - CallInternal(isolate, callable, receiver, argc, args, message_handling); + maybe_result = CallInternal(isolate, callable, receiver, argc, args, + message_handling, target); if (maybe_result.is_null()) { DCHECK(isolate->has_pending_exception()); @@ -253,6 +263,13 @@ MaybeHandle<Object> Execution::TryCall(Isolate* isolate, return maybe_result; } +MaybeHandle<Object> Execution::RunMicrotasks( + Isolate* isolate, MessageHandling message_handling, + MaybeHandle<Object>* exception_out) { + auto undefined = isolate->factory()->undefined_value(); + return TryCall(isolate, undefined, undefined, 0, {}, message_handling, + exception_out, Target::kRunMicrotasks); +} void StackGuard::SetStackLimit(uintptr_t limit) { ExecutionAccess access(isolate_); |