Skip to main content

luaur_compiler/methods/
compiler_compiler.rs

1use crate::records::builtin_ast_types::BuiltinAstTypes;
2use crate::records::compile_options::CompileOptions;
3use crate::records::compiler::Compiler;
4use luaur_ast::records::ast_local::AstLocal;
5use luaur_ast::records::ast_name::AstName;
6use luaur_ast::records::ast_name_table::AstNameTable;
7use luaur_ast::records::location::Location;
8use luaur_bytecode::records::bytecode_builder::BytecodeBuilder;
9use luaur_common::records::dense_hash_map::DenseHashMap;
10
11impl Compiler {
12    pub fn compiler(
13        bytecode: &mut BytecodeBuilder,
14        options: &CompileOptions,
15        names: &mut AstNameTable,
16    ) -> Compiler {
17        let export_name = names.get_or_add_c_str(c"__EXP".as_ptr());
18
19        let mut compiler = Compiler {
20            bytecode: bytecode as *mut BytecodeBuilder,
21            options: *options,
22            functions: DenseHashMap::new(core::ptr::null_mut()),
23            locals: DenseHashMap::new(core::ptr::null_mut()),
24            globals: DenseHashMap::new(AstName::default()),
25            variables: DenseHashMap::new(core::ptr::null_mut()),
26            constants: DenseHashMap::new(core::ptr::null_mut()),
27            locstants: DenseHashMap::new(core::ptr::null_mut()),
28            table_constants: DenseHashMap::new(core::ptr::null_mut()),
29            table_shapes: DenseHashMap::new(core::ptr::null_mut()),
30            builtins: DenseHashMap::new(core::ptr::null_mut()),
31            userdata_types: DenseHashMap::new(AstName::default()),
32            function_types: DenseHashMap::new(core::ptr::null_mut()),
33            local_types: DenseHashMap::new(core::ptr::null_mut()),
34            expr_types: DenseHashMap::new(core::ptr::null_mut()),
35            inline_builtins: DenseHashMap::new(core::ptr::null_mut()),
36            inline_builtins_backup: DenseHashMap::new(core::ptr::null_mut()),
37            expr_changes: Vec::new(),
38            local_changes: Vec::new(),
39            builtin_types: BuiltinAstTypes::new(options.vector_type),
40            names: names as *mut AstNameTable,
41            export_table_local: AstLocal::new(
42                export_name,
43                Location::default(),
44                core::ptr::null_mut(),
45                0,
46                0,
47                core::ptr::null_mut(),
48                true,
49            ),
50            builtins_fold: core::ptr::null(),
51            builtins_fold_library_k: false,
52            reg_top: 0,
53            stack_size: 0,
54            arg_count: 0,
55            has_loops: false,
56            current_function: core::ptr::null_mut(),
57            block_depth: 0,
58            getfenv_used: false,
59            setfenv_used: false,
60            local_stack: Vec::new(),
61            upvals: Vec::new(),
62            loop_jumps: Vec::new(),
63            loops: Vec::new(),
64            inline_frames: Vec::new(),
65            captures: Vec::new(),
66            exported_locals: Vec::new(),
67            exported_classes: Vec::new(),
68        };
69
70        compiler.local_stack.reserve(16);
71        compiler.upvals.reserve(16);
72        compiler
73    }
74}
75
76pub fn compiler_compiler(
77    bytecode: &mut BytecodeBuilder,
78    options: &CompileOptions,
79    names: &mut AstNameTable,
80) -> Compiler {
81    Compiler::compiler(bytecode, options, names)
82}