luaur_bytecode_cli/functions/
main.rs1use 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}