diff options
Diffstat (limited to 'src/bun.js/bindings/ModuleLoader.cpp')
-rw-r--r-- | src/bun.js/bindings/ModuleLoader.cpp | 214 |
1 files changed, 91 insertions, 123 deletions
diff --git a/src/bun.js/bindings/ModuleLoader.cpp b/src/bun.js/bindings/ModuleLoader.cpp index 20c2be2a2..2e4dfa88e 100644 --- a/src/bun.js/bindings/ModuleLoader.cpp +++ b/src/bun.js/bindings/ModuleLoader.cpp @@ -27,15 +27,6 @@ #include "EventEmitter.h" #include "JSEventEmitter.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 "../modules/TTYModule.h" -#include "../modules/ConstantsModule.h" -#include "node_util_types.h" #include "CommonJSModuleRecord.h" #include <JavaScriptCore/JSModuleLoader.h> #include <JavaScriptCore/Completion.h> @@ -43,7 +34,13 @@ #include <JavaScriptCore/JSMap.h> #include <JavaScriptCore/JSMapInlines.h> +#include "../modules/_NativeModule.h" +#include "../../js/out/NativeModuleImpl.h" + +#include "../modules/ObjectModule.h" + namespace Bun { +using namespace JSC; using namespace Zig; using namespace WebCore; @@ -67,7 +64,38 @@ static JSC::JSInternalPromise* resolvedInternalPromise(JSC::JSGlobalObject* glob return promise; } -using namespace JSC; +// Converts an object from InternalModuleRegistry into { ...obj, default: obj } +JSC::SyntheticSourceProvider::SyntheticSourceGenerator +generateInternalModuleSourceCode(JSC::JSGlobalObject* globalObject, JSC::JSObject* object) +{ + return [object](JSC::JSGlobalObject* lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector<JSC::Identifier, 4>& exportNames, + JSC::MarkedArgumentBuffer& exportValues) -> void { + JSC::VM& vm = lexicalGlobalObject->vm(); + GlobalObject* globalObject = reinterpret_cast<GlobalObject*>(lexicalGlobalObject); + JSC::EnsureStillAliveScope stillAlive(object); + + auto throwScope = DECLARE_THROW_SCOPE(vm); + + PropertyNameArray properties(vm, PropertyNameMode::Strings, PrivateSymbolMode::Exclude); + object->getPropertyNames(globalObject, properties, DontEnumPropertiesMode::Exclude); + + RETURN_IF_EXCEPTION(throwScope, {}); + + auto len = properties.size() + 1; + exportNames.reserveCapacity(len); + exportValues.ensureCapacity(len); + + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(object); + + for (auto& entry : properties) { + exportNames.append(entry); + exportValues.append(object->get(globalObject, entry)); + } + }; +} static OnLoadResult handleOnLoadObjectResult(Zig::GlobalObject* globalObject, JSC::JSObject* object) { @@ -389,45 +417,35 @@ JSValue fetchCommonJSModule( return JSValue(); } - switch (res->result.value.tag) { - case SyntheticModuleType::Module: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), generateNodeModuleModule); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); - } + auto tag = res->result.value.tag; + switch (tag) { +// Generated native module cases +#define CASE(str, name) \ + case SyntheticModuleType::name: { \ + target->evaluate(globalObject, Bun::toWTFString(*specifier), generateNativeModule_##name); \ + RETURN_IF_EXCEPTION(scope, {}); \ + RELEASE_AND_RETURN(scope, target); \ + } + BUN_FOREACH_NATIVE_MODULE(CASE) +#undef CASE - case SyntheticModuleType::Buffer: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), generateBufferSourceCode); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); - } - case SyntheticModuleType::TTY: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), generateTTYSourceCode); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); - } - case SyntheticModuleType::NodeUtilTypes: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), Bun::generateNodeUtilTypesSourceCode); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); - } - case SyntheticModuleType::Process: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), generateProcessSourceCode); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); - } - case SyntheticModuleType::Events: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), generateEventsSourceCode); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); - } - case SyntheticModuleType::StringDecoder: { - target->evaluate(globalObject, Bun::toWTFString(*specifier), generateStringDecoderSourceCode); - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN(scope, target); + case SyntheticModuleType::ESM: { + RELEASE_AND_RETURN(scope, jsNumber(-1)); } + default: { - RELEASE_AND_RETURN(scope, jsNumber(-1)); + if (tag & SyntheticModuleType::InternalModuleRegistryFlag) { + constexpr auto mask = (SyntheticModuleType::InternalModuleRegistryFlag - 1); + target->putDirect( + vm, + builtinNames.exportsPublicName(), + globalObject->internalModuleRegistry()->requireId(globalObject, vm, static_cast<InternalModuleRegistry::Field>(tag & mask)), + JSC::PropertyAttribute::ReadOnly | 0); + RETURN_IF_EXCEPTION(scope, {}); + RELEASE_AND_RETURN(scope, target); + } else { + RELEASE_AND_RETURN(scope, jsNumber(-1)); + } } } } @@ -496,7 +514,7 @@ JSValue fetchCommonJSModule( } template<bool allowPromise> -static JSValue fetchSourceCode( +static JSValue fetchESMSourceCode( Zig::GlobalObject* globalObject, ErrorableResolvedSource* res, BunString* specifier, @@ -555,67 +573,32 @@ static JSValue fetchSourceCode( auto moduleKey = Bun::toWTFString(*specifier); - switch (res->result.value.tag) { - case SyntheticModuleType::Module: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateNodeModuleModule, - JSC::SourceOrigin(), WTFMove(moduleKey))); - - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } - - case SyntheticModuleType::Buffer: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateBufferSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); - - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } - case SyntheticModuleType::TTY: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateTTYSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); - - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } - case SyntheticModuleType::NodeUtilTypes: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(Bun::generateNodeUtilTypesSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); - - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } - case SyntheticModuleType::Process: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateProcessSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); - - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } - case SyntheticModuleType::Events: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateEventsSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); - - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); + auto tag = res->result.value.tag; + switch (tag) { + case SyntheticModuleType::ESM: { + auto&& provider = Zig::SourceProvider::create(globalObject, res->result.value, JSC::SourceProviderSourceType::Module, true); + return rejectOrResolve(JSSourceCode::create(vm, JSC::SourceCode(provider))); } - case SyntheticModuleType::StringDecoder: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateStringDecoderSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } - case SyntheticModuleType::Constants: { - auto source = JSC::SourceCode( - JSC::SyntheticSourceProvider::create(generateConstantsSourceCode, - JSC::SourceOrigin(), WTFMove(moduleKey))); +#define CASE(str, name) \ + case (SyntheticModuleType::name): { \ + auto source = JSC::SourceCode(JSC::SyntheticSourceProvider::create(generateNativeModule_##name, JSC::SourceOrigin(), WTFMove(moduleKey))); \ + return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); \ + } + BUN_FOREACH_NATIVE_MODULE(CASE) +#undef CASE - return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); - } + // CommonJS modules from src/js/* default: { - auto&& provider = Zig::SourceProvider::create(globalObject, res->result.value, JSC::SourceProviderSourceType::Module, true); - return rejectOrResolve(JSC::JSSourceCode::create(vm, JSC::SourceCode(provider))); + if (tag & SyntheticModuleType::InternalModuleRegistryFlag) { + constexpr auto mask = (SyntheticModuleType::InternalModuleRegistryFlag - 1); + auto* internalModule = jsCast<JSObject*>(globalObject->internalModuleRegistry()->requireId(globalObject, vm, static_cast<InternalModuleRegistry::Field>(tag & mask))); + auto source = JSC::SourceCode(JSC::SyntheticSourceProvider::create(generateInternalModuleSourceCode(globalObject, internalModule), JSC::SourceOrigin(), WTFMove(moduleKey))); + return rejectOrResolve(JSSourceCode::create(vm, WTFMove(source))); + } else { + auto&& provider = Zig::SourceProvider::create(globalObject, res->result.value, JSC::SourceProviderSourceType::Module, true); + return rejectOrResolve(JSC::JSSourceCode::create(vm, JSC::SourceCode(provider))); + } } } } @@ -715,36 +698,21 @@ extern "C" JSC::EncodedJSValue jsFunctionOnLoadObjectResultReject(JSC::JSGlobalO return JSValue::encode(reason); } -JSValue fetchSourceCodeSync( +JSValue fetchESMSourceCodeSync( Zig::GlobalObject* globalObject, ErrorableResolvedSource* res, BunString* specifier, BunString* referrer) { - return fetchSourceCode<false>(globalObject, res, specifier, referrer); + return fetchESMSourceCode<false>(globalObject, res, specifier, referrer); } -JSValue fetchSourceCodeAsync( +JSValue fetchESMSourceCodeAsync( Zig::GlobalObject* globalObject, ErrorableResolvedSource* res, BunString* specifier, BunString* referrer) { - return fetchSourceCode<true>(globalObject, res, specifier, referrer); + return fetchESMSourceCode<true>(globalObject, res, specifier, referrer); } } -namespace JSC { - -template<unsigned passedNumberOfInternalFields> -template<typename Visitor> -void JSInternalFieldObjectImpl<passedNumberOfInternalFields>::visitChildrenImpl(JSCell* cell, Visitor& visitor) -{ - auto* thisObject = jsCast<JSInternalFieldObjectImpl*>(cell); - ASSERT_GC_OBJECT_INHERITS(thisObject, info()); - Base::visitChildren(thisObject, visitor); - visitor.appendValues(thisObject->m_internalFields, numberOfInternalFields); -} - -DEFINE_VISIT_CHILDREN_WITH_MODIFIER(template<unsigned passedNumberOfInternalFields>, JSInternalFieldObjectImpl<passedNumberOfInternalFields>); - -} // namespace JSC |