native: use builtin exit function (#24578)

This commit is contained in:
Eliyaan (Nopana) 2025-05-29 09:23:46 +02:00 committed by GitHub
parent eeeef41030
commit 464e297351
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 66 additions and 6 deletions

View File

@ -1757,7 +1757,7 @@ fn (mut c Amd64) sar8(r Amd64Register, val u8) {
pub fn (mut c Amd64) call_fn(node ast.CallExpr) {
name := node.name
mut n := name
if !n.contains('.') {
if !n.contains('.') && n !in c.g.fn_addr.keys() { // if the name is in keys, it is a function from builtin
n = 'main.${n}'
}
if node.is_method {

View File

@ -29,7 +29,19 @@ already compiling functions:
// false: whitelist function
// true: blacklist function
const whitelist = {
'main.main': false
'main.main': false
'exit': false
'gc_is_enabled': false
'int_max': false
'int_min': false
'u8.is_alnum': false
'u8.is_bin_digit': false
'u8.is_capital': false
'u8.is_digit': false
'u8.is_hex_digit': false
'u8.is_letter': false
'u8.is_oct_digit': false
'u8.is_space': false
}
fn (g &Gen) is_blacklisted(name string, is_builtin bool) bool {

View File

@ -19,7 +19,7 @@ mut:
calls []i64 // call addresses
}
pub const inline_builtins = ['assert', 'print', 'eprint', 'println', 'eprintln', 'exit', 'C.syscall'] // classic V builtin functions accessible to the user get inlined
pub const inline_builtins = ['print', 'eprint', 'println', 'eprintln', 'C.syscall'] // classic V builtin functions accessible to the user get inlined
pub fn (mut g Gen) init_builtins() {
g.builtins = {

View File

@ -27,9 +27,6 @@ fn (mut g Gen) expr(node ast.Expr) {
'C.syscall' {
g.code_gen.gen_syscall(node)
}
'exit' {
g.code_gen.gen_exit(node.args[0].expr)
}
'println', 'print', 'eprintln', 'eprint' {
expr := node.args[0].expr
typ := node.args[0].typ

View File

@ -1174,6 +1174,7 @@ fn (mut g Gen) println(comment string) {
@[noreturn]
pub fn (mut g Gen) n_error(s string) {
print_backtrace()
util.verror('native error', s)
}

View File

@ -0,0 +1,46 @@
/* uncomment when floats are supported
println(f32_abs(32.32))
println(f32_abs(-32.32))
println(f32_max(32.32, -32.32))
println(f32_max(-32.32, 32.32))
println(f32_min(32.32, -32.32))
println(f32_min(-32.32, 32.32))
println(f64_abs(32.32))
println(f64_abs(-32.32))
println(f64_max(32.32, -32.32))
println(f64_max(-32.32, 32.32))
println(f64_min(32.32, -32.32))
println(f64_min(-32.32, 32.32))
*/
/* uncomment when C variables are working like C.stdout
flush_stderr()
flush_stdout()
*/
gc_is_enabled() // not yet enabled so only calling it
println(int_max(32, -32))
println(int_max(-32, 32))
println(int_min(32, -32))
println(int_min(-32, 32))
// print_character(`a`) enable when C vars will work
assert u8(`a`).is_alnum()
assert !u8(`_`).is_alnum()
assert u8(`0`).is_bin_digit()
assert !u8(`3`).is_bin_digit()
assert u8(`A`).is_capital()
assert !u8(`a`).is_capital()
assert u8(`0`).is_digit()
assert !u8(`a`).is_digit()
assert u8(`A`).is_hex_digit()
assert !u8(`G`).is_hex_digit()
assert u8(`c`).is_letter()
assert !u8(`2`).is_letter()
assert u8(`7`).is_oct_digit()
assert !u8(`8`).is_oct_digit()
assert u8(` `).is_space()
assert !u8(`_`).is_space()
exit(0)

View File

@ -0,0 +1,4 @@
32
32
-32
-32