From 86296897e55e0c80a3e93e27031e244525fb757c Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Wed, 28 Jul 2021 14:32:51 -0700 Subject: JSClassRef globals work! Former-commit-id: b1d3eb19872b2c09bda3e9e3b3a4c1f40c3b6a6d --- src/javascript/jsc/bindings/ZigGlobalObject.cpp | 58 ++++++++++++++++--------- 1 file changed, 38 insertions(+), 20 deletions(-) (limited to 'src/javascript/jsc/bindings/ZigGlobalObject.cpp') diff --git a/src/javascript/jsc/bindings/ZigGlobalObject.cpp b/src/javascript/jsc/bindings/ZigGlobalObject.cpp index af975e79e..ce66998ec 100644 --- a/src/javascript/jsc/bindings/ZigGlobalObject.cpp +++ b/src/javascript/jsc/bindings/ZigGlobalObject.cpp @@ -33,6 +33,8 @@ #include #include +#include +#include using JSGlobalObject = JSC::JSGlobalObject; using Exception = JSC::Exception; @@ -42,36 +44,32 @@ using JSModuleLoader = JSC::JSModuleLoader; using JSModuleRecord = JSC::JSModuleRecord; using Identifier = JSC::Identifier; using SourceOrigin = JSC::SourceOrigin; +using JSObject = JSC::JSObject; +using JSNonFinalObject = JSC::JSNonFinalObject; namespace JSCastingHelpers = JSC::JSCastingHelpers; -extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSC__VM* arg0, void* console_client) { - - - // There are assertions that the apiLock is set while the JSGlobalObject is initialized. - if (arg0 != nullptr) { - JSC::VM& vm = *arg0; - JSC::JSLockHolder holder(vm); - - auto globalObject = Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::jsNull())); - return static_cast(globalObject); - } - +extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSClassRef* globalObjectClass, int count, void* console_client) { std::set_terminate([](){ Zig__GlobalObject__onCrash(); }); - JSC::initialize(); + JSC::VM& vm = JSC::VM::create(JSC::LargeHeap).leakRef(); - - #if ENABLE(WEBASSEMBLY) + #if ENABLE(WEBASSEMBLY) JSC::Wasm::enableFastMemory(); #endif + JSC::JSLockHolder locker(vm); - auto globalObject = Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::jsNull())); - globalObject->setConsole(console_client); - + Zig::GlobalObject *globalObject = Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::jsNull())); + globalObject->setConsole(globalObject); - + if (count > 0) { + globalObject->installAPIGlobals(globalObjectClass, count); + } + + + JSC::gcProtect(globalObject); + vm.ref(); return globalObject; } @@ -114,6 +112,24 @@ void GlobalObject::setConsole(void* console) { this->setConsoleClient(makeWeakPtr(m_console)); } +void GlobalObject::installAPIGlobals(JSClassRef* globals, int count) { + WTF::Vector extraStaticGlobals; + extraStaticGlobals.reserveCapacity((size_t)count); + + for (int i = 0; i < count; i++) { + auto jsClass = globals[i]; + + JSC::JSCallbackObject* object = JSC::JSCallbackObject::create(this, this->callbackObjectStructure(), jsClass, nullptr); + if (JSObject* prototype = jsClass->prototype(this)) + object->setPrototypeDirect(vm(), prototype); + + extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo{ JSC::Identifier::fromString(vm(), jsClass->className()), JSC::JSValue(object), JSC::PropertyAttribute::DontDelete | 0 }); + } + this->addStaticGlobals(extraStaticGlobals.data(), count); + extraStaticGlobals.releaseBuffer(); + +} + JSC::Identifier GlobalObject::moduleLoaderResolve( JSGlobalObject* globalObject, JSModuleLoader* loader, @@ -219,4 +235,6 @@ JSC::JSValue GlobalObject::moduleLoaderEvaluate(JSGlobalObject* globalObject, JS // VM& vm = globalObject->vm(); return moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode); } -} \ No newline at end of file + + +} // namespace Zig \ No newline at end of file -- cgit v1.2.3