mirror of
https://github.com/bearlanguageorg/bear.git
synced 2026-08-26 16:07:01 +00:00
64 lines
1.3 KiB
V
64 lines
1.3 KiB
V
// value.v — tagged value encoding and helpers for the VuurRaaf VM.
|
|
//
|
|
// Stack values are 64-bit tagged integers with two tag bits:
|
|
// low bits 00 -> encoded number (value = raw << 2)
|
|
// low bits 01 -> string handle (handle = value >> 2, into v.strings)
|
|
// low bits 10 -> struct handle (handle = value >> 2, into v.structs)
|
|
// low bits 11 -> array handle (handle = value >> 2, into v.arrays)
|
|
module vm
|
|
|
|
fn (mut v Vm) is_str(x i64) bool {
|
|
return x & 3 == 1
|
|
}
|
|
|
|
fn (mut v Vm) is_arr(x i64) bool {
|
|
return x & 3 == 3
|
|
}
|
|
|
|
fn (mut v Vm) is_struct(x i64) bool {
|
|
return x & 3 == 2
|
|
}
|
|
|
|
fn (mut v Vm) enc_int(x i64) i64 {
|
|
return u64(x) << 2
|
|
}
|
|
|
|
fn (mut v Vm) dec_int(x i64) i64 {
|
|
return x >> 2
|
|
}
|
|
|
|
fn (mut v Vm) hand(x i64) int {
|
|
return int(x >> 2)
|
|
}
|
|
|
|
fn (mut v Vm) mkstr(idx int) i64 {
|
|
return (u64(idx) << 2) | 1
|
|
}
|
|
|
|
fn (mut v Vm) mkarr(idx int) i64 {
|
|
return (u64(idx) << 2) | 3
|
|
}
|
|
|
|
fn (mut v Vm) mkstruct_handle(idx int) i64 {
|
|
return (u64(idx) << 2) | 2
|
|
}
|
|
|
|
fn (mut v Vm) truthy(x i64) bool {
|
|
return x != 0
|
|
}
|
|
|
|
fn (mut v Vm) valid_handle(x i64) bool {
|
|
h := v.hand(x)
|
|
return h >= 0 && h < v.strings.len
|
|
}
|
|
|
|
fn (mut v Vm) valid_arr_handle(x i64) bool {
|
|
h := v.hand(x)
|
|
return h >= 0 && h < v.arrays.len
|
|
}
|
|
|
|
fn (mut v Vm) valid_struct_handle(x i64) bool {
|
|
h := v.hand(x)
|
|
return h >= 0 && h < v.structs.len
|
|
}
|