diff options
author | 2022-06-25 04:41:20 -0700 | |
---|---|---|
committer | 2022-06-25 04:41:20 -0700 | |
commit | 8fbd92e37de61766a72fe0c4a1c98a5fb058c00c (patch) | |
tree | c8cbe1fa0b0d5251f0835057b9fdd3e3bc51651a /src/bun.js | |
parent | 7bb75f55530e52447b9c68bc5b0908bf734ba184 (diff) | |
download | bun-8fbd92e37de61766a72fe0c4a1c98a5fb058c00c.tar.gz bun-8fbd92e37de61766a72fe0c4a1c98a5fb058c00c.tar.zst bun-8fbd92e37de61766a72fe0c4a1c98a5fb058c00c.zip |
Cleanup some of the require code
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 13 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.h | 2 | ||||
-rw-r--r-- | src/bun.js/builtins/BunBuiltinNames.h | 2 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/JSZigGlobalObjectBuiltins.cpp | 183 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h | 1 | ||||
-rw-r--r-- | src/bun.js/builtins/js/JSZigGlobalObject.js | 24 |
6 files changed, 132 insertions, 93 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index a51bc433b..6f04d2d1f 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -1754,6 +1754,12 @@ void GlobalObject::finishCreation(VM& vm) init.set(map); }); + m_requireMap.initLater( + [](const JSC::LazyProperty<JSC::JSGlobalObject, JSC::JSMap>::Initializer& init) { + auto* map = JSC::JSMap::create(init.owner, init.vm, init.owner->mapStructure()); + init.set(map); + }); + m_JSArrayBufferSinkClassStructure.initLater( [](LazyClassStructure::Initializer& init) { auto* prototype = createJSSinkPrototype(init.vm, init.global, WebCore::SinkID::ArrayBufferSink); @@ -1784,7 +1790,7 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) auto& builtinNames = WebCore::builtinNames(vm); WTF::Vector<GlobalPropertyInfo> extraStaticGlobals; - extraStaticGlobals.reserveCapacity(30); + extraStaticGlobals.reserveCapacity(31); JSC::Identifier queueMicrotaskIdentifier = JSC::Identifier::fromString(vm, "queueMicrotask"_s); extraStaticGlobals.uncheckedAppend( @@ -1848,6 +1854,7 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) JSC::PropertyAttribute::Function | JSC::PropertyAttribute::DontDelete | 0 }); static NeverDestroyed<const String> BunLazyString(MAKE_STATIC_STRING_IMPL("Bun.lazy")); + static NeverDestroyed<const String> CommonJSSymbolKey(MAKE_STATIC_STRING_IMPL("CommonJS")); JSC::Identifier BunLazyIdentifier = JSC::Identifier::fromUid(vm.symbolRegistry().symbolForKey(BunLazyString)); JSC::JSFunction* lazyLoadFunction = JSC::JSFunction::create(vm, JSC::jsCast<JSC::JSGlobalObject*>(globalObject()), 0, BunLazyString, functionLazyLoad); @@ -1878,6 +1885,9 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.getInternalWritableStreamPrivateName(), JSFunction::create(vm, this, 1, String(), getInternalWritableStream), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly)); extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.createWritableStreamFromInternalPrivateName(), JSFunction::create(vm, this, 1, String(), createWritableStreamFromInternal), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly)); extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.fulfillModuleSyncPrivateName(), JSFunction::create(vm, this, 1, String(), functionFulfillModuleSync), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function)); + + extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.commonJSSymbolPrivateName(), JSC::Symbol::create(vm, vm.symbolRegistry().symbolForKey(CommonJSSymbolKey)), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly)); + this->addStaticGlobals(extraStaticGlobals.data(), extraStaticGlobals.size()); extraStaticGlobals.releaseBuffer(); @@ -2134,6 +2144,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) thisObject->m_JSArrayBufferControllerPrototype.visit(visitor); thisObject->m_importMetaObjectStructure.visit(visitor); thisObject->m_lazyReadableStreamPrototypeMap.visit(visitor); + thisObject->m_requireMap.visit(visitor); visitor.append(thisObject->m_readableStreamToArrayBufferResolve); visitor.append(thisObject->m_readableStreamToText); diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h index cabaf57a9..b5a2f99da 100644 --- a/src/bun.js/bindings/ZigGlobalObject.h +++ b/src/bun.js/bindings/ZigGlobalObject.h @@ -159,6 +159,7 @@ public: JSC::JSValue ArrayBufferSinkPrototype() { return m_JSArrayBufferSinkClassStructure.prototypeInitializedOnMainThread(this); } JSC::JSValue JSReadableArrayBufferSinkControllerPrototype() { return m_JSArrayBufferControllerPrototype.getInitializedOnMainThread(this); } JSC::JSMap* readableStreamNativeMap() { return m_lazyReadableStreamPrototypeMap.getInitializedOnMainThread(this); } + JSC::JSMap* requireMap() { return m_requireMap.getInitializedOnMainThread(this); } void* bunVM() { return m_bunVM; } bool isThreadLocalDefaultGlobalObject = false; @@ -186,6 +187,7 @@ private: LazyProperty<JSGlobalObject, JSObject> m_JSArrayBufferControllerPrototype; LazyProperty<JSGlobalObject, JSObject> m_importMetaObjectStructure; LazyProperty<JSGlobalObject, JSMap> m_lazyReadableStreamPrototypeMap; + LazyProperty<JSGlobalObject, JSMap> m_requireMap; DOMGuardedObjectSet m_guardedObjects WTF_GUARDED_BY_LOCK(m_gcLock); void* m_bunVM; diff --git a/src/bun.js/builtins/BunBuiltinNames.h b/src/bun.js/builtins/BunBuiltinNames.h index 6acd30a8b..c41d368b4 100644 --- a/src/bun.js/builtins/BunBuiltinNames.h +++ b/src/bun.js/builtins/BunBuiltinNames.h @@ -62,6 +62,7 @@ using namespace JSC; macro(closedPromise) \ macro(closedPromiseCapability) \ macro(code) \ + macro(commonJSSymbol) \ macro(connect) \ macro(consumeReadableStream) \ macro(controlledReadableStream) \ @@ -177,6 +178,7 @@ using namespace JSC; macro(releaseLock) \ macro(removeEventListener) \ macro(require) \ + macro(requireMap) \ macro(requireModule) \ macro(resolve) \ macro(resolveSync) \ diff --git a/src/bun.js/builtins/cpp/JSZigGlobalObjectBuiltins.cpp b/src/bun.js/builtins/cpp/JSZigGlobalObjectBuiltins.cpp index 421ba1181..583a035d8 100644 --- a/src/bun.js/builtins/cpp/JSZigGlobalObjectBuiltins.cpp +++ b/src/bun.js/builtins/cpp/JSZigGlobalObjectBuiltins.cpp @@ -49,7 +49,7 @@ namespace WebCore { const JSC::ConstructAbility s_jsZigGlobalObjectRequireCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_jsZigGlobalObjectRequireCodeConstructorKind = JSC::ConstructorKind::None; -const int s_jsZigGlobalObjectRequireCodeLength = 1221; +const int s_jsZigGlobalObjectRequireCodeLength = 1162; static const JSC::Intrinsic s_jsZigGlobalObjectRequireCodeIntrinsic = JSC::NoIntrinsic; const char* const s_jsZigGlobalObjectRequireCode = "(function (name) {\n" \ @@ -59,36 +59,36 @@ const char* const s_jsZigGlobalObjectRequireCode = " }\n" \ " \n" \ " const resolved = this.resolveSync(name, this.path);\n" \ - " var requireCache = (globalThis[Symbol.for(\"_requireCache\")] ||= new @Map);\n" \ - " var cached = requireCache.@get(resolved);\n" \ + " var cached = @requireMap.@get(resolved);\n" \ + " const last5 = resolved.substring(resolved.length - 5);\n" \ " if (cached) {\n" \ - " if (resolved.endsWith(\".node\")) {\n" \ + " if (last5 === \".node\") {\n" \ " return cached.exports;\n" \ " }\n" \ "\n" \ " return cached;\n" \ " }\n" \ "\n" \ - "\n" \ + " \n" \ " //\n" \ - " if (resolved.endsWith(\".json\")) {\n" \ + " if (last5 === \".json\") {\n" \ " var fs = (globalThis[Symbol.for(\"_fs\")] ||= Bun.fs());\n" \ " var exports = JSON.parse(fs.readFileSync(resolved, \"utf8\"));\n" \ - " requireCache.@set(resolved, exports);\n" \ + " @requireMap.@set(resolved, exports);\n" \ " return exports;\n" \ - " } else if (resolved.endsWith(\".node\")) {\n" \ + " } else if (last5 === \".node\") {\n" \ " var module = { exports: {} };\n" \ " globalThis.process.dlopen(module, resolved);\n" \ - " requireCache.@set(resolved, module);\n" \ + " @requireMap.@set(resolved, module);\n" \ " return module.exports;\n" \ - " } else if (resolved.endsWith(\".toml\")) {\n" \ + " } else if (last5 === \".toml\") {\n" \ " var fs = (globalThis[Symbol.for(\"_fs\")] ||= Bun.fs());\n" \ " var exports = Bun.TOML.parse(fs.readFileSync(resolved, \"utf8\"));\n" \ - " requireCache.@set(resolved, exports);\n" \ + " @requireMap.@set(resolved, exports);\n" \ " return exports;\n" \ " } else {\n" \ " var exports = this.requireModule(this, resolved);\n" \ - " requireCache.@set(resolved, exports);\n" \ + " @requireMap.@set(resolved, exports);\n" \ " return exports;\n" \ " }\n" \ "})\n" \ @@ -96,94 +96,117 @@ const char* const s_jsZigGlobalObjectRequireCode = const JSC::ConstructAbility s_jsZigGlobalObjectLoadModuleCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_jsZigGlobalObjectLoadModuleCodeConstructorKind = JSC::ConstructorKind::None; -const int s_jsZigGlobalObjectLoadModuleCodeLength = 2783; +const int s_jsZigGlobalObjectLoadModuleCodeLength = 2750; static const JSC::Intrinsic s_jsZigGlobalObjectLoadModuleCodeIntrinsic = JSC::NoIntrinsic; const char* const s_jsZigGlobalObjectLoadModuleCode = "(function (meta, resolvedSpecifier) {\n" \ " \"use strict\";\n" \ - " var queue = @createFIFO();\n" \ - " var key = resolvedSpecifier;\n" \ - " \n" \ - " var Loader = globalThis.Loader;\n" \ - " var registry = Loader.registry;\n" \ - " while (key) {\n" \ - " @fulfillModuleSync(key);\n" \ - " var entry = registry.@get(key);\n" \ + " var Loader = globalThis.Loader;\n" \ "\n" \ - " //\n" \ - " //\n" \ - " //\n" \ - " //\n" \ - " var sourceCodeObject = @getPromiseInternalField(entry.fetch, @promiseFieldReactionsOrResult);\n" \ - " \n" \ + " var queue = @createFIFO();\n" \ + " var key = resolvedSpecifier;\n" \ + " var registry = Loader.registry;\n" \ + " while (key) {\n" \ + " @fulfillModuleSync(key);\n" \ + " var entry = registry.@get(key);\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " //\n" \ + " //\n" \ + " var sourceCodeObject = @getPromiseInternalField(\n" \ + " entry.fetch,\n" \ + " @promiseFieldReactionsOrResult\n" \ + " );\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " //\n" \ + " var moduleRecordPromise = Loader.parseModule(key, sourceCodeObject);\n" \ + " var module = entry.module;\n" \ + " if (!module && moduleRecordPromise && @isPromise(moduleRecordPromise)) {\n" \ + " var reactionsOrResult = @getPromiseInternalField(\n" \ + " moduleRecordPromise,\n" \ + " @promiseFieldReactionsOrResult\n" \ + " );\n" \ + " var flags = @getPromiseInternalField(\n" \ + " moduleRecordPromise,\n" \ + " @promiseFieldFlags\n" \ + " );\n" \ + " var state = flags & @promiseStateMask;\n" \ "\n" \ " //\n" \ + " if (\n" \ + " state === @promiseStatePending ||\n" \ + " (reactionsOrResult && @isPromise(reactionsOrResult))\n" \ + " ) {\n" \ + " @throwTypeError(`require() async module \\\"${key}\\\" is unsupported`);\n" \ + " } else if (state === @promiseStateRejected) {\n" \ + " //\n" \ + " //\n" \ + " @throwTypeError(\n" \ + " `${\n" \ + " reactionsOrResult?.message ?? \"An error occurred\"\n" \ + " } while parsing module \\\"${key}\\\"`\n" \ + " );\n" \ + " }\n" \ + " entry.module = module = reactionsOrResult;\n" \ + " } else if (moduleRecordPromise && !module) {\n" \ + " entry.module = module = moduleRecordPromise;\n" \ + " }\n" \ + "\n" \ + " //\n" \ + " @setStateToMax(entry, @ModuleLink);\n" \ + " var dependenciesMap = module.dependenciesMap;\n" \ + " var requestedModules = Loader.requestedModules(module);\n" \ + " var dependencies = @newArrayWithSize(requestedModules.length);\n" \ + "\n" \ + " for (var i = 0, length = requestedModules.length; i < length; ++i) {\n" \ + " var depName = requestedModules[i];\n" \ + "\n" \ " //\n" \ " //\n" \ - " var moduleRecordPromise = Loader.parseModule(key, sourceCodeObject);\n" \ - " var module = entry.module;\n" \ - " if (!module && moduleRecordPromise && @isPromise(moduleRecordPromise)) {\n" \ - " var reactionsOrResult = @getPromiseInternalField(moduleRecordPromise, @promiseFieldReactionsOrResult);\n" \ - " var flags = @getPromiseInternalField(moduleRecordPromise, @promiseFieldFlags);\n" \ - " var state = flags & @promiseStateMask;\n" \ + " var depKey =\n" \ + " depName[0] === \"/\"\n" \ + " ? depName\n" \ + " : Loader.resolveSync(depName, key, @undefined);\n" \ + " var depEntry = Loader.ensureRegistered(depKey);\n" \ "\n" \ - " //\n" \ - " if (state === @promiseStatePending || (reactionsOrResult && @isPromise(reactionsOrResult))) {\n" \ - " @throwTypeError(`require() async module \\\"${key}\\\" is unsupported`);\n" \ - " \n" \ - " } else if (state === @promiseStateRejected) {\n" \ - " //\n" \ - " //\n" \ - " @throwTypeError(`${reactionsOrResult?.message ?? \"An error occurred\"} while parsing module \\\"${key}\\\"`);\n" \ - " }\n" \ - " entry.module = module = reactionsOrResult;\n" \ - " } else if (moduleRecordPromise && !module) {\n" \ - " entry.module = module = moduleRecordPromise;\n" \ + " if (depEntry.state < @ModuleLink) {\n" \ + " queue.push(depKey);\n" \ " }\n" \ "\n" \ - " //\n" \ - " @setStateToMax(entry, @ModuleLink);\n" \ - " var dependenciesMap = module.dependenciesMap;\n" \ - " var requestedModules = Loader.requestedModules(module);\n" \ - " var dependencies = @newArrayWithSize(requestedModules.length);\n" \ - " \n" \ - " for (var i = 0, length = requestedModules.length; i < length; ++i) {\n" \ - " var depName = requestedModules[i];\n" \ - "\n" \ - " //\n" \ - " //\n" \ - " var depKey = depName[0] === '/' ? depName : Loader.resolveSync(depName, key, @undefined);\n" \ - " var depEntry = Loader.ensureRegistered(depKey);\n" \ - "\n" \ - " if (depEntry.state < @ModuleLink) {\n" \ - " queue.push(depKey);\n" \ - " }\n" \ - "\n" \ - " @putByValDirect(dependencies, i, depEntry);\n" \ - " dependenciesMap.@set(depName, depEntry);\n" \ - " }\n" \ - "\n" \ - " entry.dependencies = dependencies;\n" \ - " key = queue.shift();\n" \ - " while (key && ((registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink)) {\n" \ - " key = queue.shift();\n" \ - " }\n" \ + " @putByValDirect(dependencies, i, depEntry);\n" \ + " dependenciesMap.@set(depName, depEntry);\n" \ " }\n" \ "\n" \ - " var linkAndEvaluateResult = Loader.linkAndEvaluateModule(resolvedSpecifier, @undefined);\n" \ - " if (linkAndEvaluateResult && @isPromise(linkAndEvaluateResult)) {\n" \ - " //\n" \ - " //\n" \ - " @throwTypeError(`require() async module \\\"${resolvedSpecifier}\\\" is unsupported`);\n" \ + " entry.dependencies = dependencies;\n" \ + " key = queue.shift();\n" \ + " while (key && (registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) {\n" \ + " key = queue.shift();\n" \ " }\n" \ + " }\n" \ + "\n" \ + " var linkAndEvaluateResult = Loader.linkAndEvaluateModule(\n" \ + " resolvedSpecifier,\n" \ + " @undefined\n" \ + " );\n" \ + " if (linkAndEvaluateResult && @isPromise(linkAndEvaluateResult)) {\n" \ + " //\n" \ + " //\n" \ + " @throwTypeError(\n" \ + " `require() async module \\\"${resolvedSpecifier}\\\" is unsupported`\n" \ + " );\n" \ + " }\n" \ + "\n" \ + " return Loader.registry.@get(resolvedSpecifier);\n" \ "\n" \ - " return Loader.registry.@get(resolvedSpecifier);\n" \ "})\n" \ ; const JSC::ConstructAbility s_jsZigGlobalObjectRequireModuleCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_jsZigGlobalObjectRequireModuleCodeConstructorKind = JSC::ConstructorKind::None; -const int s_jsZigGlobalObjectRequireModuleCodeLength = 613; +const int s_jsZigGlobalObjectRequireModuleCodeLength = 606; static const JSC::Intrinsic s_jsZigGlobalObjectRequireModuleCodeIntrinsic = JSC::NoIntrinsic; const char* const s_jsZigGlobalObjectRequireModuleCode = "(function (meta, resolved) {\n" \ @@ -200,7 +223,7 @@ const char* const s_jsZigGlobalObjectRequireModuleCode = " }\n" \ " var exports = Loader.getModuleNamespaceObject(entry.module);\n" \ " var commonJS = exports.default;\n" \ - " if (commonJS && @isObject(commonJS) && Symbol.for(\"CommonJS\") in commonJS) {\n" \ + " if (commonJS && @isObject(commonJS) && @commonJSSymbol in commonJS) {\n" \ " return commonJS();\n" \ " }\n" \ " return exports;\n" \ diff --git a/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h b/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h index fc5e2406a..cefa5fd8c 100644 --- a/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h +++ b/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h @@ -82,6 +82,7 @@ namespace Zig { class GlobalObject; } namespace Zig { class GlobalObject; } namespace Zig { class GlobalObject; } namespace Zig { class GlobalObject; } +namespace Zig { class GlobalObject; } /* * Copyright (c) 2015 Igalia * Copyright (c) 2015 Igalia S.L. diff --git a/src/bun.js/builtins/js/JSZigGlobalObject.js b/src/bun.js/builtins/js/JSZigGlobalObject.js index 7b82067ec..bb08bb107 100644 --- a/src/bun.js/builtins/js/JSZigGlobalObject.js +++ b/src/bun.js/builtins/js/JSZigGlobalObject.js @@ -30,36 +30,36 @@ function require(name) { } const resolved = this.resolveSync(name, this.path); - var requireCache = (globalThis[Symbol.for("_requireCache")] ||= new @Map); - var cached = requireCache.@get(resolved); + var cached = @requireMap.@get(resolved); + const last5 = resolved.substring(resolved.length - 5); if (cached) { - if (resolved.endsWith(".node")) { + if (last5 === ".node") { return cached.exports; } return cached; } - + // TODO: remove this hardcoding - if (resolved.endsWith(".json")) { + if (last5 === ".json") { var fs = (globalThis[Symbol.for("_fs")] ||= Bun.fs()); var exports = JSON.parse(fs.readFileSync(resolved, "utf8")); - requireCache.@set(resolved, exports); + @requireMap.@set(resolved, exports); return exports; - } else if (resolved.endsWith(".node")) { + } else if (last5 === ".node") { var module = { exports: {} }; globalThis.process.dlopen(module, resolved); - requireCache.@set(resolved, module); + @requireMap.@set(resolved, module); return module.exports; - } else if (resolved.endsWith(".toml")) { + } else if (last5 === ".toml") { var fs = (globalThis[Symbol.for("_fs")] ||= Bun.fs()); var exports = Bun.TOML.parse(fs.readFileSync(resolved, "utf8")); - requireCache.@set(resolved, exports); + @requireMap.@set(resolved, exports); return exports; } else { var exports = this.requireModule(this, resolved); - requireCache.@set(resolved, exports); + @requireMap.@set(resolved, exports); return exports; } } @@ -182,7 +182,7 @@ function requireModule(meta, resolved) { } var exports = Loader.getModuleNamespaceObject(entry.module); var commonJS = exports.default; - if (commonJS && @isObject(commonJS) && Symbol.for("CommonJS") in commonJS) { + if (commonJS && @isObject(commonJS) && @commonJSSymbol in commonJS) { return commonJS(); } return exports; |