diff --git a/src/d8/d8.cc b/src/d8/d8.cc index 5210959ea0..133b9b8403 100644 --- a/src/d8/d8.cc +++ b/src/d8/d8.cc @@ -2071,6 +2071,11 @@ Local Shell::Stringify(Isolate* isolate, Local value) { Local Shell::CreateGlobalTemplate(Isolate* isolate) { Local global_template = ObjectTemplate::New(isolate); + global_template->Set(Symbol::GetToStringTag(isolate), + String::NewFromUtf8Literal(isolate, "global")); + global_template->Set(isolate, "version", + FunctionTemplate::New(isolate, Version)); + global_template->Set(isolate, "print", FunctionTemplate::New(isolate, Print)); global_template->Set(isolate, "printErr", FunctionTemplate::New(isolate, PrintErr)); @@ -2089,57 +2094,37 @@ Local Shell::CreateGlobalTemplate(Isolate* isolate) { if (!options.omit_quit) { global_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit)); } - Local test_template = ObjectTemplate::New(isolate); - global_template->Set(isolate, "testRunner", test_template); - test_template->Set(isolate, "notifyDone", - FunctionTemplate::New(isolate, NotifyDone)); - test_template->Set(isolate, "waitUntilDone", - FunctionTemplate::New(isolate, WaitUntilDone)); - // Reliable access to quit functionality. The "quit" method function - // installed on the global object can be hidden with the --omit-quit flag - // (e.g. on asan bots). - test_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit)); + global_template->Set(isolate, "testRunner", + Shell::CreateTestRunnerTemplate(isolate)); + global_template->Set(isolate, "Realm", Shell::CreateRealmTemplate(isolate)); + global_template->Set(isolate, "performance", + Shell::CreatePerformanceTemplate(isolate)); + global_template->Set(isolate, "Worker", Shell::CreateWorkerTemplate(isolate)); + global_template->Set(isolate, "os", Shell::CreateOSTemplate(isolate)); + global_template->Set(isolate, "d8", Shell::CreateD8Template(isolate)); - global_template->Set(isolate, "version", - FunctionTemplate::New(isolate, Version)); - global_template->Set(Symbol::GetToStringTag(isolate), - String::NewFromUtf8Literal(isolate, "global")); +#ifdef V8_FUZZILLI + global_template->Set( + String::NewFromUtf8(isolate, "fuzzilli", NewStringType::kNormal) + .ToLocalChecked(), + FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum); +#endif // V8_FUZZILLI - // Bind the Realm object. - Local realm_template = ObjectTemplate::New(isolate); - realm_template->Set(isolate, "current", - FunctionTemplate::New(isolate, RealmCurrent)); - realm_template->Set(isolate, "owner", - FunctionTemplate::New(isolate, RealmOwner)); - realm_template->Set(isolate, "global", - FunctionTemplate::New(isolate, RealmGlobal)); - realm_template->Set(isolate, "create", - FunctionTemplate::New(isolate, RealmCreate)); - realm_template->Set( - isolate, "createAllowCrossRealmAccess", - FunctionTemplate::New(isolate, RealmCreateAllowCrossRealmAccess)); - realm_template->Set(isolate, "navigate", - FunctionTemplate::New(isolate, RealmNavigate)); - realm_template->Set(isolate, "detachGlobal", - FunctionTemplate::New(isolate, RealmDetachGlobal)); - realm_template->Set(isolate, "dispose", - FunctionTemplate::New(isolate, RealmDispose)); - realm_template->Set(isolate, "switch", - FunctionTemplate::New(isolate, RealmSwitch)); - realm_template->Set(isolate, "eval", - FunctionTemplate::New(isolate, RealmEval)); - realm_template->SetAccessor(String::NewFromUtf8Literal(isolate, "shared"), - RealmSharedGet, RealmSharedSet); - global_template->Set(isolate, "Realm", realm_template); + if (i::FLAG_expose_async_hooks) { + global_template->Set(isolate, "async_hooks", + Shell::CreateAsyncHookTemplate(isolate)); + } - Local performance_template = ObjectTemplate::New(isolate); - performance_template->Set(isolate, "now", - FunctionTemplate::New(isolate, PerformanceNow)); - performance_template->Set( - isolate, "measureMemory", - FunctionTemplate::New(isolate, PerformanceMeasureMemory)); - global_template->Set(isolate, "performance", performance_template); + return global_template; +} +Local Shell::CreateOSTemplate(Isolate* isolate) { + Local os_template = ObjectTemplate::New(isolate); + AddOSMethods(isolate, os_template); + return os_template; +} + +Local Shell::CreateWorkerTemplate(Isolate* isolate) { Local worker_fun_template = FunctionTemplate::New(isolate, WorkerNew); Local worker_signature = @@ -2164,34 +2149,76 @@ Local Shell::CreateGlobalTemplate(Isolate* isolate) { FunctionTemplate::New(isolate, WorkerGetMessage, Local(), worker_signature)); worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1); - global_template->Set(isolate, "Worker", worker_fun_template); + return worker_fun_template; +} - Local os_templ = ObjectTemplate::New(isolate); - AddOSMethods(isolate, os_templ); - global_template->Set(isolate, "os", os_templ); +Local Shell::CreateAsyncHookTemplate(Isolate* isolate) { + Local async_hooks_templ = ObjectTemplate::New(isolate); + async_hooks_templ->Set(isolate, "createHook", + FunctionTemplate::New(isolate, AsyncHooksCreateHook)); + async_hooks_templ->Set( + isolate, "executionAsyncId", + FunctionTemplate::New(isolate, AsyncHooksExecutionAsyncId)); + async_hooks_templ->Set( + isolate, "triggerAsyncId", + FunctionTemplate::New(isolate, AsyncHooksTriggerAsyncId)); + return async_hooks_templ; +} -#ifdef V8_FUZZILLI - global_template->Set( - String::NewFromUtf8(isolate, "fuzzilli", NewStringType::kNormal) - .ToLocalChecked(), - FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum); -#endif // V8_FUZZILLI +Local Shell::CreateTestRunnerTemplate(Isolate* isolate) { + Local test_template = ObjectTemplate::New(isolate); + test_template->Set(isolate, "notifyDone", + FunctionTemplate::New(isolate, NotifyDone)); + test_template->Set(isolate, "waitUntilDone", + FunctionTemplate::New(isolate, WaitUntilDone)); + // Reliable access to quit functionality. The "quit" method function + // installed on the global object can be hidden with the --omit-quit flag + // (e.g. on asan bots). + test_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit)); + return test_template; +} - if (i::FLAG_expose_async_hooks) { - Local async_hooks_templ = ObjectTemplate::New(isolate); - async_hooks_templ->Set( - isolate, "createHook", - FunctionTemplate::New(isolate, AsyncHooksCreateHook)); - async_hooks_templ->Set( - isolate, "executionAsyncId", - FunctionTemplate::New(isolate, AsyncHooksExecutionAsyncId)); - async_hooks_templ->Set( - isolate, "triggerAsyncId", - FunctionTemplate::New(isolate, AsyncHooksTriggerAsyncId)); - global_template->Set(isolate, "async_hooks", async_hooks_templ); - } +Local Shell::CreatePerformanceTemplate(Isolate* isolate) { + Local performance_template = ObjectTemplate::New(isolate); + performance_template->Set(isolate, "now", + FunctionTemplate::New(isolate, PerformanceNow)); + performance_template->Set( + isolate, "measureMemory", + FunctionTemplate::New(isolate, PerformanceMeasureMemory)); + return performance_template; +} - return global_template; +Local Shell::CreateRealmTemplate(Isolate* isolate) { + Local realm_template = ObjectTemplate::New(isolate); + realm_template->Set(isolate, "current", + FunctionTemplate::New(isolate, RealmCurrent)); + realm_template->Set(isolate, "owner", + FunctionTemplate::New(isolate, RealmOwner)); + realm_template->Set(isolate, "global", + FunctionTemplate::New(isolate, RealmGlobal)); + realm_template->Set(isolate, "create", + FunctionTemplate::New(isolate, RealmCreate)); + realm_template->Set( + isolate, "createAllowCrossRealmAccess", + FunctionTemplate::New(isolate, RealmCreateAllowCrossRealmAccess)); + realm_template->Set(isolate, "navigate", + FunctionTemplate::New(isolate, RealmNavigate)); + realm_template->Set(isolate, "detachGlobal", + FunctionTemplate::New(isolate, RealmDetachGlobal)); + realm_template->Set(isolate, "dispose", + FunctionTemplate::New(isolate, RealmDispose)); + realm_template->Set(isolate, "switch", + FunctionTemplate::New(isolate, RealmSwitch)); + realm_template->Set(isolate, "eval", + FunctionTemplate::New(isolate, RealmEval)); + realm_template->SetAccessor(String::NewFromUtf8Literal(isolate, "shared"), + RealmSharedGet, RealmSharedSet); + return realm_template; +} + +Local Shell::CreateD8Template(Isolate* isolate) { + Local d8_template = ObjectTemplate::New(isolate); + return d8_template; } static void PrintMessageCallback(Local message, Local error) { diff --git a/src/d8/d8.h b/src/d8/d8.h index 6b2c08fd6e..d5c9d111a8 100644 --- a/src/d8/d8.h +++ b/src/d8/d8.h @@ -539,7 +539,16 @@ class Shell : public i::AllStatic { static Local Stringify(Isolate* isolate, Local value); static void RunShell(Isolate* isolate); static bool SetOptions(int argc, char* argv[]); + static Local CreateGlobalTemplate(Isolate* isolate); + static Local CreateOSTemplate(Isolate* isolate); + static Local CreateWorkerTemplate(Isolate* isolate); + static Local CreateAsyncHookTemplate(Isolate* isolate); + static Local CreateTestRunnerTemplate(Isolate* isolate); + static Local CreatePerformanceTemplate(Isolate* isolate); + static Local CreateRealmTemplate(Isolate* isolate); + static Local CreateD8Template(Isolate* isolate); + static MaybeLocal CreateRealm( const v8::FunctionCallbackInfo& args, int index, v8::MaybeLocal global_object);