Skip to main content

luaur_code_gen/functions/
translate_builtin_assert.rs

1use crate::enums::builtin_impl_type::BuiltinImplType;
2use crate::enums::ir_cmd::IrCmd;
3use crate::records::builtin_impl_result::BuiltinImplResult;
4use crate::records::ir_builder::IrBuilder;
5use crate::records::ir_op::IrOp;
6
7pub fn translate_builtin_assert(
8    build: &mut IrBuilder,
9    nparams: i32,
10    _ra: i32,
11    arg: i32,
12    _args: IrOp,
13    nresults: i32,
14    pcpos: i32,
15) -> BuiltinImplResult {
16    if nparams < 1 || nresults != 0 {
17        return BuiltinImplResult {
18            r#type: BuiltinImplType::None,
19            actual_result_count: -1,
20        };
21    }
22
23    let arg_reg = build.vm_reg(arg as u8);
24    let tag = build.inst_ir_cmd_ir_op(IrCmd::LOAD_TAG, arg_reg);
25
26    let arg_reg = build.vm_reg(arg as u8);
27    let value = build.inst_ir_cmd_ir_op(IrCmd::LOAD_INT, arg_reg);
28
29    let exit_op = build.vm_exit(pcpos as u32);
30    build.inst_ir_cmd_ir_op_ir_op_ir_op(IrCmd::CHECK_TRUTHY, tag, value, exit_op);
31
32    BuiltinImplResult {
33        r#type: BuiltinImplType::UsesFallback,
34        actual_result_count: 0,
35    }
36}