From 7ceb30bdf17534b38369c174ce8373bf8e3e52d2 Mon Sep 17 00:00:00 2001 From: iddev5 Date: Thu, 7 Jul 2022 18:33:29 +0530 Subject: [PATCH] js-runtime: Add constructor calling capability (new operator on Js types) --- js-runtime/src/js-runtime.js | 11 +++++++++++ js-runtime/src/main.zig | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/js-runtime/src/js-runtime.js b/js-runtime/src/js-runtime.js index c71184b5..4d1ae9ff 100644 --- a/js-runtime/src/js-runtime.js +++ b/js-runtime/src/js-runtime.js @@ -308,6 +308,17 @@ const zig = { zig.functionCall(values[id], undefined, args, args_len, ret_ptr); }, + zigConstructType(id, args, args_len, ret_ptr) { + let memory = new MemoryBlock(zig.wasm.exports.memory.buffer); + let argv = []; + for (let i = 0; i < args_len; i += 1) { + argv.push(zig.readObject(memory.slice(args + i * 16), memory)); + } + + const result = zig.addValue(new values[id](argv)); + zig.writeObject(memory.slice(ret_ptr), result, 0); + }, + wzLogWrite(str, len) { let memory = new MemoryBlock(zig.wasm.exports.memory.buffer); log_buf += memory.getString(str, len); diff --git a/js-runtime/src/main.zig b/js-runtime/src/main.zig index b84f911d..d584d6be 100644 --- a/js-runtime/src/main.zig +++ b/js-runtime/src/main.zig @@ -17,6 +17,7 @@ const js = struct { extern fn zigDeleteIndex(id: u64, index: u32) void; extern fn zigFunctionCall(id: u64, name: [*]const u8, len: u32, args: ?*const anyopaque, args_len: u32, ret_ptr: *anyopaque) void; extern fn zigFunctionInvoke(id: u64, args: ?*const anyopaque, args_len: u32, ret_ptr: *anyopaque) void; + extern fn zigConstructType(id: u64, args: ?*const anyopaque, args_len: u32, ret_ptr: *anyopaque) void; extern fn zigCleanupObject(id: u64) void; }; @@ -142,6 +143,12 @@ pub const Function = struct { return .{ .tag = .func_zig, .val = .{ .ref = func.ref } }; } + pub fn construct(func: *const Function, args: []const Value) Value { + var ret: Value = undefined; + js.zigConstructType(func.ref, args.ptr, args.len, &ret); + return ret; + } + pub fn invoke(func: *const Function, args: []const Value) Value { var ret: Value = undefined; js.zigFunctionInvoke(func.ref, args.ptr, args.len, &ret); @@ -202,3 +209,10 @@ pub fn createFunction(fun: FunType) Function { } return .{ .ref = js.zigCreateFunction(&fun) }; } + +pub fn constructType(t: []const u8, args: []const Value) Value { + const constructor = global().get(t).value(.func, null); + defer constructor.deinit(); + + return constructor.construct(args); +}