From 00631e66a5ad684db62526607ffa417d0df2d593 Mon Sep 17 00:00:00 2001 From: kayomn Date: Sun, 5 Nov 2023 16:24:06 +0000 Subject: [PATCH] Make named lambdas report their names in errors --- source/ona/kym.zig | 6 +----- source/ona/kym/Chunk.zig | 9 +++++++-- source/ona/kym/Compiler.zig | 6 +----- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/source/ona/kym.zig b/source/ona/kym.zig index 4b411f7..1da2ddd 100644 --- a/source/ona/kym.zig +++ b/source/ona/kym.zig @@ -308,11 +308,7 @@ pub const RuntimeEnv = struct { }; } - const chunk_name = try self.new_string(file_name); - - defer self.discard(chunk_name); - - break: make_chunk try Chunk.make(self, chunk_name, &root.environment); + break: make_chunk try Chunk.make(self, file_name, &root.environment); }; defer chunk.free(self); diff --git a/source/ona/kym/Chunk.zig b/source/ona/kym/Chunk.zig index f763819..e7a5f9b 100644 --- a/source/ona/kym/Chunk.zig +++ b/source/ona/kym/Chunk.zig @@ -576,9 +576,9 @@ pub fn free(self: *Self, env: *kym.RuntimeEnv) void { self.bindings = &.{}; } -pub fn make(env: *kym.RuntimeEnv, name: *const kym.RuntimeRef, environment: *const tree.Environment) kym.RuntimeError!Self { +pub fn make(env: *kym.RuntimeEnv, name: []const coral.io.Byte, environment: *const tree.Environment) kym.RuntimeError!Self { var chunk = Self{ - .name = name.acquire(), + .name = try env.new_symbol(name), .opcodes = OpcodeList.make(env.allocator), .constants = ConstList.make(env.allocator), .bindings = &.{}, @@ -634,6 +634,7 @@ pub const typeinfo = &kym.Typeinfo{ .name = "lambda", .destruct = typeinfo_destruct, .call = typeinfo_call, + .to_string = typeinfo_to_string, }; fn typeinfo_call(env: *kym.RuntimeEnv, userdata: []coral.io.Byte, frame: kym.Frame) kym.RuntimeError!?*kym.RuntimeRef { @@ -653,3 +654,7 @@ fn typeinfo_call(env: *kym.RuntimeEnv, userdata: []coral.io.Byte, frame: kym.Fra fn typeinfo_destruct(env: *kym.RuntimeEnv, userdata: []coral.io.Byte) void { @as(*Self, @ptrCast(@alignCast(userdata))).free(env); } + +fn typeinfo_to_string(env: *kym.RuntimeEnv, userdata: []coral.io.Byte) coral.io.AllocationError!*kym.RuntimeRef { + return env.to_string(@as(*Self, @ptrCast(@alignCast(userdata))).name); +} diff --git a/source/ona/kym/Compiler.zig b/source/ona/kym/Compiler.zig index c34ea56..c963884 100644 --- a/source/ona/kym/Compiler.zig +++ b/source/ona/kym/Compiler.zig @@ -86,11 +86,7 @@ fn compile_expression(self: Self, environment: *const tree.Environment, expressi }, .lambda_construct => |lambda_construct| { - const anonymous_chunk_name = try self.env.new_symbol(name orelse ""); - - defer self.env.discard(anonymous_chunk_name); - - var chunk = try Chunk.make(self.env, anonymous_chunk_name, lambda_construct.environment); + var chunk = try Chunk.make(self.env, name orelse "", lambda_construct.environment); errdefer chunk.free(self.env);