Refactor Kym #47
|
@ -2075,12 +2075,18 @@ pub const Typeinfo = struct {
|
||||||
userdata: []coral.io.Byte,
|
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);
|
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,
|
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);
|
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);
|
coral.debug.assert(self.env.locals.values.len > 1);
|
||||||
|
|
||||||
if (self.env.locals.values[self.env.locals.values.len - 2]) |value| {
|
return self.env.push(self.env.locals.values[self.env.locals.values.len - 2]);
|
||||||
return value.internal().acquire();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ fn typeinfo_destruct(context: kym.Typeinfo.DestructContext) void {
|
||||||
|
|
||||||
fn typeinfo_get(context: kym.Typeinfo.GetContext) kym.RuntimeError!?*kym.RuntimeObj {
|
fn typeinfo_get(context: kym.Typeinfo.GetContext) kym.RuntimeError!?*kym.RuntimeObj {
|
||||||
const table = @as(*Self, @ptrCast(@alignCast(context.userdata)));
|
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);
|
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 {
|
fn typeinfo_set(context: kym.Typeinfo.SetContext) kym.RuntimeError!void {
|
||||||
const table = @as(*Self, @ptrCast(@alignCast(context.userdata)));
|
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);
|
errdefer context.env.release(index);
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ fn typeinfo_set(context: kym.Typeinfo.SetContext) kym.RuntimeError!void {
|
||||||
context.env.release(replacing);
|
context.env.release(replacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (context.get_value()) |value| {
|
if ((try context.push_value()).pop()) |value| {
|
||||||
errdefer context.env.release(value);
|
errdefer context.env.release(value);
|
||||||
|
|
||||||
maybe_replacing.* = 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| {
|
if (table.associative.remove(index)) |removed| {
|
||||||
context.env.release(removed.key);
|
context.env.release(removed.key);
|
||||||
context.env.release(removed.value);
|
context.env.release(removed.value);
|
||||||
|
|
Loading…
Reference in New Issue