Skip to main content

luaur_bytecode_cli/functions/
main.rs

1use alloc::string::String;
2use alloc::vec::Vec;
3use core::ffi::c_char;
4
5use luaur_cli_lib::functions::get_source_files::get_source_files;
6use luaur_cli_lib::functions::set_luau_flags_default::set_luau_flags_default;
7use luaur_code_gen::records::function_bytecode_summary::FunctionBytecodeSummary;
8use luaur_common::functions::assert_handler::assert_handler;
9
10use crate::functions::analyze_file::analyze_file;
11use crate::functions::assertion_handler::assertion_handler;
12use crate::functions::parse_args::parse_args;
13use crate::functions::serialize_summaries::serialize_summaries;
14
15unsafe extern "C" fn assertion_handler_adapter(
16    expr: *const c_char,
17    file: *const c_char,
18    line: i32,
19    function: *const c_char,
20) -> i32 {
21    assertion_handler(expr, file, line, function)
22}
23
24pub fn main(argc: i32, argv: *mut *mut i8) -> i32 {
25    *assert_handler() = Some(assertion_handler_adapter);
26
27    set_luau_flags_default();
28
29    let mut summary_file = String::from("bytecode-summary.json");
30    let nesting_limit = 0;
31
32    if !parse_args(argc, argv, &mut summary_file) {
33        return 1;
34    }
35
36    let files = get_source_files(argc, argv);
37    let file_count = files.len();
38
39    let mut script_summaries: Vec<Vec<FunctionBytecodeSummary>> = Vec::new();
40    script_summaries.reserve(file_count);
41
42    for file in &files {
43        let mut script_summary = Vec::new();
44
45        if !analyze_file(file, nesting_limit, &mut script_summary) {
46            return 1;
47        }
48
49        script_summaries.push(script_summary);
50    }
51
52    let summary_file_with_nul = String::from(summary_file.clone() + "\0");
53
54    if !serialize_summaries(&files, &script_summaries, &summary_file_with_nul) {
55        return 1;
56    }
57
58    println!("Bytecode summary written to '{}'", summary_file);
59
60    0
61}