Skip to main content

luaur_code_gen/functions/
log_function_header.rs

1use luaur_vm::macros::getstr::getstr;
2
3use crate::functions::try_find_local_name::try_find_local_name;
4use crate::traits::LogAppend;
5
6#[allow(non_snake_case)]
7pub unsafe fn log_function_header(
8    build: &mut dyn LogAppend,
9    proto: *mut luaur_vm::records::proto::Proto,
10) {
11    let debugname = (*proto).debugname;
12    if !debugname.is_null() {
13        let name = getstr(debugname as *const _);
14        let name_str = unsafe { core::ffi::CStr::from_ptr(name).to_string_lossy() };
15        build.log_append(format_args!("; function {}(", name_str));
16    } else {
17        build.log_append(format_args!("; function("));
18    }
19
20    for i in 0..(*proto).numparams as i32 {
21        let name = try_find_local_name(proto, i, 0);
22        if !name.is_null() {
23            let name_str = unsafe { core::ffi::CStr::from_ptr(name).to_string_lossy() };
24            if i == 0 {
25                build.log_append(format_args!("{}", name_str));
26            } else {
27                build.log_append(format_args!(", {}", name_str));
28            }
29        } else {
30            if i == 0 {
31                build.log_append(format_args!("$arg{}", i));
32            } else {
33                build.log_append(format_args!(", $arg{}", i));
34            }
35        }
36    }
37
38    if (*proto).numparams != 0 && (*proto).is_vararg != 0 {
39        build.log_append(format_args!(", ...)"));
40    } else {
41        build.log_append(format_args!(")"));
42    }
43
44    if (*proto).linedefined >= 0 {
45        build.log_append(format_args!(" line {}\n", (*proto).linedefined));
46    } else {
47        build.log_append(format_args!("\n"));
48    }
49}