aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/CommonJSModuleRecord.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-05-30 00:24:18 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-05-30 00:24:18 -0700
commitfdbf8a51846747067601e309f47136a5550a1d37 (patch)
treefff5ad0c593a6f1e6362757216513f5a96baef79 /src/bun.js/bindings/CommonJSModuleRecord.cpp
parent8e911d38c4a74d05dac21b8013b1d5228801e55b (diff)
downloadbun-fdbf8a51846747067601e309f47136a5550a1d37.tar.gz
bun-fdbf8a51846747067601e309f47136a5550a1d37.tar.zst
bun-fdbf8a51846747067601e309f47136a5550a1d37.zip
Handle `Object.defineProperty(module, "exports", {get: getter})`
Diffstat (limited to 'src/bun.js/bindings/CommonJSModuleRecord.cpp')
-rw-r--r--src/bun.js/bindings/CommonJSModuleRecord.cpp25
1 files changed, 24 insertions, 1 deletions
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()))