From e2de1f5c133ed3aac6fcea7e8e7c5fcd771d65f9 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Mon, 29 May 2023 11:23:10 -0700 Subject: Natively support CommonJS at runtime (#3104) * Natively support CommonJS at runtime * cleanup how getters are handled, add fast path * more consistent with node * use * As * Remove thrown modules on exception * Handle exception better --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- src/bun.js/bindings/ZigGlobalObject.cpp | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp') diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index f0ff9cf16..2a6be49b2 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -177,6 +177,7 @@ namespace JSCastingHelpers = JSC::JSCastingHelpers; #include "CallSite.h" #include "CallSitePrototype.h" #include "DOMWrapperWorld-class.h" +#include "CommonJSModuleRecord.h" constexpr size_t DEFAULT_ERROR_STACK_TRACE_LIMIT = 10; @@ -2607,6 +2608,45 @@ void GlobalObject::finishCreation(VM& vm) init.set(result.toObject(globalObject)); }); + m_commonJSModuleObjectStructure.initLater( + [](const Initializer& init) { + init.set(Bun::createCommonJSModuleStructure(reinterpret_cast(init.owner))); + }); + + m_commonJSFunctionArgumentsStructure.initLater( + [](const Initializer& init) { + auto* globalObject = reinterpret_cast(init.owner); + JSC::Structure* structure = globalObject->structureCache().emptyObjectStructureForPrototype( + globalObject, + globalObject->objectPrototype(), + 3); + JSC::PropertyOffset offset; + auto& vm = globalObject->vm(); + + structure = structure->addPropertyTransition( + vm, + structure, + JSC::Identifier::fromString(vm, "module"_s), + 0, + offset); + + structure = structure->addPropertyTransition( + vm, + structure, + JSC::Identifier::fromString(vm, "exports"_s), + 0, + offset); + + structure = structure->addPropertyTransition( + vm, + structure, + JSC::Identifier::fromString(vm, "require"_s), + JSC::PropertyAttribute::Function | JSC::PropertyAttribute::Builtin | 0, + offset); + + init.set(structure); + }); + // Change prototype from null to object for synthetic modules. m_moduleNamespaceObjectStructure.initLater( [](const Initializer& init) { @@ -3798,6 +3838,8 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) thisObject->m_bunSleepThenCallback.visit(visitor); thisObject->m_lazyTestModuleObject.visit(visitor); thisObject->m_lazyPreloadTestModuleObject.visit(visitor); + thisObject->m_commonJSModuleObjectStructure.visit(visitor); + thisObject->m_commonJSFunctionArgumentsStructure.visit(visitor); thisObject->m_cachedGlobalObjectStructure.visit(visitor); thisObject->m_cachedGlobalProxyStructure.visit(visitor); -- cgit v1.2.3