luaur_code_gen/functions/
translate_builtin_string_len.rs1use 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}