From 38ed8680cb1e8089c3749d7d1949b88a9dcf4e52 Mon Sep 17 00:00:00 2001 From: Chen Kai <281165273grape@gmail.com> Date: Mon, 13 Jul 2026 09:47:28 -0400 Subject: [PATCH] fix(dsl): support class pointer arguments --- examples/js_dsl/mod.test.ts | 13 +++++++++++++ examples/js_dsl/mod.zig | 5 +++++ src/js/wrap_function.zig | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/examples/js_dsl/mod.test.ts b/examples/js_dsl/mod.test.ts index a09f71b..42db759 100644 --- a/examples/js_dsl/mod.test.ts +++ b/examples/js_dsl/mod.test.ts @@ -227,6 +227,19 @@ describe("Counter class", () => { expect(c.getCount()).toEqual(2); }); + it("passes class pointers to exported functions", () => { + const c = new mod.Counter(3); + mod.incrementCounter(c); + expect(c.getCount()).toEqual(4); + }); + + it("rejects the wrong class for pointer arguments", () => { + expectTypeErrorWithMessage( + () => mod.incrementCounter(new mod.Buffer(4)), + "Argument 1 must be an instance of mod.Counter", + ); + }); + it("isAbove returns boolean", () => { const c = new mod.Counter(10); expect(c.isAbove(5)).toBe(true); diff --git a/examples/js_dsl/mod.zig b/examples/js_dsl/mod.zig index 25b6326..99f5438 100644 --- a/examples/js_dsl/mod.zig +++ b/examples/js_dsl/mod.zig @@ -272,6 +272,11 @@ pub const Counter = struct { } }; +/// Increment a counter passed as a class pointer argument. +pub fn incrementCounter(counter: *Counter) void { + counter.count += 1; +} + /// A resource-owning buffer class demonstrating deinit. pub const Buffer = struct { pub const js_meta = js.class(.{}); diff --git a/src/js/wrap_function.zig b/src/js/wrap_function.zig index a3a36bb..fcaf689 100644 --- a/src/js/wrap_function.zig +++ b/src/js/wrap_function.zig @@ -167,7 +167,7 @@ pub fn convertArg(comptime T: type, raw: napi.c.napi_value, env: napi.c.napi_env } switch (@typeInfo(T)) { .pointer => |ptr| { - if (ptr.size == .one and class_meta.isClassType(ptr.child)) { + if (comptime ptr.size == .one and class_meta.isClassType(ptr.child)) { const e = napi.Env{ .env = env }; return e.unwrapChecked(ptr.child, value, class_runtime.typeTag(ptr.child)) catch error.TypeMismatch; }