diff options
Diffstat (limited to 'src/javascript/jsc/bindings/ZigGlobalObject.cpp')
-rw-r--r-- | src/javascript/jsc/bindings/ZigGlobalObject.cpp | 921 |
1 files changed, 471 insertions, 450 deletions
diff --git a/src/javascript/jsc/bindings/ZigGlobalObject.cpp b/src/javascript/jsc/bindings/ZigGlobalObject.cpp index 8b0eebc63..3ab654dda 100644 --- a/src/javascript/jsc/bindings/ZigGlobalObject.cpp +++ b/src/javascript/jsc/bindings/ZigGlobalObject.cpp @@ -88,178 +88,186 @@ namespace JSCastingHelpers = JSC::JSCastingHelpers; static bool has_loaded_jsc = false; -extern "C" void JSCInitialize() { - if (has_loaded_jsc) return; - has_loaded_jsc = true; - - JSC::Options::useSourceProviderCache() = true; - JSC::Options::useUnlinkedCodeBlockJettisoning() = false; - JSC::Options::exposeInternalModuleLoader() = true; - JSC::Options::useSharedArrayBuffer() = true; - // JSC::Options::useAtMethod() = true; - std::set_terminate([]() { Zig__GlobalObject__onCrash(); }); - WTF::initializeMainThread(); - JSC::initialize(); +extern "C" void JSCInitialize() +{ + if (has_loaded_jsc) + return; + has_loaded_jsc = true; + + JSC::Options::useSourceProviderCache() = true; + JSC::Options::useUnlinkedCodeBlockJettisoning() = false; + JSC::Options::exposeInternalModuleLoader() = true; + JSC::Options::useSharedArrayBuffer() = true; + // JSC::Options::useAtMethod() = true; + std::set_terminate([]() { Zig__GlobalObject__onCrash(); }); + WTF::initializeMainThread(); + JSC::initialize(); } -extern "C" JSC__JSGlobalObject *Zig__GlobalObject__create(JSClassRef *globalObjectClass, int count, - void *console_client) { - auto heapSize = JSC::HeapType::Large; +extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSClassRef* globalObjectClass, int count, + void* console_client) +{ + auto heapSize = JSC::HeapType::Large; - JSC::VM &vm = JSC::VM::create(heapSize).leakRef(); - Bun::JSVMClientData::create(&vm); + JSC::VM& vm = JSC::VM::create(heapSize).leakRef(); + Bun::JSVMClientData::create(&vm); - vm.heap.acquireAccess(); + vm.heap.acquireAccess(); #if ENABLE(WEBASSEMBLY) - JSC::Wasm::enableFastMemory(); + JSC::Wasm::enableFastMemory(); #endif - JSC::JSLockHolder locker(vm); - Zig::GlobalObject *globalObject = - Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::jsNull())); - globalObject->setConsole(globalObject); + JSC::JSLockHolder locker(vm); + Zig::GlobalObject* globalObject = Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::jsNull())); + globalObject->setConsole(globalObject); - if (count > 0) { globalObject->installAPIGlobals(globalObjectClass, count); } + if (count > 0) { + globalObject->installAPIGlobals(globalObjectClass, count); + } - JSC::gcProtect(globalObject); - vm.ref(); - return globalObject; + JSC::gcProtect(globalObject); + vm.ref(); + return globalObject; } -extern "C" void *Zig__GlobalObject__getModuleRegistryMap(JSC__JSGlobalObject *arg0) { - if (JSC::JSObject *loader = - JSC::jsDynamicCast<JSC::JSObject *>(arg0->vm(), arg0->moduleLoader())) { - JSC::JSMap *map = JSC::jsDynamicCast<JSC::JSMap *>( - arg0->vm(), - loader->getDirect(arg0->vm(), JSC::Identifier::fromString(arg0->vm(), "registry"))); +extern "C" void* Zig__GlobalObject__getModuleRegistryMap(JSC__JSGlobalObject* arg0) +{ + if (JSC::JSObject* loader = JSC::jsDynamicCast<JSC::JSObject*>(arg0->vm(), arg0->moduleLoader())) { + JSC::JSMap* map = JSC::jsDynamicCast<JSC::JSMap*>( + arg0->vm(), + loader->getDirect(arg0->vm(), JSC::Identifier::fromString(arg0->vm(), "registry"))); - JSC::JSMap *cloned = map->clone(arg0, arg0->vm(), arg0->mapStructure()); - JSC::gcProtect(cloned); + JSC::JSMap* cloned = map->clone(arg0, arg0->vm(), arg0->mapStructure()); + JSC::gcProtect(cloned); - return cloned; - } + return cloned; + } - return nullptr; + return nullptr; } -extern "C" bool Zig__GlobalObject__resetModuleRegistryMap(JSC__JSGlobalObject *globalObject, - void *map_ptr) { - if (map_ptr == nullptr) return false; - JSC::JSMap *map = reinterpret_cast<JSC::JSMap *>(map_ptr); - JSC::VM &vm = globalObject->vm(); - if (JSC::JSObject *obj = - JSC::jsDynamicCast<JSC::JSObject *>(globalObject->vm(), globalObject->moduleLoader())) { - auto identifier = JSC::Identifier::fromString(globalObject->vm(), "registry"); - - if (JSC::JSMap *oldMap = JSC::jsDynamicCast<JSC::JSMap *>( - globalObject->vm(), obj->getDirect(globalObject->vm(), identifier))) { - oldMap->clear(globalObject); - // vm.finalizeSynchronousJSExecution(); - - obj->putDirect(globalObject->vm(), identifier, - map->clone(globalObject, globalObject->vm(), globalObject->mapStructure())); - - // vm.deleteAllLinkedCode(JSC::DeleteAllCodeEffort::DeleteAllCodeIfNotCollecting); - // JSC::Heap::PreventCollectionScope(vm.heap); - - // vm.heap.completeAllJITPlans(); - - // vm.forEachScriptExecutableSpace([&](auto &spaceAndSet) { - // JSC::HeapIterationScope heapIterationScope(vm.heap); - // auto &set = spaceAndSet.set; - // set.forEachLiveCell([&](JSC::HeapCell *cell, JSC::HeapCell::Kind) { - // if (JSC::ModuleProgramExecutable *executable = - // JSC::jsDynamicCast<JSC::ModuleProgramExecutable *>(cell)) { - // executable->clearCode(set); - // } - // }); - // }); +extern "C" bool Zig__GlobalObject__resetModuleRegistryMap(JSC__JSGlobalObject* globalObject, + void* map_ptr) +{ + if (map_ptr == nullptr) + return false; + JSC::JSMap* map = reinterpret_cast<JSC::JSMap*>(map_ptr); + JSC::VM& vm = globalObject->vm(); + if (JSC::JSObject* obj = JSC::jsDynamicCast<JSC::JSObject*>(globalObject->vm(), globalObject->moduleLoader())) { + auto identifier = JSC::Identifier::fromString(globalObject->vm(), "registry"); + + if (JSC::JSMap* oldMap = JSC::jsDynamicCast<JSC::JSMap*>( + globalObject->vm(), obj->getDirect(globalObject->vm(), identifier))) { + oldMap->clear(globalObject); + // vm.finalizeSynchronousJSExecution(); + + obj->putDirect(globalObject->vm(), identifier, + map->clone(globalObject, globalObject->vm(), globalObject->mapStructure())); + + // vm.deleteAllLinkedCode(JSC::DeleteAllCodeEffort::DeleteAllCodeIfNotCollecting); + // JSC::Heap::PreventCollectionScope(vm.heap); + + // vm.heap.completeAllJITPlans(); + + // vm.forEachScriptExecutableSpace([&](auto &spaceAndSet) { + // JSC::HeapIterationScope heapIterationScope(vm.heap); + // auto &set = spaceAndSet.set; + // set.forEachLiveCell([&](JSC::HeapCell *cell, JSC::HeapCell::Kind) { + // if (JSC::ModuleProgramExecutable *executable = + // JSC::jsDynamicCast<JSC::ModuleProgramExecutable *>(cell)) { + // executable->clearCode(set); + // } + // }); + // }); + } + // globalObject->vm().heap.deleteAllUnlinkedCodeBlocks( + // JSC::DeleteAllCodeEffort::PreventCollectionAndDeleteAllCode); + // vm.whenIdle([globalObject, oldMap, map]() { + // auto recordIdentifier = JSC::Identifier::fromString(globalObject->vm(), "module"); + + // JSC::JSModuleRecord *record; + // JSC::JSValue key; + // JSC::JSValue value; + // JSC::JSObject *mod; + // JSC::JSObject *nextObject; + // JSC::forEachInIterable( + // globalObject, oldMap, + // [&](JSC::VM &vm, JSC::JSGlobalObject *globalObject, JSC::JSValue nextValue) { + // nextObject = JSC::jsDynamicCast<JSC::JSObject *>(vm, nextValue); + // key = nextObject->getIndex(globalObject, static_cast<unsigned>(0)); + + // if (!map->has(globalObject, key)) { + // value = nextObject->getIndex(globalObject, static_cast<unsigned>(1)); + // mod = JSC::jsDynamicCast<JSC::JSObject *>(vm, value); + // if (mod) { + // record = JSC::jsDynamicCast<JSC::JSModuleRecord *>( + // vm, mod->getDirect(vm, recordIdentifier)); + // if (record) { + // auto code = &record->sourceCode(); + // if (code) { + + // Zig::SourceProvider *provider = + // reinterpret_cast<Zig::SourceProvider *>(code->provider()); + // // code->~SourceCode(); + // if (provider) { provider->freeSourceCode(); } + // } + // } + // } + // } + // }); + + // oldMap->clear(globalObject); + // } + // } + // map } - // globalObject->vm().heap.deleteAllUnlinkedCodeBlocks( - // JSC::DeleteAllCodeEffort::PreventCollectionAndDeleteAllCode); - // vm.whenIdle([globalObject, oldMap, map]() { - // auto recordIdentifier = JSC::Identifier::fromString(globalObject->vm(), "module"); - - // JSC::JSModuleRecord *record; - // JSC::JSValue key; - // JSC::JSValue value; - // JSC::JSObject *mod; - // JSC::JSObject *nextObject; - // JSC::forEachInIterable( - // globalObject, oldMap, - // [&](JSC::VM &vm, JSC::JSGlobalObject *globalObject, JSC::JSValue nextValue) { - // nextObject = JSC::jsDynamicCast<JSC::JSObject *>(vm, nextValue); - // key = nextObject->getIndex(globalObject, static_cast<unsigned>(0)); - - // if (!map->has(globalObject, key)) { - // value = nextObject->getIndex(globalObject, static_cast<unsigned>(1)); - // mod = JSC::jsDynamicCast<JSC::JSObject *>(vm, value); - // if (mod) { - // record = JSC::jsDynamicCast<JSC::JSModuleRecord *>( - // vm, mod->getDirect(vm, recordIdentifier)); - // if (record) { - // auto code = &record->sourceCode(); - // if (code) { - - // Zig::SourceProvider *provider = - // reinterpret_cast<Zig::SourceProvider *>(code->provider()); - // // code->~SourceCode(); - // if (provider) { provider->freeSourceCode(); } - // } - // } - // } - // } - // }); - - // oldMap->clear(globalObject); - // } - // } - // map - } - return true; + return true; } namespace Zig { -const JSC::ClassInfo GlobalObject::s_info = {"GlobalObject", &Base::s_info, nullptr, nullptr, - CREATE_METHOD_TABLE(GlobalObject)}; +const JSC::ClassInfo GlobalObject::s_info = { "GlobalObject", &Base::s_info, nullptr, nullptr, + CREATE_METHOD_TABLE(GlobalObject) }; const JSC::GlobalObjectMethodTable GlobalObject::s_globalObjectMethodTable = { - &supportsRichSourceInfo, - &shouldInterruptScript, - &javaScriptRuntimeFlags, - &queueMicrotaskToEventLoop, // queueTaskToEventLoop - nullptr, // &shouldInterruptScriptBeforeTimeout, - &moduleLoaderImportModule, // moduleLoaderImportModule - &moduleLoaderResolve, // moduleLoaderResolve - &moduleLoaderFetch, // moduleLoaderFetch - &moduleLoaderCreateImportMetaProperties, // moduleLoaderCreateImportMetaProperties - &moduleLoaderEvaluate, // moduleLoaderEvaluate - &promiseRejectionTracker, // promiseRejectionTracker - &reportUncaughtExceptionAtEventLoop, - ¤tScriptExecutionOwner, - &scriptExecutionStatus, - nullptr, // defaultLanguage - nullptr, // compileStreaming - nullptr, // instantiateStreaming + &supportsRichSourceInfo, + &shouldInterruptScript, + &javaScriptRuntimeFlags, + &queueMicrotaskToEventLoop, // queueTaskToEventLoop + nullptr, // &shouldInterruptScriptBeforeTimeout, + &moduleLoaderImportModule, // moduleLoaderImportModule + &moduleLoaderResolve, // moduleLoaderResolve + &moduleLoaderFetch, // moduleLoaderFetch + &moduleLoaderCreateImportMetaProperties, // moduleLoaderCreateImportMetaProperties + &moduleLoaderEvaluate, // moduleLoaderEvaluate + &promiseRejectionTracker, // promiseRejectionTracker + &reportUncaughtExceptionAtEventLoop, + ¤tScriptExecutionOwner, + &scriptExecutionStatus, + nullptr, // defaultLanguage + nullptr, // compileStreaming + nullptr, // instantiateStreaming }; -void GlobalObject::reportUncaughtExceptionAtEventLoop(JSGlobalObject *globalObject, - Exception *exception) { - Zig__GlobalObject__reportUncaughtException(globalObject, exception); +void GlobalObject::reportUncaughtExceptionAtEventLoop(JSGlobalObject* globalObject, + Exception* exception) +{ + Zig__GlobalObject__reportUncaughtException(globalObject, exception); } -void GlobalObject::promiseRejectionTracker(JSGlobalObject *obj, JSC::JSPromise *prom, - JSC::JSPromiseRejectionOperation reject) { - Zig__GlobalObject__promiseRejectionTracker( - obj, prom, reject == JSC::JSPromiseRejectionOperation::Reject ? 0 : 1); +void GlobalObject::promiseRejectionTracker(JSGlobalObject* obj, JSC::JSPromise* prom, + JSC::JSPromiseRejectionOperation reject) +{ + Zig__GlobalObject__promiseRejectionTracker( + obj, prom, reject == JSC::JSPromiseRejectionOperation::Reject ? 0 : 1); } -static Zig::ConsoleClient *m_console; +static Zig::ConsoleClient* m_console; -void GlobalObject::setConsole(void *console) { - m_console = new Zig::ConsoleClient(console); - this->setConsoleClient(m_console); +void GlobalObject::setConsole(void* console) +{ + m_console = new Zig::ConsoleClient(console); + this->setConsoleClient(m_console); } #pragma mark - Globals @@ -268,391 +276,404 @@ static JSC_DECLARE_CUSTOM_SETTER(property_lazyProcessSetter); static JSC_DECLARE_CUSTOM_GETTER(property_lazyProcessGetter); JSC_DEFINE_CUSTOM_SETTER(property_lazyProcessSetter, - (JSC::JSGlobalObject * globalObject, JSC::EncodedJSValue thisValue, - JSC::EncodedJSValue value, JSC::PropertyName)) { - return false; + (JSC::JSGlobalObject * globalObject, JSC::EncodedJSValue thisValue, + JSC::EncodedJSValue value, JSC::PropertyName)) +{ + return false; } static JSClassRef dot_env_class_ref; JSC_DEFINE_CUSTOM_GETTER(property_lazyProcessGetter, - (JSC::JSGlobalObject * _globalObject, JSC::EncodedJSValue thisValue, - JSC::PropertyName)) { - Zig::GlobalObject *globalObject = reinterpret_cast<Zig::GlobalObject *>(_globalObject); - if (LIKELY(globalObject->m_process)) - return JSValue::encode(JSC::JSValue(globalObject->m_process)); + (JSC::JSGlobalObject * _globalObject, JSC::EncodedJSValue thisValue, + JSC::PropertyName)) +{ + Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(_globalObject); + if (LIKELY(globalObject->m_process)) + return JSValue::encode(JSC::JSValue(globalObject->m_process)); - JSC::VM &vm = globalObject->vm(); + JSC::VM& vm = globalObject->vm(); - globalObject->m_process = Zig::Process::create( - vm, Zig::Process::createStructure(vm, globalObject, globalObject->objectPrototype())); + globalObject->m_process = Zig::Process::create( + vm, Zig::Process::createStructure(vm, globalObject, globalObject->objectPrototype())); - { - auto jsClass = dot_env_class_ref; + { + auto jsClass = dot_env_class_ref; - JSC::JSCallbackObject<JSNonFinalObject> *object = - JSC::JSCallbackObject<JSNonFinalObject>::create( - globalObject, globalObject->callbackObjectStructure(), jsClass, nullptr); - if (JSObject *prototype = jsClass->prototype(globalObject)) - object->setPrototypeDirect(vm, prototype); + JSC::JSCallbackObject<JSNonFinalObject>* object = JSC::JSCallbackObject<JSNonFinalObject>::create( + globalObject, globalObject->callbackObjectStructure(), jsClass, nullptr); + if (JSObject* prototype = jsClass->prototype(globalObject)) + object->setPrototypeDirect(vm, prototype); - globalObject->m_process->putDirect(vm, JSC::Identifier::fromString(vm, "env"), - JSC::JSValue(object), - JSC::PropertyAttribute::DontDelete | 0); - } + globalObject->m_process->putDirect(vm, JSC::Identifier::fromString(vm, "env"), + JSC::JSValue(object), + JSC::PropertyAttribute::DontDelete | 0); + } - return JSC::JSValue::encode(JSC::JSValue(globalObject->m_process)); + return JSC::JSValue::encode(JSC::JSValue(globalObject->m_process)); } static JSC_DECLARE_HOST_FUNCTION(functionQueueMicrotask); static JSC_DEFINE_HOST_FUNCTION(functionQueueMicrotask, - (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - - if (callFrame->argumentCount() == 0) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "queueMicrotask requires 1 argument (a function)"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } + (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + + if (callFrame->argumentCount() == 0) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "queueMicrotask requires 1 argument (a function)"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } - JSC::JSValue job = callFrame->argument(0); + JSC::JSValue job = callFrame->argument(0); - if (!job.isObject() || !job.getObject()->isCallable(vm)) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "queueMicrotask expects a function"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } + if (!job.isObject() || !job.getObject()->isCallable(vm)) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "queueMicrotask expects a function"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } - // This is a JSC builtin function - globalObject->queueMicrotask(JSC::createJSMicrotask(vm, job, JSC::JSValue{}, JSC::JSValue{}, - JSC::JSValue{}, JSC::JSValue{})); + // This is a JSC builtin function + globalObject->queueMicrotask(JSC::createJSMicrotask(vm, job, JSC::JSValue {}, JSC::JSValue {}, + JSC::JSValue {}, JSC::JSValue {})); - return JSC::JSValue::encode(JSC::jsUndefined()); + return JSC::JSValue::encode(JSC::jsUndefined()); } static JSC_DECLARE_HOST_FUNCTION(functionSetTimeout); static JSC_DEFINE_HOST_FUNCTION(functionSetTimeout, - (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - - if (callFrame->argumentCount() == 0) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "setTimeout requires 1 argument (a function)"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } - - JSC::JSValue job = callFrame->argument(0); - - if (!job.isObject() || !job.getObject()->isCallable(vm)) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "setTimeout expects a function"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } - - if (callFrame->argumentCount() == 1) { - globalObject->queueMicrotask(JSC::createJSMicrotask(vm, job, JSC::JSValue{}, JSC::JSValue{}, - JSC::JSValue{}, JSC::JSValue{})); - return JSC::JSValue::encode(JSC::jsNumber(Bun__Timer__getNextID())); - } - - JSC::JSValue num = callFrame->argument(1); - return Bun__Timer__setTimeout(globalObject, JSC::JSValue::encode(job), JSC::JSValue::encode(num)); + (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + + if (callFrame->argumentCount() == 0) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "setTimeout requires 1 argument (a function)"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } + + JSC::JSValue job = callFrame->argument(0); + + if (!job.isObject() || !job.getObject()->isCallable(vm)) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "setTimeout expects a function"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } + + if (callFrame->argumentCount() == 1) { + globalObject->queueMicrotask(JSC::createJSMicrotask(vm, job, JSC::JSValue {}, JSC::JSValue {}, + JSC::JSValue {}, JSC::JSValue {})); + return JSC::JSValue::encode(JSC::jsNumber(Bun__Timer__getNextID())); + } + + JSC::JSValue num = callFrame->argument(1); + return Bun__Timer__setTimeout(globalObject, JSC::JSValue::encode(job), JSC::JSValue::encode(num)); } static JSC_DECLARE_HOST_FUNCTION(functionSetInterval); static JSC_DEFINE_HOST_FUNCTION(functionSetInterval, - (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - - if (callFrame->argumentCount() == 0) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "setInterval requires 2 arguments (a function)"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } - - JSC::JSValue job = callFrame->argument(0); - - if (!job.isObject() || !job.getObject()->isCallable(vm)) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "setInterval expects a function"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } - - JSC::JSValue num = callFrame->argument(1); - return Bun__Timer__setInterval(globalObject, JSC::JSValue::encode(job), - JSC::JSValue::encode(num)); + (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + + if (callFrame->argumentCount() == 0) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "setInterval requires 2 arguments (a function)"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } + + JSC::JSValue job = callFrame->argument(0); + + if (!job.isObject() || !job.getObject()->isCallable(vm)) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "setInterval expects a function"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } + + JSC::JSValue num = callFrame->argument(1); + return Bun__Timer__setInterval(globalObject, JSC::JSValue::encode(job), + JSC::JSValue::encode(num)); } static JSC_DECLARE_HOST_FUNCTION(functionClearInterval); static JSC_DEFINE_HOST_FUNCTION(functionClearInterval, - (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - - if (callFrame->argumentCount() == 0) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "clearInterval requires 1 argument (a number)"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } + (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + + if (callFrame->argumentCount() == 0) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "clearInterval requires 1 argument (a number)"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } - JSC::JSValue num = callFrame->argument(0); + JSC::JSValue num = callFrame->argument(0); - return Bun__Timer__clearInterval(globalObject, JSC::JSValue::encode(num)); + return Bun__Timer__clearInterval(globalObject, JSC::JSValue::encode(num)); } static JSC_DECLARE_HOST_FUNCTION(functionClearTimeout); static JSC_DEFINE_HOST_FUNCTION(functionClearTimeout, - (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - - if (callFrame->argumentCount() == 0) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, "clearTimeout requires 1 argument (a number)"_s); - return JSC::JSValue::encode(JSC::JSValue{}); - } + (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + + if (callFrame->argumentCount() == 0) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, "clearTimeout requires 1 argument (a number)"_s); + return JSC::JSValue::encode(JSC::JSValue {}); + } - JSC::JSValue num = callFrame->argument(0); + JSC::JSValue num = callFrame->argument(0); - return Bun__Timer__clearTimeout(globalObject, JSC::JSValue::encode(num)); + return Bun__Timer__clearTimeout(globalObject, JSC::JSValue::encode(num)); } // This is not a publicly exposed API currently. // This is used by the bundler to make Response, Request, FetchEvent, // and any other objects available globally. -void GlobalObject::installAPIGlobals(JSClassRef *globals, int count) { - WTF::Vector<GlobalPropertyInfo> extraStaticGlobals; - extraStaticGlobals.reserveCapacity((size_t)count + 3 + 4); +void GlobalObject::installAPIGlobals(JSClassRef* globals, int count) +{ + WTF::Vector<GlobalPropertyInfo> extraStaticGlobals; + extraStaticGlobals.reserveCapacity((size_t)count + 3 + 4); + + int i = 0; + for (; i < count - 1; i++) { + auto jsClass = globals[i]; + + JSC::JSCallbackObject<JSNonFinalObject>* object = JSC::JSCallbackObject<JSNonFinalObject>::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 }); + } + + // The last one must be "process.env" + // Runtime-support is for if they change + dot_env_class_ref = globals[i]; - int i = 0; - for (; i < count - 1; i++) { - auto jsClass = globals[i]; + // // The last one must be "process.env" + // // Runtime-support is for if they change + // { + // auto jsClass = globals[i]; - JSC::JSCallbackObject<JSNonFinalObject> *object = - JSC::JSCallbackObject<JSNonFinalObject>::create(this, this->callbackObjectStructure(), - jsClass, nullptr); - if (JSObject *prototype = jsClass->prototype(this)) object->setPrototypeDirect(vm(), prototype); + // JSC::JSCallbackObject<JSNonFinalObject> *object = + // JSC::JSCallbackObject<JSNonFinalObject>::create(this, this->callbackObjectStructure(), + // jsClass, nullptr); + // if (JSObject *prototype = jsClass->prototype(this)) object->setPrototypeDirect(vm(), + // prototype); + + // process->putDirect(this->vm(), JSC::Identifier::fromString(this->vm(), "env"), + // JSC::JSValue(object), JSC::PropertyAttribute::DontDelete | 0); + // } + JSC::Identifier queueMicrotaskIdentifier = JSC::Identifier::fromString(vm(), "queueMicrotask"_s); extraStaticGlobals.uncheckedAppend( - GlobalPropertyInfo{JSC::Identifier::fromString(vm(), jsClass->className()), - JSC::JSValue(object), JSC::PropertyAttribute::DontDelete | 0}); - } - - // The last one must be "process.env" - // Runtime-support is for if they change - dot_env_class_ref = globals[i]; - - // // The last one must be "process.env" - // // Runtime-support is for if they change - // { - // auto jsClass = globals[i]; - - // JSC::JSCallbackObject<JSNonFinalObject> *object = - // JSC::JSCallbackObject<JSNonFinalObject>::create(this, this->callbackObjectStructure(), - // jsClass, nullptr); - // if (JSObject *prototype = jsClass->prototype(this)) object->setPrototypeDirect(vm(), - // prototype); - - // process->putDirect(this->vm(), JSC::Identifier::fromString(this->vm(), "env"), - // JSC::JSValue(object), JSC::PropertyAttribute::DontDelete | 0); - // } - - JSC::Identifier queueMicrotaskIdentifier = JSC::Identifier::fromString(vm(), "queueMicrotask"_s); - extraStaticGlobals.uncheckedAppend( - GlobalPropertyInfo{queueMicrotaskIdentifier, - JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject *>(this), 0, - "queueMicrotask", functionQueueMicrotask), - JSC::PropertyAttribute::DontDelete | 0}); - - JSC::Identifier setTimeoutIdentifier = JSC::Identifier::fromString(vm(), "setTimeout"_s); - extraStaticGlobals.uncheckedAppend( - GlobalPropertyInfo{setTimeoutIdentifier, - JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject *>(this), 0, - "setTimeout", functionQueueMicrotask), - JSC::PropertyAttribute::DontDelete | 0}); - - JSC::Identifier clearTimeoutIdentifier = JSC::Identifier::fromString(vm(), "clearTimeout"_s); - extraStaticGlobals.uncheckedAppend( - GlobalPropertyInfo{clearTimeoutIdentifier, - JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject *>(this), 0, - "clearTimeout", functionQueueMicrotask), - JSC::PropertyAttribute::DontDelete | 0}); - - JSC::Identifier setIntervalIdentifier = JSC::Identifier::fromString(vm(), "setInterval"_s); - extraStaticGlobals.uncheckedAppend( - GlobalPropertyInfo{setIntervalIdentifier, - JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject *>(this), 0, - "setInterval", functionQueueMicrotask), - JSC::PropertyAttribute::DontDelete | 0}); - - JSC::Identifier clearIntervalIdentifier = JSC::Identifier::fromString(vm(), "clearInterval"_s); - extraStaticGlobals.uncheckedAppend( - GlobalPropertyInfo{clearIntervalIdentifier, - JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject *>(this), 0, - "clearInterval", functionQueueMicrotask), - JSC::PropertyAttribute::DontDelete | 0}); - - auto clientData = Bun::clientData(vm()); - - this->addStaticGlobals(extraStaticGlobals.data(), extraStaticGlobals.size()); - putDirectCustomAccessor( - vm(), clientData->builtinNames().processPublicName(), - JSC::CustomGetterSetter::create(vm(), property_lazyProcessGetter, property_lazyProcessSetter), - JSC::PropertyAttribute::CustomValue | 0); - - extraStaticGlobals.releaseBuffer(); -} + GlobalPropertyInfo { queueMicrotaskIdentifier, + JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject*>(this), 0, + "queueMicrotask", functionQueueMicrotask), + JSC::PropertyAttribute::DontDelete | 0 }); + + JSC::Identifier setTimeoutIdentifier = JSC::Identifier::fromString(vm(), "setTimeout"_s); + extraStaticGlobals.uncheckedAppend( + GlobalPropertyInfo { setTimeoutIdentifier, + JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject*>(this), 0, + "setTimeout", functionQueueMicrotask), + JSC::PropertyAttribute::DontDelete | 0 }); -JSC::Identifier GlobalObject::moduleLoaderResolve(JSGlobalObject *globalObject, - JSModuleLoader *loader, JSValue key, - JSValue referrer, JSValue origin) { - ErrorableZigString res; - res.success = false; - ZigString keyZ = toZigString(key, globalObject); - ZigString referrerZ = referrer.isString() ? toZigString(referrer, globalObject) : ZigStringEmpty; - Zig__GlobalObject__resolve(&res, globalObject, &keyZ, &referrerZ); - - if (res.success) { - return toIdentifier(res.result.value, globalObject); - } else { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - throwException(scope, res.result.err, globalObject); - return globalObject->vm().propertyNames->emptyIdentifier; - } + JSC::Identifier clearTimeoutIdentifier = JSC::Identifier::fromString(vm(), "clearTimeout"_s); + extraStaticGlobals.uncheckedAppend( + GlobalPropertyInfo { clearTimeoutIdentifier, + JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject*>(this), 0, + "clearTimeout", functionQueueMicrotask), + JSC::PropertyAttribute::DontDelete | 0 }); + + JSC::Identifier setIntervalIdentifier = JSC::Identifier::fromString(vm(), "setInterval"_s); + extraStaticGlobals.uncheckedAppend( + GlobalPropertyInfo { setIntervalIdentifier, + JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject*>(this), 0, + "setInterval", functionQueueMicrotask), + JSC::PropertyAttribute::DontDelete | 0 }); + + JSC::Identifier clearIntervalIdentifier = JSC::Identifier::fromString(vm(), "clearInterval"_s); + extraStaticGlobals.uncheckedAppend( + GlobalPropertyInfo { clearIntervalIdentifier, + JSC::JSFunction::create(vm(), JSC::jsCast<JSC::JSGlobalObject*>(this), 0, + "clearInterval", functionQueueMicrotask), + JSC::PropertyAttribute::DontDelete | 0 }); + + auto clientData = Bun::clientData(vm()); + + this->addStaticGlobals(extraStaticGlobals.data(), extraStaticGlobals.size()); + putDirectCustomAccessor( + vm(), clientData->builtinNames().processPublicName(), + JSC::CustomGetterSetter::create(vm(), property_lazyProcessGetter, property_lazyProcessSetter), + JSC::PropertyAttribute::CustomValue | 0); + + extraStaticGlobals.releaseBuffer(); } -JSC::JSInternalPromise *GlobalObject::moduleLoaderImportModule(JSGlobalObject *globalObject, - JSModuleLoader *, - JSString *moduleNameValue, - JSValue parameters, - const SourceOrigin &sourceOrigin) { - JSC::VM &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - - auto *promise = JSC::JSInternalPromise::create(vm, globalObject->internalPromiseStructure()); - RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); - - auto sourceURL = sourceOrigin.url(); - ErrorableZigString resolved; - auto moduleNameZ = toZigString(moduleNameValue, globalObject); - auto sourceOriginZ = sourceURL.isEmpty() ? ZigStringCwd : toZigString(sourceURL.fileSystemPath()); - resolved.success = false; - Zig__GlobalObject__resolve(&resolved, globalObject, &moduleNameZ, &sourceOriginZ); - if (!resolved.success) { - throwException(scope, resolved.result.err, globalObject); - return promise->rejectWithCaughtException(globalObject, scope); - } - - auto result = JSC::importModule(globalObject, toIdentifier(resolved.result.value, globalObject), - parameters, JSC::jsUndefined()); - RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); - - return result; +JSC::Identifier GlobalObject::moduleLoaderResolve(JSGlobalObject* globalObject, + JSModuleLoader* loader, JSValue key, + JSValue referrer, JSValue origin) +{ + ErrorableZigString res; + res.success = false; + ZigString keyZ = toZigString(key, globalObject); + ZigString referrerZ = referrer.isString() ? toZigString(referrer, globalObject) : ZigStringEmpty; + Zig__GlobalObject__resolve(&res, globalObject, &keyZ, &referrerZ); + + if (res.success) { + return toIdentifier(res.result.value, globalObject); + } else { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + throwException(scope, res.result.err, globalObject); + return globalObject->vm().propertyNames->emptyIdentifier; + } } -JSC::JSInternalPromise *GlobalObject::moduleLoaderFetch(JSGlobalObject *globalObject, - JSModuleLoader *loader, JSValue key, - JSValue value1, JSValue value2) { - JSC::VM &vm = globalObject->vm(); - JSC::JSInternalPromise *promise = - JSC::JSInternalPromise::create(vm, globalObject->internalPromiseStructure()); +JSC::JSInternalPromise* GlobalObject::moduleLoaderImportModule(JSGlobalObject* globalObject, + JSModuleLoader*, + JSString* moduleNameValue, + JSValue parameters, + const SourceOrigin& sourceOrigin) +{ + JSC::VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); - auto scope = DECLARE_THROW_SCOPE(vm); + auto* promise = JSC::JSInternalPromise::create(vm, globalObject->internalPromiseStructure()); + RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); - auto rejectWithError = [&](JSC::JSValue error) { - promise->reject(globalObject, error); - return promise; - }; + auto sourceURL = sourceOrigin.url(); + ErrorableZigString resolved; + auto moduleNameZ = toZigString(moduleNameValue, globalObject); + auto sourceOriginZ = sourceURL.isEmpty() ? ZigStringCwd : toZigString(sourceURL.fileSystemPath()); + resolved.success = false; + Zig__GlobalObject__resolve(&resolved, globalObject, &moduleNameZ, &sourceOriginZ); + if (!resolved.success) { + throwException(scope, resolved.result.err, globalObject); + return promise->rejectWithCaughtException(globalObject, scope); + } - auto moduleKey = key.toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); - auto moduleKeyZig = toZigString(moduleKey); - auto source = Zig::toZigString(value1, globalObject); - ErrorableResolvedSource res; - res.success = false; - res.result.err.code = 0; - res.result.err.ptr = nullptr; + auto result = JSC::importModule(globalObject, toIdentifier(resolved.result.value, globalObject), + parameters, JSC::jsUndefined()); + RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); + + return result; +} - Zig__GlobalObject__fetch(&res, globalObject, &moduleKeyZig, &source); +JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalObject, + JSModuleLoader* loader, JSValue key, + JSValue value1, JSValue value2) +{ + JSC::VM& vm = globalObject->vm(); + JSC::JSInternalPromise* promise = JSC::JSInternalPromise::create(vm, globalObject->internalPromiseStructure()); - if (!res.success) { - throwException(scope, res.result.err, globalObject); + auto scope = DECLARE_THROW_SCOPE(vm); + + auto rejectWithError = [&](JSC::JSValue error) { + promise->reject(globalObject, error); + return promise; + }; + + auto moduleKey = key.toWTFString(globalObject); RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); - } + auto moduleKeyZig = toZigString(moduleKey); + auto source = Zig::toZigString(value1, globalObject); + ErrorableResolvedSource res; + res.success = false; + res.result.err.code = 0; + res.result.err.ptr = nullptr; + + Zig__GlobalObject__fetch(&res, globalObject, &moduleKeyZig, &source); + + if (!res.success) { + throwException(scope, res.result.err, globalObject); + RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope)); + } - auto provider = Zig::SourceProvider::create(res.result.value); + auto provider = Zig::SourceProvider::create(res.result.value); - auto jsSourceCode = JSC::JSSourceCode::create(vm, JSC::SourceCode(provider)); + auto jsSourceCode = JSC::JSSourceCode::create(vm, JSC::SourceCode(provider)); - if (provider.ptr()->isBytecodeCacheEnabled()) { - provider.ptr()->readOrGenerateByteCodeCache(vm, jsSourceCode->sourceCode()); - } + if (provider.ptr()->isBytecodeCacheEnabled()) { + provider.ptr()->readOrGenerateByteCodeCache(vm, jsSourceCode->sourceCode()); + } - scope.release(); + scope.release(); - promise->resolve(globalObject, jsSourceCode); - globalObject->vm().drainMicrotasks(); - return promise; + promise->resolve(globalObject, jsSourceCode); + globalObject->vm().drainMicrotasks(); + return promise; } -JSC::JSObject *GlobalObject::moduleLoaderCreateImportMetaProperties(JSGlobalObject *globalObject, - JSModuleLoader *loader, - JSValue key, - JSModuleRecord *record, - JSValue val) { - - JSC::VM &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - - JSC::JSObject *metaProperties = - JSC::constructEmptyObject(vm, globalObject->nullPrototypeObjectStructure()); - RETURN_IF_EXCEPTION(scope, nullptr); - - auto clientData = Bun::clientData(vm); - JSString *keyString = key.toStringOrNull(globalObject); - if (UNLIKELY(!keyString)) { return metaProperties; } - auto view = keyString->value(globalObject); - auto index = view.reverseFind('/', view.length()); - if (index != WTF::notFound) { - metaProperties->putDirect(vm, clientData->builtinNames().dirPublicName(), - JSC::jsSubstring(globalObject, keyString, 0, index)); - metaProperties->putDirect( - vm, clientData->builtinNames().filePublicName(), - JSC::jsSubstring(globalObject, keyString, index + 1, keyString->length() - index - 1)); - } - - metaProperties->putDirect(vm, clientData->builtinNames().pathPublicName(), key); - - RETURN_IF_EXCEPTION(scope, nullptr); - - // metaProperties->putDirect(vm, Identifier::fromString(vm, "resolve"), - // globalObject->globalThis() - // ->get(vm, Identifier::fromString("Bun")) - // .getObject() - // ->get(vm, Identifier::fromString("resolve"))); ); - // RETURN_IF_EXCEPTION(scope, nullptr); - - return metaProperties; +JSC::JSObject* GlobalObject::moduleLoaderCreateImportMetaProperties(JSGlobalObject* globalObject, + JSModuleLoader* loader, + JSValue key, + JSModuleRecord* record, + JSValue val) +{ + + JSC::VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + JSC::JSObject* metaProperties = JSC::constructEmptyObject(vm, globalObject->nullPrototypeObjectStructure()); + RETURN_IF_EXCEPTION(scope, nullptr); + + auto clientData = Bun::clientData(vm); + JSString* keyString = key.toStringOrNull(globalObject); + if (UNLIKELY(!keyString)) { + return metaProperties; + } + auto view = keyString->value(globalObject); + auto index = view.reverseFind('/', view.length()); + if (index != WTF::notFound) { + metaProperties->putDirect(vm, clientData->builtinNames().dirPublicName(), + JSC::jsSubstring(globalObject, keyString, 0, index)); + metaProperties->putDirect( + vm, clientData->builtinNames().filePublicName(), + JSC::jsSubstring(globalObject, keyString, index + 1, keyString->length() - index - 1)); + } + + metaProperties->putDirect(vm, clientData->builtinNames().pathPublicName(), key); + + RETURN_IF_EXCEPTION(scope, nullptr); + + // metaProperties->putDirect(vm, Identifier::fromString(vm, "resolve"), + // globalObject->globalThis() + // ->get(vm, Identifier::fromString("Bun")) + // .getObject() + // ->get(vm, Identifier::fromString("resolve"))); ); + // RETURN_IF_EXCEPTION(scope, nullptr); + + return metaProperties; } -JSC::JSValue GlobalObject::moduleLoaderEvaluate(JSGlobalObject *globalObject, - JSModuleLoader *moduleLoader, JSValue key, - JSValue moduleRecordValue, JSValue scriptFetcher, - JSValue sentValue, JSValue resumeMode) { +JSC::JSValue GlobalObject::moduleLoaderEvaluate(JSGlobalObject* globalObject, + JSModuleLoader* moduleLoader, JSValue key, + JSValue moduleRecordValue, JSValue scriptFetcher, + JSValue sentValue, JSValue resumeMode) +{ - JSC::JSValue result = moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, - scriptFetcher, sentValue, resumeMode); + JSC::JSValue result = moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, + scriptFetcher, sentValue, resumeMode); - return result; + return result; } -void GlobalObject::queueMicrotaskToEventLoop(JSC::JSGlobalObject &global, - Ref<JSC::Microtask> &&task) { +void GlobalObject::queueMicrotaskToEventLoop(JSC::JSGlobalObject& global, + Ref<JSC::Microtask>&& task) +{ - Zig__GlobalObject__queueMicrotaskToEventLoop( - &global, &JSMicrotaskCallback::create(global, WTFMove(task)).leakRef()); + Zig__GlobalObject__queueMicrotaskToEventLoop( + &global, &JSMicrotaskCallback::create(global, WTFMove(task)).leakRef()); } } // namespace Zig
\ No newline at end of file |