From fdbf8a51846747067601e309f47136a5550a1d37 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Tue, 30 May 2023 00:24:18 -0700 Subject: Handle `Object.defineProperty(module, "exports", {get: getter})` --- src/bun.js/bindings/CommonJSModuleRecord.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/bun.js/bindings/CommonJSModuleRecord.cpp') diff --git a/src/bun.js/bindings/CommonJSModuleRecord.cpp b/src/bun.js/bindings/CommonJSModuleRecord.cpp index 8b4fdf60a..f70fff10d 100644 --- a/src/bun.js/bindings/CommonJSModuleRecord.cpp +++ b/src/bun.js/bindings/CommonJSModuleRecord.cpp @@ -356,6 +356,7 @@ JSC::SourceCode createCommonJSModule( if (UNLIKELY(throwScope.exception())) { globalObject->requireMap()->remove(globalObject, requireMapKey); + throwScope.release(); return; } @@ -373,11 +374,31 @@ JSC::SourceCode createCommonJSModule( if (throwScope.exception()) { globalObject->requireMap()->remove(globalObject, requireMapKey); + throwScope.release(); return; } JSValue result = moduleObject->exportsObject(); + if (!result.isEmpty() && (result.isGetterSetter() || result.isCustomGetterSetter())) { + auto* clientData = WebCore::clientData(vm); + + // TODO: is there a faster way to call these getters? We shouldn't need to do a full property lookup. + // + // we use getIfPropertyExists just incase a pathological devleoper did: + // + // - Object.defineProperty(module, 'exports', {get: getter}) + // - delete module.exports + // + result = moduleObject->getIfPropertyExists(globalObject, clientData->builtinNames().exportsPublicName()); + + if (UNLIKELY(throwScope.exception())) { + globalObject->requireMap()->remove(globalObject, requireMapKey); + throwScope.release(); + return; + } + } + globalObject->requireMap()->set(globalObject, requireMapKey, result); exportNames.append(vm.propertyNames->defaultKeyword); @@ -412,8 +433,10 @@ JSC::SourceCode createCommonJSModule( } else { JSC::PropertyNameArray properties(vm, JSC::PropertyNameMode::Strings, JSC::PrivateSymbolMode::Exclude); exports->methodTable()->getOwnPropertyNames(exports, globalObject, properties, DontEnumPropertiesMode::Exclude); - if (throwScope.exception()) + if (throwScope.exception()) { + throwScope.release(); return; + } for (auto property : properties) { if (UNLIKELY(property.isEmpty() || property.isNull())) -- cgit v1.2.3