Skip to main content

luaur_code_gen/functions/
translate_builtin_string_len.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;
6use luaur_vm::enums::lua_type::lua_Type;
7
8pub fn translate_builtin_string_len(
9    build: &mut IrBuilder,
10    nparams: i32,
11    ra: i32,
12    arg: i32,
13    _args: IrOp,
14    nresults: i32,
15    pcpos: i32,
16) -> BuiltinImplResult {
17    if nparams < 1 || nresults > 1 {
18        return BuiltinImplResult {
19            r#type: BuiltinImplType::None,
20            actual_result_count: -1,
21        };
22    }
23
24    let vm_reg_arg = build.vm_reg(arg as u8);
25    let vm_exit = build.vm_exit(pcpos as u32);
26    build.load_and_check_tag(vm_reg_arg, lua_Type::LUA_TSTRING as u8, vm_exit);
27
28    let vm_reg_arg_for_load = build.vm_reg(arg as u8);
29    let ts = build.inst_ir_cmd_ir_op(IrCmd::LOAD_POINTER, vm_reg_arg_for_load);
30    let len = build.inst_ir_cmd_ir_op(IrCmd::STRING_LEN, ts);
31
32    let ra_reg = build.vm_reg(ra as u8);
33    let len_num = build.inst_ir_cmd_ir_op(IrCmd::INT_TO_NUM, len);
34    build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_DOUBLE, ra_reg, len_num);
35    let tag = build.const_tag(lua_Type::LUA_TNUMBER as u8);
36    build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TAG, ra_reg, tag);
37
38    BuiltinImplResult {
39        r#type: BuiltinImplType::Full,
40        actual_result_count: 1,
41    }
42}