aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ImportMetaObject.h
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-06-24 06:02:16 -0700
committerGravatar GitHub <noreply@github.com> 2023-06-24 06:02:16 -0700
commitff635551436123022ba3980b39580d53973c80a2 (patch)
tree7eb5292a7157e70dd432518f185bc9c39345ae89 /src/bun.js/bindings/ImportMetaObject.h
parent069b42a7cc1275969859dc60e7c303528ca2dccb (diff)
downloadbun-ff635551436123022ba3980b39580d53973c80a2.tar.gz
bun-ff635551436123022ba3980b39580d53973c80a2.tar.zst
bun-ff635551436123022ba3980b39580d53973c80a2.zip
Rewrite Bun's runtime CommonJS loader (#3379)
* wip changes for CommonJS * this rewrite is almost complete * even more code * wip * Remove usages of `import.meta.require` from builtins * Remove usages of require * Regenerate * :scissors: builtin rewrite commonjs in printer * Use lazy custom getters for import.meta * fixups * Remove depd * ugh * still crashing * fixup undici * comment out import.meta.require.resolve temporarily not a real solution but it stops the crashes * Redo import.meta.primordials * Builtins now have a `builtin://` protocol in source origin * Seems to work? * Finsih getting rid of primordials * switcharoo * No more function * just one more bug * Update launch.json * Implement `require.main` * :scissors: * Bump WebKit * Fixup import cycles * Fixup improt cycles * export more things * Implement `createCommonJSModule` builtin * More exports * regenerate * i broke some stuff * some of these tests work now * We lost the encoding * Sort of fix zlib * Sort of fix util * Update events.js * bump * bump * bump * Fix missing export in fs * fix some bugs with builtin esm modules (stream, worker_threads, events). its not perfect yet. * fix some other internal module bugs * oops * fix some extra require default stuff * uncomment this file but it crsahes on my machine * tidy code here * fixup tls exports * make simdutf happier * Add hasPrefix binding * Add test for `require.main` * Fix CommonJS evaluation order race condition * Make node:http load faster * Add missing exports to tls.js * Use the getter * Regenerate builtins * Fix assertion failure in Bun.write() * revamp dotEnv parser (#3347) - fixes `strings.indexOfAny()` - fixes OOB array access fixes #411 fixes #2823 fixes #3042 * fix tests for `expect()` (#3384) - extend test job time-out for `darwin-aarch64` * `expect().resolves` and `expect().rejects` (#3318) * Move expect and snapshots to their own files * expect().resolves and expect().rejects * Fix promise being added to unhandled rejection list * Handle timeouts in expect(<promise>) * wip merge * Fix merge issue --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> * fixup min/memcopy (#3388) * Fix crash in builtins * Don't attempt to evaluate modules with no source code * Update WebCoreJSBuiltins.cpp * Update WebCoreJSBuiltins.cpp * Update WebCoreJSBuiltins.cpp * Fix crash * cleanup * Fix test cc @paperdave * Fixup Undici * Fix issue in node:http * Create util-deprecate.mjs * Fix several bugs * Use the identifier * Support error.code in `util.deprecate` * make the CJs loader slightly more resilient * Update WebCoreJSBuiltins.cpp * Fix macros --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Co-authored-by: dave caruso <me@paperdave.net> Co-authored-by: Alex Lam S.L <alexlamsl@gmail.com> Co-authored-by: Ashcon Partovi <ashcon@partovi.net> Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>
Diffstat (limited to 'src/bun.js/bindings/ImportMetaObject.h')
-rw-r--r--src/bun.js/bindings/ImportMetaObject.h100
1 files changed, 29 insertions, 71 deletions
diff --git a/src/bun.js/bindings/ImportMetaObject.h b/src/bun.js/bindings/ImportMetaObject.h
index d0f8f0963..2794ddbb6 100644
--- a/src/bun.js/bindings/ImportMetaObject.h
+++ b/src/bun.js/bindings/ImportMetaObject.h
@@ -18,97 +18,55 @@ namespace Zig {
using namespace JSC;
using namespace WebCore;
-class ImportMetaObject final : public JSC::JSDestructibleObject {
+JSC_DECLARE_CUSTOM_GETTER(jsRequireCacheGetter);
+JSC_DECLARE_CUSTOM_SETTER(jsRequireCacheSetter);
+
+class ImportMetaObject final : public JSC::JSNonFinalObject {
public:
- using Base = JSC::JSDestructibleObject;
+ using Base = JSC::JSNonFinalObject;
- static ImportMetaObject* create(JSC::VM& vm, JSGlobalObject* globalObject, JSC::Structure* structure)
- {
- ImportMetaObject* ptr = new (NotNull, JSC::allocateCell<ImportMetaObject>(vm)) ImportMetaObject(vm, globalObject, structure);
- ptr->finishCreation(vm);
- return ptr;
- }
+ static ImportMetaObject* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure, const WTF::String& url);
- static JSC::Structure* createResolveFunctionStructure(JSC::VM& vm, Zig::GlobalObject* globalObject);
- static JSValue createResolveFunctionPrototype(JSC::VM& vm, Zig::GlobalObject* globalObject);
+ static JSC::Structure* createRequireFunctionStructure(JSC::VM& vm, JSGlobalObject* globalObject);
static JSObject* createRequireFunction(VM& vm, JSGlobalObject* lexicalGlobalObject, const WTF::String& pathString);
- static ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSC::JSValue key);
-
- static inline Zig::ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSC::JSString* keyString)
- {
- // TODO: optimize this by reusing the same JSC::Structure object and using putDirectOffset
- auto& vm = globalObject->vm();
- auto view = keyString->value(globalObject);
- JSC::Structure* structure = WebCore::getDOMStructure<Zig::ImportMetaObject>(vm, *reinterpret_cast<Zig::GlobalObject*>(globalObject));
- Zig::ImportMetaObject* metaProperties = Zig::ImportMetaObject::create(vm, globalObject, structure);
- if (UNLIKELY(!metaProperties)) {
- return nullptr;
- }
-
- auto clientData = WebCore::clientData(vm);
- auto& builtinNames = clientData->builtinNames();
-
- auto index = view.reverseFind('/', view.length());
- if (index != WTF::notFound) {
- metaProperties->putDirect(vm, builtinNames.dirPublicName(),
- JSC::jsSubstring(globalObject, keyString, 0, index));
- metaProperties->putDirect(
- vm, builtinNames.filePublicName(),
- JSC::jsSubstring(globalObject, keyString, index + 1, view.length() - index - 1));
- } else {
- metaProperties->putDirect(vm, builtinNames.filePublicName(), keyString);
- }
- metaProperties->putDirect(
- vm,
- builtinNames.pathPublicName(),
- keyString,
- 0);
-
- metaProperties->putDirect(
- vm,
- builtinNames.requirePublicName(),
- Zig::ImportMetaObject::createRequireFunction(vm, globalObject, view),
- PropertyAttribute::Builtin | PropertyAttribute::Function | 0);
-
- if (view.startsWith('/')) {
- metaProperties->putDirect(vm, builtinNames.urlPublicName(), JSC::JSValue(JSC::jsString(vm, WTF::URL::fileURLWithFileSystemPath(view).string())));
- } else {
- if (view.startsWith("node:"_s) || view.startsWith("bun:"_s)) {
- metaProperties->putDirect(globalObject->vm(), JSC::Identifier::fromString(globalObject->vm(), "primordials"_s), reinterpret_cast<Zig::GlobalObject*>(globalObject)->primordialsObject());
- }
- metaProperties->putDirect(vm, builtinNames.urlPublicName(), keyString);
- }
-
- return metaProperties;
- }
+ static ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSC::JSString* keyString);
+ static ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSValue keyString);
DECLARE_INFO;
+ DECLARE_VISIT_CHILDREN;
- static constexpr bool needsDestruction = true;
-
- template<typename CellType, SubspaceAccess>
- static CompleteSubspace* subspaceFor(VM& vm)
+ template<typename, JSC::SubspaceAccess mode> static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm)
{
- return &vm.destructibleObjectSpace();
- }
+ if constexpr (mode == JSC::SubspaceAccess::Concurrently)
+ return nullptr;
- static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
- {
- return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
+ return WebCore::subspaceForImpl<ImportMetaObject, UseCustomHeapCellType::No>(
+ vm,
+ [](auto& spaces) { return spaces.m_clientSubspaceForImportMeta.get(); },
+ [](auto& spaces, auto&& space) { spaces.m_clientSubspaceForImportMeta = std::forward<decltype(space)>(space); },
+ [](auto& spaces) { return spaces.m_subspaceForImportMeta.get(); },
+ [](auto& spaces, auto&& space) { spaces.m_subspaceForImportMeta = std::forward<decltype(space)>(space); });
}
- static JSObject* createPrototype(VM& vm, JSDOMGlobalObject& globalObject);
+ static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject);
static void analyzeHeap(JSCell*, JSC::HeapAnalyzer&);
+ WTF::String url;
+ LazyProperty<JSObject, JSFunction> requireProperty;
+ LazyProperty<JSObject, JSString> dirProperty;
+ LazyProperty<JSObject, JSString> urlProperty;
+ LazyProperty<JSObject, JSString> fileProperty;
+ LazyProperty<JSObject, JSString> pathProperty;
+
private:
- ImportMetaObject(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure)
+ ImportMetaObject(JSC::VM& vm, JSC::Structure* structure, const WTF::String& url)
: Base(vm, structure)
+ , url(url)
{
}
void finishCreation(JSC::VM&);
};
-STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(ImportMetaObject, ImportMetaObject::Base);
} \ No newline at end of file