summaryrefslogtreecommitdiff
path: root/deps/v8/src/execution.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/execution.cc')
-rw-r--r--deps/v8/src/execution.cc65
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_);