aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/api/ffi.zig
diff options
context:
space:
mode:
authorGravatar Carter Snook <cartersnook04@gmail.com> 2022-08-03 16:05:38 -0500
committerGravatar GitHub <noreply@github.com> 2022-08-03 14:05:38 -0700
commit033eebce2970c9cdd9dfc0fa3248f283d949d54d (patch)
treee11ed27ff54676f303f396fe8f183bc755a4c012 /src/bun.js/api/ffi.zig
parent40a187f0de7a18330ac572a1d70e9402c8cbeeae (diff)
downloadbun-033eebce2970c9cdd9dfc0fa3248f283d949d54d.tar.gz
bun-033eebce2970c9cdd9dfc0fa3248f283d949d54d.tar.zst
bun-033eebce2970c9cdd9dfc0fa3248f283d949d54d.zip
refactor: create a high-level property iterator (#972)
This also fixes multiple memory leaks double frees.
Diffstat (limited to 'src/bun.js/api/ffi.zig')
-rw-r--r--src/bun.js/api/ffi.zig20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/bun.js/api/ffi.zig b/src/bun.js/api/ffi.zig
index 1e21330e5..afe442096 100644
--- a/src/bun.js/api/ffi.zig
+++ b/src/bun.js/api/ffi.zig
@@ -559,20 +559,18 @@ pub const FFI = struct {
pub fn generateSymbols(global: *JSGlobalObject, symbols: *std.StringArrayHashMapUnmanaged(Function), object: JSC.JSValue) !?JSValue {
const allocator = VirtualMachine.vm.allocator;
- var keys = JSC.C.JSObjectCopyPropertyNames(global.ref(), object.asObjectRef());
- defer JSC.C.JSPropertyNameArrayRelease(keys);
- const count = JSC.C.JSPropertyNameArrayGetCount(keys);
+ var symbols_iter = JSC.JSPropertyIterator(.{
+ .skip_empty_name = true,
+ .name_encoding = .utf8,
+ .include_value = true,
+ }).init(global.ref(), object.asObjectRef());
+ defer symbols_iter.deinit();
- try symbols.ensureTotalCapacity(allocator, count);
+ try symbols.ensureTotalCapacity(allocator, symbols_iter.len);
- var i: usize = 0;
- while (i < count) : (i += 1) {
- var property_name_ref = JSC.C.JSPropertyNameArrayGetNameAtIndex(keys, i);
- const len = JSC.C.JSStringGetLength(property_name_ref);
- if (len == 0) continue;
- var prop = JSC.C.JSStringGetCharacters8Ptr(property_name_ref)[0..len];
+ while (symbols_iter.next()) |prop| {
+ const value = symbols_iter.value;
- var value = JSC.JSValue.c(JSC.C.JSObjectGetProperty(global.ref(), object.asObjectRef(), property_name_ref, null));
if (value.isEmptyOrUndefinedOrNull()) {
return JSC.toTypeError(JSC.Node.ErrorCode.ERR_INVALID_ARG_VALUE, "Expected an object for key \"{s}\"", .{prop}, global.ref());
}