aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ZigGlobalObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp252
1 files changed, 44 insertions, 208 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index 888bf8f6b..2753707e8 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -103,6 +103,7 @@
#include "JSSQLStatement.h"
#include "ReadableStreamBuiltins.h"
#include "BunJSCModule.h"
+#include "ModuleLoader.h"
#include "ZigGeneratedClasses.h"
@@ -160,13 +161,6 @@ using JSBuffer = WebCore::JSBuffer;
#include "DOMJITHelpers.h"
#include <JavaScriptCore/DFGAbstractHeap.h>
-#include "../modules/BufferModule.h"
-#include "../modules/EventsModule.h"
-#include "../modules/ProcessModule.h"
-#include "../modules/StringDecoderModule.h"
-#include "../modules/ObjectModule.h"
-#include "../modules/NodeModuleModule.h"
-
// #include <iostream>
static bool has_loaded_jsc = false;
@@ -1022,6 +1016,7 @@ JSC:
static NeverDestroyed<const String> bunJSCString(MAKE_STATIC_STRING_IMPL("bun:jsc"));
static NeverDestroyed<const String> bunStreamString(MAKE_STATIC_STRING_IMPL("bun:stream"));
static NeverDestroyed<const String> noopString(MAKE_STATIC_STRING_IMPL("noop"));
+ static NeverDestroyed<const String> createImportMeta(MAKE_STATIC_STRING_IMPL("createImportMeta"));
JSC::JSValue moduleName = callFrame->argument(0);
if (moduleName.isNumber()) {
@@ -1081,6 +1076,11 @@ JSC:
return JSValue::encode(obj);
}
+ if (string == createImportMeta) {
+ Zig::ImportMetaObject* obj = Zig::ImportMetaObject::create(globalObject, callFrame->argument(1));
+ return JSValue::encode(obj);
+ }
+
if (UNLIKELY(string == noopString)) {
auto* obj = constructEmptyObject(globalObject);
obj->putDirectCustomAccessor(vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "getterSetter"_s)), JSC::CustomGetterSetter::create(vm, noop_getter, noop_setter), 0);
@@ -1884,6 +1884,11 @@ void GlobalObject::finishCreation(VM& vm)
init.set(JSModuleNamespaceObject::createStructure(init.vm, init.owner, init.owner->objectPrototype()));
});
+ this->m_pendingVirtualModuleResultStructure.initLater(
+ [](const Initializer<Structure>& init) {
+ init.set(Bun::PendingVirtualModuleResult::createStructure(init.vm, init.owner, init.owner->objectPrototype()));
+ });
+
this->initGeneratedLazyClasses();
m_NapiClassStructure.initLater(
@@ -2655,87 +2660,27 @@ static JSC_DEFINE_HOST_FUNCTION(functionFulfillModuleSync,
res.result.err.code = 0;
res.result.err.ptr = nullptr;
- Zig__GlobalObject__fetch(&res, globalObject, &specifier, &specifier);
+ JSValue result = Bun::fetchSourceCodeSync(
+ reinterpret_cast<Zig::GlobalObject*>(globalObject),
+ &res,
+ &specifier,
+ &specifier);
- if (!res.success) {
- throwException(scope, res.result.err, globalObject);
- return JSValue::encode(JSC::jsUndefined());
+ if (result.isUndefined() || !result) {
+ return JSValue::encode(result);
}
- switch (res.result.value.tag) {
- case SyntheticModuleType::Buffer: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(
- generateBufferSourceCode,
- JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath("node:buffer"_s)), WTFMove(moduleKey)));
-
- globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- case SyntheticModuleType::ObjectModule: {
- JSC::EncodedJSValue encodedValue = reinterpret_cast<JSC::EncodedJSValue>(
- bitwise_cast<int64_t>(reinterpret_cast<size_t>(res.result.value.source_code.ptr)));
- JSC::JSObject* object = JSC::JSValue::decode(encodedValue).getObject();
- auto function = generateObjectModuleSourceCode(
- globalObject,
- object);
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(WTFMove(function),
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- case SyntheticModuleType::Process: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(
- generateProcessSourceCode,
- JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath("node:process"_s)), WTFMove(moduleKey)));
-
- globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- case SyntheticModuleType::Events: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(
- generateEventsSourceCode,
- JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath("node:events"_s)), WTFMove(moduleKey)));
-
- globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- case SyntheticModuleType::Module: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(
- generateNodeModuleModule,
- JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath("node:module"_s)), WTFMove(moduleKey)));
-
- globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- case SyntheticModuleType::StringDecoder: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(
- generateStringDecoderSourceCode,
- JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath("node:string_decoder"_s)), WTFMove(moduleKey)));
-
- globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- default: {
- auto provider = Zig::SourceProvider::create(res.result.value);
- globalObject->moduleLoader()->provideFetch(globalObject, key, JSC::SourceCode(provider));
- RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
- RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
- }
- }
+ globalObject->moduleLoader()->provideFetch(globalObject, key, jsCast<JSC::JSSourceCode*>(result)->sourceCode());
+ RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
+}
+
+static JSC::JSInternalPromise* rejectedInternalPromise(JSC::JSGlobalObject* globalObject, JSC::JSValue value)
+{
+ JSC::VM& vm = globalObject->vm();
+ JSInternalPromise* promise = JSInternalPromise::create(vm, globalObject->internalPromiseStructure());
+ promise->internalField(JSC::JSPromise::Field::ReactionsOrResult).set(vm, promise, value);
+ promise->internalField(JSC::JSPromise::Field::Flags).set(vm, promise, jsNumber(promise->internalField(JSC::JSPromise::Field::Flags).get().asUInt32AsAnyInt() | JSC::JSPromise::isFirstResolvingFunctionCalledFlag | static_cast<unsigned>(JSC::JSPromise::Status::Rejected)));
+ return promise;
}
JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalObject,
@@ -2743,20 +2688,15 @@ JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalOb
JSValue value1, JSValue value2)
{
JSC::VM& vm = globalObject->vm();
- JSC::JSInternalPromise* promise = JSC::JSInternalPromise::create(vm, globalObject->internalPromiseStructure());
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));
+ if (UNLIKELY(scope.exception()))
+ return rejectedInternalPromise(globalObject, scope.exception()->value());
if (moduleKey.endsWith(".node"_s)) {
- return rejectWithError(createTypeError(globalObject, "To load Node-API modules, use require() or process.dlopen instead of import."_s));
+ return rejectedInternalPromise(globalObject, createTypeError(globalObject, "To load Node-API modules, use require() or process.dlopen instead of import."_s));
}
auto moduleKeyZig = toZigString(moduleKey);
@@ -2766,123 +2706,19 @@ JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalOb
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));
- }
-
- switch (res.result.value.tag) {
- case 1: {
- auto buffer = Vector<uint8_t>(res.result.value.source_code.ptr, res.result.value.source_code.len);
- auto source = JSC::SourceCode(
- JSC::WebAssemblySourceProvider::create(WTFMove(buffer),
- JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath(Zig::toString(res.result.value.source_url))),
- WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
-
- promise->resolve(globalObject, sourceCode);
- scope.release();
-
- globalObject->vm().drainMicrotasks();
- return promise;
- }
- case SyntheticModuleType::ObjectModule: {
- JSC::EncodedJSValue encodedValue = reinterpret_cast<JSC::EncodedJSValue>(
- bitwise_cast<int64_t>(reinterpret_cast<size_t>(res.result.value.source_code.ptr)));
- JSC::JSObject* object = JSC::JSValue::decode(encodedValue).getObject();
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(generateObjectModuleSourceCode(
- globalObject,
- object),
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
+ JSValue result = Bun::fetchSourceCodeAsync(
+ reinterpret_cast<Zig::GlobalObject*>(globalObject),
+ &res,
+ &moduleKeyZig,
+ &source);
- promise->resolve(globalObject, sourceCode);
- scope.release();
- return promise;
- }
- case SyntheticModuleType::Module: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(generateNodeModuleModule,
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
-
- promise->resolve(globalObject, sourceCode);
- scope.release();
- return promise;
- }
-
- case SyntheticModuleType::Buffer: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(generateBufferSourceCode,
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
-
- promise->resolve(globalObject, sourceCode);
- scope.release();
- return promise;
- }
- case SyntheticModuleType::Process: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(generateProcessSourceCode,
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
-
- promise->resolve(globalObject, sourceCode);
- scope.release();
- return promise;
- }
- case SyntheticModuleType::Events: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(generateEventsSourceCode,
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
-
- promise->resolve(globalObject, sourceCode);
- scope.release();
- return promise;
- }
- case SyntheticModuleType::StringDecoder: {
- auto source = JSC::SourceCode(
- JSC::SyntheticSourceProvider::create(generateStringDecoderSourceCode,
- JSC::SourceOrigin(), WTFMove(moduleKey)));
-
- auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
- RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
-
- promise->resolve(globalObject, sourceCode);
- scope.release();
- return promise;
- }
- default: {
- auto provider = Zig::SourceProvider::create(res.result.value);
- auto jsSourceCode = JSC::JSSourceCode::create(vm, JSC::SourceCode(provider));
- promise->resolve(globalObject, jsSourceCode);
- }
+ if (auto* internalPromise = JSC::jsDynamicCast<JSC::JSInternalPromise*>(result)) {
+ return internalPromise;
+ } else if (auto* promise = JSC::jsDynamicCast<JSC::JSPromise*>(result)) {
+ return jsCast<JSC::JSInternalPromise*>(promise);
+ } else {
+ return rejectedInternalPromise(globalObject, result);
}
-
- // if (provider.ptr()->isBytecodeCacheEnabled()) {
- // provider.ptr()->readOrGenerateByteCodeCache(vm, jsSourceCode->sourceCode());
- // }
-
- scope.release();
-
- globalObject->vm().drainMicrotasks();
- return promise;
}
JSC::JSObject* GlobalObject::moduleLoaderCreateImportMetaProperties(JSGlobalObject* globalObject,