2023-03-01 00:58:53 +03:00
|
|
|
module builtin
|
|
|
|
|
2023-03-04 12:24:33 +03:00
|
|
|
fn __heap_base() voidptr
|
|
|
|
fn __memory_size() usize
|
|
|
|
fn __memory_grow(size usize) usize
|
2023-03-01 00:58:53 +03:00
|
|
|
fn __memory_fill(dest &u8, value isize, size isize)
|
|
|
|
fn __memory_copy(dest &u8, src &u8, size isize)
|
2023-03-04 12:24:33 +03:00
|
|
|
|
2023-07-12 15:24:38 +03:00
|
|
|
// add doc comments for the below functions
|
|
|
|
|
|
|
|
// __reinterpret_f32_u32 converts a `u32` to a `f32` without changing the bit pattern.
|
|
|
|
pub fn __reinterpret_f32_u32(v f32) u32
|
|
|
|
|
|
|
|
// __reinterpret_u32_f32 converts a `f32` to a `u32` without changing the bit pattern.
|
|
|
|
pub fn __reinterpret_u32_f32(v u32) f32
|
|
|
|
|
|
|
|
// __reinterpret_f64_u64 converts a `u64` to a `f64` without changing the bit pattern.
|
|
|
|
pub fn __reinterpret_f64_u64(v f64) u64
|
|
|
|
|
|
|
|
// __reinterpret_u64_f64 converts a `f64` to a `u64` without changing the bit pattern.
|
|
|
|
pub fn __reinterpret_u64_f64(v u64) f64
|
|
|
|
|
2023-03-04 12:24:33 +03:00
|
|
|
// vcalloc dynamically allocates a zeroed `n` bytes block of memory on the heap.
|
|
|
|
// vcalloc returns a `byteptr` pointing to the memory address of the allocated space.
|
|
|
|
// Unlike `v_calloc` vcalloc checks for negative values given in `n`.
|
|
|
|
[unsafe]
|
|
|
|
pub fn vcalloc(n isize) &u8 {
|
|
|
|
if n <= 0 {
|
|
|
|
panic('vcalloc(n <= 0)')
|
|
|
|
} else if n == 0 {
|
|
|
|
return &u8(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
res := unsafe { malloc(n) }
|
|
|
|
|
|
|
|
__memory_fill(res, 0, n)
|
|
|
|
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
// isnil returns true if an object is nil (only for C objects).
|
|
|
|
[inline]
|
|
|
|
pub fn isnil(v voidptr) bool {
|
|
|
|
return v == 0
|
|
|
|
}
|
|
|
|
|
|
|
|
// vmemcpy copies n bytes from memory area src to memory area dest.
|
|
|
|
// The memory areas **CAN** overlap. vmemcpy returns a pointer to `dest`.
|
|
|
|
[unsafe]
|
|
|
|
pub fn vmemcpy(dest voidptr, const_src voidptr, n isize) voidptr {
|
|
|
|
__memory_copy(dest, const_src, n)
|
|
|
|
return dest
|
|
|
|
}
|
|
|
|
|
|
|
|
// vmemmove copies n bytes from memory area src to memory area dest.
|
|
|
|
// The memory areas **CAN** overlap. vmemmove returns a pointer to `dest`.
|
|
|
|
[unsafe]
|
|
|
|
pub fn vmemmove(dest voidptr, const_src voidptr, n isize) voidptr {
|
|
|
|
__memory_copy(dest, const_src, n)
|
|
|
|
return dest
|
|
|
|
}
|
|
|
|
|
|
|
|
// vmemset fills the first `n` bytes of the memory area pointed to by `s`,
|
|
|
|
// with the constant byte `c`. It returns a pointer to the memory area `s`.
|
|
|
|
[unsafe]
|
|
|
|
pub fn vmemset(s voidptr, c int, n isize) voidptr {
|
|
|
|
__memory_fill(s, c, n)
|
|
|
|
return s
|
|
|
|
}
|