93 lines
2.5 KiB
V
93 lines
2.5 KiB
V
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
|
// Use of this source code is governed by an MIT license
|
|
// that can be found in the LICENSE file.
|
|
module builtin
|
|
|
|
__global (
|
|
g_m2_buf byteptr
|
|
g_m2_ptr byteptr
|
|
)
|
|
|
|
// isnil returns true if an object is nil (only for C objects).
|
|
pub fn isnil(v voidptr) bool {
|
|
return v == 0
|
|
}
|
|
|
|
/*
|
|
fn on_panic(f fn(int)int) {
|
|
// TODO
|
|
}
|
|
*/
|
|
|
|
// print_backtrace shows a backtrace of the current call stack on stdout
|
|
pub fn print_backtrace() {
|
|
// at the time of backtrace_symbols_fd call, the C stack would look something like this:
|
|
// 1 frame for print_backtrace_skipping_top_frames
|
|
// 1 frame for print_backtrace itself
|
|
// ... print the rest of the backtrace frames ...
|
|
// => top 2 frames should be skipped, since they will not be informative to the developer
|
|
print_backtrace_skipping_top_frames(2)
|
|
}
|
|
|
|
__global (
|
|
total_m = i64(0)
|
|
nr_mallocs = int(0)
|
|
)
|
|
|
|
fn __as_cast(obj voidptr, obj_type int, expected_type int) voidptr {
|
|
if obj_type != expected_type {
|
|
panic('as cast: cannot cast $obj_type to $expected_type')
|
|
}
|
|
return obj
|
|
}
|
|
|
|
// VAssertMetaInfo is used during assertions. An instance of it
|
|
// is filled in by compile time generated code, when an assertion fails.
|
|
pub struct VAssertMetaInfo {
|
|
pub:
|
|
fpath string // the source file path of the assertion
|
|
line_nr int // the line number of the assertion
|
|
fn_name string // the function name in which the assertion is
|
|
src string // the actual source line of the assertion
|
|
op string // the operation of the assertion, i.e. '==', '<', 'call', etc ...
|
|
llabel string // the left side of the infix expressions as source
|
|
rlabel string // the right side of the infix expressions as source
|
|
lvalue string // the stringified *actual value* of the left side of a failed assertion
|
|
rvalue string // the stringified *actual value* of the right side of a failed assertion
|
|
}
|
|
fn __print_assert_failure(i &VAssertMetaInfo) {
|
|
eprintln('${i.fpath}:${i.line_nr+1}: FAIL: fn ${i.fn_name}: assert ${i.src}')
|
|
if i.op.len > 0 && i.op != 'call' {
|
|
eprintln(' left value: ${i.llabel} = ${i.lvalue}')
|
|
if i.rlabel == i.rvalue {
|
|
eprintln(' right value: $i.rlabel')
|
|
}
|
|
else {
|
|
eprintln(' right value: ${i.rlabel} = ${i.rvalue}')
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct MethodArgs {
|
|
pub:
|
|
typ int
|
|
}
|
|
|
|
pub struct FunctionData {
|
|
pub:
|
|
name string
|
|
attrs []string
|
|
args []MethodArgs
|
|
return_type int
|
|
typ int
|
|
}
|
|
|
|
pub struct FieldData {
|
|
pub:
|
|
name string
|
|
attrs []string
|
|
is_pub bool
|
|
is_mut bool
|
|
typ int
|
|
}
|