luaur-compile-cli 0.1.2

Command-line Luau source-to-bytecode compiler (Rust).
Documentation
use crate::functions::serialize_block_linearization_stats::{
    serialize_block_linearization_stats, FILE,
};
use crate::functions::serialize_function_stats::serialize_function_stats;
use crate::macros::write_name::WRITE_NAME;
use crate::macros::write_pair::WRITE_PAIR;
use luaur_code_gen::records::block_linearization_stats::BlockLinearizationStats;
use luaur_code_gen::records::function_stats::FunctionStats;
use luaur_code_gen::records::lowering_stats::LoweringStats;

extern "C" {
    pub fn fprintf(fp: *mut FILE, format: *const core::ffi::c_char, ...) -> core::ffi::c_int;
}

#[allow(non_camel_case_types)]
pub mod libc {
    pub use super::fprintf;
}

pub fn serialize_lowering_stats(fp: *mut core::ffi::c_void, stats: &LoweringStats) {
    let fp_file = fp as *mut FILE;
    unsafe {
        fprintf(fp_file, c"{\n".as_ptr());

        WRITE_PAIR!(fp_file, stats, "            ", total_functions, "%u,\n");
        WRITE_PAIR!(fp_file, stats, "            ", skipped_functions, "%u,\n");
        WRITE_PAIR!(fp_file, stats, "            ", spills_to_slot, "%d,\n");
        WRITE_PAIR!(fp_file, stats, "            ", spills_to_restore, "%d,\n");
        WRITE_PAIR!(
            fp_file,
            stats,
            "            ",
            max_spill_slots_used,
            "%u,\n"
        );
        WRITE_PAIR!(fp_file, stats, "            ", blocks_pre_opt, "%u,\n");
        WRITE_PAIR!(fp_file, stats, "            ", blocks_post_opt, "%u,\n");
        WRITE_PAIR!(
            fp_file,
            stats,
            "            ",
            max_block_instructions,
            "%u,\n"
        );
        WRITE_PAIR!(fp_file, stats, "            ", reg_alloc_errors, "%d,\n");
        WRITE_PAIR!(fp_file, stats, "            ", lowering_errors, "%d,\n");

        WRITE_NAME!(fp_file, "            ", block_linearization_stats);
        serialize_block_linearization_stats(fp_file, &stats.block_linearization_stats);
        fprintf(fp_file, c",\n".as_ptr());

        WRITE_NAME!(fp_file, "            ", functions);
        let function_count = stats.functions.len();

        if function_count == 0 {
            fprintf(fp_file, c"[]".as_ptr());
        } else {
            fprintf(fp_file, c"[\n".as_ptr());
            for i in 0..function_count {
                serialize_function_stats(fp, &stats.functions[i]);
                if i < function_count - 1 {
                    fprintf(fp_file, c",\n".as_ptr());
                }
            }
            fprintf(fp_file, c"\n            ]".as_ptr());
        }

        fprintf(fp_file, c"\n        }".as_ptr());
    }
}