js-runtime: Add constructor calling capability (new operator on Js types)

This commit is contained in:
iddev5 2022-07-07 18:33:29 +05:30 committed by Stephen Gutekanst
parent 97e5c57bc8
commit 7ceb30bdf1
2 changed files with 25 additions and 0 deletions

View file

@ -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);

View file

@ -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);
}