Skip to main content

luaur_code_gen/functions/
translate_builtin_buffer_read.rs

1use 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}