luaur_code_gen/functions/
translate_builtin_buffer_read.rs1use crate::enums::builtin_impl_type::BuiltinImplType;
2use crate::enums::ir_cmd::IrCmd;
3use crate::functions::translate_buffer_args_and_check_bounds::translate_buffer_args_and_check_bounds;
4use crate::records::builtin_impl_result::BuiltinImplResult;
5use crate::records::ir_builder::IrBuilder;
6use crate::records::ir_op::IrOp;
7use luaur_vm::enums::lua_type::lua_Type;
8
9pub fn translate_builtin_buffer_read(
10 build: &mut IrBuilder,
11 nparams: i32,
12 ra: i32,
13 arg: i32,
14 args: IrOp,
15 arg3: IrOp,
16 nresults: i32,
17 pcpos: i32,
18 read_cmd: IrCmd,
19 size: i32,
20 conv_cmd: IrCmd,
21 store_cmd: IrCmd,
22 store_tag: u8,
23) -> BuiltinImplResult {
24 if nparams < 2 || nresults > 1 {
25 return BuiltinImplResult {
26 r#type: BuiltinImplType::None,
27 actual_result_count: -1,
28 };
29 }
30
31 let mut buf = IrOp::ir_op();
32 let mut int_index = IrOp::ir_op();
33
34 translate_buffer_args_and_check_bounds(
35 build,
36 nparams,
37 arg,
38 args,
39 arg3,
40 size,
41 pcpos,
42 &mut buf,
43 &mut int_index,
44 false,
45 );
46
47 let tag_buffer = build.const_tag(lua_Type::LUA_TBUFFER as u8);
48 let result = build.inst_ir_cmd_ir_op_ir_op_ir_op(read_cmd, buf, int_index, tag_buffer);
49
50 let value_to_store = if conv_cmd == IrCmd::NOP {
51 result
52 } else {
53 build.inst_ir_cmd_ir_op(conv_cmd, result)
54 };
55
56 let ra_vm_reg = build.vm_reg(ra as u8);
57 build.inst_ir_cmd_ir_op_ir_op(store_cmd, ra_vm_reg, value_to_store);
58 let tag = build.const_tag(store_tag);
59 build.inst_ir_cmd_ir_op_ir_op(IrCmd::STORE_TAG, ra_vm_reg, tag);
60
61 BuiltinImplResult {
62 r#type: BuiltinImplType::Full,
63 actual_result_count: 1,
64 }
65}