diff options
Diffstat (limited to 'src/javascript/jsc')
-rw-r--r-- | src/javascript/jsc/webcore/response.zig | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/javascript/jsc/webcore/response.zig b/src/javascript/jsc/webcore/response.zig index 680e8aa06..8b698bdea 100644 --- a/src/javascript/jsc/webcore/response.zig +++ b/src/javascript/jsc/webcore/response.zig @@ -105,16 +105,30 @@ pub const Response = struct { arguments: []const js.JSValueRef, exception: js.ExceptionRef, ) js.JSValueRef { - defer this.body.value = .Empty; var zig_string = ZigString.init(""); + var deallocate = false; + defer { + if (deallocate) { + if (this.body.value == .Unconsumed) { + this.body.ptr_allocator.?.free(this.body.ptr.?[0..this.body.len]); + this.body.ptr_allocator = null; + this.body.ptr = null; + this.body.len = 0; + } + } + + this.body.value = .Empty; + } - var js_string = (js.JSValueCreateJSONString( + var json_value = (js.JSValueMakeFromJSONString( ctx, brk: { switch (this.body.value) { .Unconsumed => { if (this.body.ptr) |_ptr| { zig_string = ZigString.init(_ptr[0..this.body.len]); + deallocate = true; + break :brk zig_string.toJSStringRef(); } @@ -133,8 +147,6 @@ pub const Response = struct { }, } }, - 0, - exception, ) orelse { var out = std.fmt.bufPrint(&temp_error_buffer, "Invalid JSON\n\n \"{s}\"", .{zig_string.slice()[0..std.math.min(zig_string.len, 4000)]}) catch unreachable; error_arg_list[0] = ZigString.init(out).toValueGC(VirtualMachine.vm.global).asRef(); @@ -150,16 +162,10 @@ pub const Response = struct { ), ).asRef(); }); - defer js.JSStringRelease(js_string); return JSPromise.resolvedPromiseValue( VirtualMachine.vm.global, - JSValue.fromRef( - js.JSValueMakeString( - ctx, - js_string, - ), - ), + JSValue.fromRef(json_value), ).asRef(); } pub fn getArrayBuffer( |