aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/modules/ObjectModule.cpp
diff options
context:
space:
mode:
authorGravatar Dylan Conway <dylan.conway567@gmail.com> 2023-09-11 12:02:02 -0700
committerGravatar Dylan Conway <dylan.conway567@gmail.com> 2023-09-11 12:02:02 -0700
commitbd359df23c6c98bfe071d14311b01510f82f2662 (patch)
tree8e5c6c7c1ed961e94719855d21895eb5af0422cc /src/bun.js/modules/ObjectModule.cpp
parent6bc5098e7ea51e86c6a62a00f12fc56b067494ce (diff)
parent350403663e5ece8b1d09adce3a3594f8e05bf8f1 (diff)
downloadbun-bd359df23c6c98bfe071d14311b01510f82f2662.tar.gz
bun-bd359df23c6c98bfe071d14311b01510f82f2662.tar.zst
bun-bd359df23c6c98bfe071d14311b01510f82f2662.zip
Merge branch 'main' into dylan/cli-fixes
Diffstat (limited to 'src/bun.js/modules/ObjectModule.cpp')
-rw-r--r--src/bun.js/modules/ObjectModule.cpp77
1 files changed, 76 insertions, 1 deletions
diff --git a/src/bun.js/modules/ObjectModule.cpp b/src/bun.js/modules/ObjectModule.cpp
index 4272bec4e..ebb4af32e 100644
--- a/src/bun.js/modules/ObjectModule.cpp
+++ b/src/bun.js/modules/ObjectModule.cpp
@@ -5,7 +5,41 @@ JSC::SyntheticSourceProvider::SyntheticSourceGenerator
generateObjectModuleSourceCode(JSC::JSGlobalObject *globalObject,
JSC::JSObject *object) {
JSC::VM &vm = globalObject->vm();
+ gcProtectNullTolerant(object);
+ return [object](JSC::JSGlobalObject *lexicalGlobalObject,
+ JSC::Identifier moduleKey,
+ Vector<JSC::Identifier, 4> &exportNames,
+ JSC::MarkedArgumentBuffer &exportValues) -> void {
+ JSC::VM &vm = lexicalGlobalObject->vm();
+ GlobalObject *globalObject =
+ reinterpret_cast<GlobalObject *>(lexicalGlobalObject);
+ JSC::EnsureStillAliveScope stillAlive(object);
+
+ PropertyNameArray properties(vm, PropertyNameMode::Strings,
+ PrivateSymbolMode::Exclude);
+ object->getPropertyNames(globalObject, properties,
+ DontEnumPropertiesMode::Exclude);
+ gcUnprotectNullTolerant(object);
+ for (auto &entry : properties) {
+ exportNames.append(entry);
+
+ auto scope = DECLARE_CATCH_SCOPE(vm);
+ JSValue value = object->get(globalObject, entry);
+ if (scope.exception()) {
+ scope.clearException();
+ value = jsUndefined();
+ }
+ exportValues.append(value);
+ }
+ };
+}
+
+JSC::SyntheticSourceProvider::SyntheticSourceGenerator
+generateObjectModuleSourceCodeForJSON(JSC::JSGlobalObject *globalObject,
+ JSC::JSObject *object) {
+ JSC::VM &vm = globalObject->vm();
+ gcProtectNullTolerant(object);
return [object](JSC::JSGlobalObject *lexicalGlobalObject,
JSC::Identifier moduleKey,
Vector<JSC::Identifier, 4> &exportNames,
@@ -19,11 +53,52 @@ generateObjectModuleSourceCode(JSC::JSGlobalObject *globalObject,
PrivateSymbolMode::Exclude);
object->getPropertyNames(globalObject, properties,
DontEnumPropertiesMode::Exclude);
+ gcUnprotectNullTolerant(object);
for (auto &entry : properties) {
+ if (entry == vm.propertyNames->defaultKeyword) {
+ continue;
+ }
+
exportNames.append(entry);
- exportValues.append(object->get(globalObject, entry));
+
+ auto scope = DECLARE_CATCH_SCOPE(vm);
+ JSValue value = object->get(globalObject, entry);
+ if (scope.exception()) {
+ scope.clearException();
+ value = jsUndefined();
+ }
+ exportValues.append(value);
}
+
+ exportNames.append(vm.propertyNames->defaultKeyword);
+ exportValues.append(object);
+ };
+}
+
+JSC::SyntheticSourceProvider::SyntheticSourceGenerator
+generateJSValueModuleSourceCode(JSC::JSGlobalObject *globalObject,
+ JSC::JSValue value) {
+
+ if (value.isObject() && !JSC::isJSArray(value)) {
+ return generateObjectModuleSourceCodeForJSON(globalObject,
+ value.getObject());
+ }
+
+ if (value.isCell())
+ gcProtectNullTolerant(value.asCell());
+ return [value](JSC::JSGlobalObject *lexicalGlobalObject,
+ JSC::Identifier moduleKey,
+ Vector<JSC::Identifier, 4> &exportNames,
+ JSC::MarkedArgumentBuffer &exportValues) -> void {
+ JSC::VM &vm = lexicalGlobalObject->vm();
+ GlobalObject *globalObject =
+ reinterpret_cast<GlobalObject *>(lexicalGlobalObject);
+ exportNames.append(vm.propertyNames->defaultKeyword);
+ exportValues.append(value);
+
+ if (value.isCell())
+ gcUnprotectNullTolerant(value.asCell());
};
}
} // namespace Zig \ No newline at end of file