use super::typed_object::TypedObject;
use super::conversion::format_value_word;
#[allow(dead_code)]
pub extern "C" fn jit_v2_retain_typed_object(ptr: *const u8) {
if ptr.is_null() {
return;
}
let obj = ptr as *mut TypedObject;
unsafe {
(*obj).inc_ref();
}
}
#[allow(dead_code)]
pub extern "C" fn jit_v2_release_typed_object(ptr: *const u8) {
if ptr.is_null() {
return;
}
let obj = ptr as *mut TypedObject;
unsafe {
(*obj).dec_ref();
}
}
pub const V2_TYPE_TAG_INT: u8 = 1;
pub const V2_TYPE_TAG_NUMBER: u8 = 2;
pub const V2_TYPE_TAG_BOOL: u8 = 3;
pub const V2_TYPE_TAG_STRING: u8 = 4;
pub const V2_TYPE_TAG_NANBOXED: u8 = 0;
#[unsafe(no_mangle)]
pub extern "C" fn jit_v2_print_int(value: i64) {
println!("{}", value);
}
#[unsafe(no_mangle)]
pub extern "C" fn jit_v2_print_number(value: f64) {
if value.is_finite() && value == value.trunc() && value.abs() < 1e15 {
println!("{}", value as i64);
} else {
println!("{}", value);
}
}
#[unsafe(no_mangle)]
pub extern "C" fn jit_v2_print_bool(value: u8) {
if value != 0 {
println!("true");
} else {
println!("false");
}
}
#[unsafe(no_mangle)]
pub extern "C" fn jit_v2_print_string(ptr: *const u8) {
if ptr.is_null() {
println!("null");
return;
}
let string_ref = unsafe { &*(ptr.add(8) as *const String) };
println!("{}", string_ref);
}
pub extern "C" fn jit_v2_print_typed_native(value_bits: u64, type_tag: u8) {
match type_tag {
V2_TYPE_TAG_INT => {
println!("{}", value_bits as i64);
}
V2_TYPE_TAG_NUMBER => {
let f = f64::from_bits(value_bits);
if f.is_finite() && f == f.trunc() && f.abs() < 1e15 {
println!("{}", f as i64);
} else {
println!("{}", f);
}
}
V2_TYPE_TAG_BOOL => {
if value_bits != 0 {
println!("true");
} else {
println!("false");
}
}
V2_TYPE_TAG_STRING => {
let ptr = value_bits as *const u8;
if ptr.is_null() {
println!("null");
} else {
let string_ref = unsafe { &*(ptr.add(8) as *const String) };
println!("{}", string_ref);
}
}
_ => {
println!("{}", format_value_word(value_bits));
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_v2_retain_release_null_is_noop() {
jit_v2_retain_typed_object(std::ptr::null());
jit_v2_release_typed_object(std::ptr::null());
}
#[test]
fn test_v2_print_typed_int() {
jit_v2_print_typed_native(42u64, V2_TYPE_TAG_INT);
}
#[test]
fn test_v2_print_typed_number() {
let f: f64 = 3.14;
jit_v2_print_typed_native(f.to_bits(), V2_TYPE_TAG_NUMBER);
}
#[test]
fn test_v2_print_typed_bool() {
jit_v2_print_typed_native(1, V2_TYPE_TAG_BOOL);
jit_v2_print_typed_native(0, V2_TYPE_TAG_BOOL);
}
}