diff options
author | 2023-05-30 00:24:18 -0700 | |
---|---|---|
committer | 2023-05-30 00:24:18 -0700 | |
commit | fdbf8a51846747067601e309f47136a5550a1d37 (patch) | |
tree | fff5ad0c593a6f1e6362757216513f5a96baef79 /src/bun.js/bindings/CommonJSModuleRecord.cpp | |
parent | 8e911d38c4a74d05dac21b8013b1d5228801e55b (diff) | |
download | bun-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.cpp | 25 |
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())) |