Unify calling interface for object accesses in Kym
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details

This commit is contained in:
kayomn 2023-11-12 20:12:04 +00:00
parent b0aa7166f9
commit 70746b4680
2 changed files with 29 additions and 17 deletions

View File

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

View File

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