diff --git a/source/ona/kym.zig b/source/ona/kym.zig index 971fe23..09fae63 100644 --- a/source/ona/kym.zig +++ b/source/ona/kym.zig @@ -2075,12 +2075,18 @@ pub const Typeinfo = struct { userdata: []coral.io.Byte, /// - /// TODO: + /// Pushes the index object of the get operation to the top of the stack. /// - pub fn get_index(self: *const GetContext) *RuntimeObj { + /// *Note* the index is guaranteed to be a non-`null` value. + /// + /// A [RuntimeError] is returned if the virtual machine is out of memory. + /// + /// The [RuntimeEnv] is returned for function chaining. + /// + pub fn push_index(self: *const GetContext) RuntimeError!*RuntimeEnv { coral.debug.assert(self.env.locals.values.len > 0); - return self.env.locals.values[self.env.locals.values.len - 1].?.internal().acquire(); + return self.env.push(self.env.locals.values[self.env.locals.values.len - 1]); } }; @@ -2092,25 +2098,31 @@ pub const Typeinfo = struct { userdata: []coral.io.Byte, /// - /// TODO: + /// Pushes the index object of the set operation to the top of the stack. /// - pub fn get_index(self: *const SetContext) *RuntimeObj { + /// *Note* the index is guaranteed to be a non-`null` value. + /// + /// A [RuntimeError] is returned if the virtual machine is out of memory. + /// + /// The [RuntimeEnv] is returned for function chaining. + /// + pub fn push_index(self: *const SetContext) RuntimeError!*RuntimeEnv { coral.debug.assert(self.env.locals.values.len > 0); - return self.env.locals.values[self.env.locals.values.len - 1].?.internal().acquire(); + return self.env.push(self.env.locals.values[self.env.locals.values.len - 1]); } /// - /// TODO: + /// Pushes the value of the set operation to the top of the stack. /// - pub fn get_value(self: *const SetContext) ?*RuntimeObj { + /// A [RuntimeError] is returned if the virtual machine is out of memory. + /// + /// The [RuntimeEnv] is returned for function chaining. + /// + pub fn push_value(self: *const SetContext) RuntimeError!*RuntimeEnv { coral.debug.assert(self.env.locals.values.len > 1); - if (self.env.locals.values[self.env.locals.values.len - 2]) |value| { - return value.internal().acquire(); - } - - return null; + return self.env.push(self.env.locals.values[self.env.locals.values.len - 2]); } }; diff --git a/source/ona/kym/Table.zig b/source/ona/kym/Table.zig index fad9327..26b5d11 100644 --- a/source/ona/kym/Table.zig +++ b/source/ona/kym/Table.zig @@ -57,7 +57,7 @@ fn typeinfo_destruct(context: kym.Typeinfo.DestructContext) void { fn typeinfo_get(context: kym.Typeinfo.GetContext) kym.RuntimeError!?*kym.RuntimeObj { const table = @as(*Self, @ptrCast(@alignCast(context.userdata))); - const index = context.get_index(); + const index = (try context.push_index()).pop().?; defer context.env.release(index); @@ -81,7 +81,7 @@ fn typeinfo_get(context: kym.Typeinfo.GetContext) kym.RuntimeError!?*kym.Runtime fn typeinfo_set(context: kym.Typeinfo.SetContext) kym.RuntimeError!void { const table = @as(*Self, @ptrCast(@alignCast(context.userdata))); - const index = context.get_index(); + const index = (try context.push_index()).pop().?; errdefer context.env.release(index); @@ -98,7 +98,7 @@ fn typeinfo_set(context: kym.Typeinfo.SetContext) kym.RuntimeError!void { context.env.release(replacing); } - if (context.get_value()) |value| { + if ((try context.push_value()).pop()) |value| { errdefer context.env.release(value); maybe_replacing.* = value; @@ -110,7 +110,7 @@ fn typeinfo_set(context: kym.Typeinfo.SetContext) kym.RuntimeError!void { } } - const value = context.get_value() orelse { + const value = (try context.push_value()).pop() orelse { if (table.associative.remove(index)) |removed| { context.env.release(removed.key); context.env.release(removed.value);