Skip to main content

luaur_code_gen/functions/
translate_builtin_buffer_write.rs

1use crate::enums::builtin_impl_type::BuiltinImplType;
2use crate::enums::ir_cmd::IrCmd;
3use crate::functions::builtin_load_double::builtin_load_double;
4use crate::functions::builtin_load_int_64::builtin_load_int_64;
5use crate::functions::translate_buffer_args_and_check_bounds::translate_buffer_args_and_check_bounds;
6use crate::records::builtin_impl_result::BuiltinImplResult;
7use crate::records::ir_builder::IrBuilder;
8use crate::records::ir_op::IrOp;
9use luaur_vm::enums::lua_type::lua_Type;
10
11pub fn translate_builtin_buffer_write(
12    build: &mut IrBuilder,
13    nparams: i32,
14    _ra: i32,
15    arg: i32,
16    args: IrOp,
17    arg3: IrOp,
18    nresults: i32,
19    pcpos: i32,
20    write_cmd: IrCmd,
21    size: i32,
22    conv_cmd: IrCmd,
23    load_int_64: bool,
24) -> BuiltinImplResult {
25    if nparams < 3 || nresults > 0 {
26        return BuiltinImplResult {
27            r#type: BuiltinImplType::None,
28            actual_result_count: -1,
29        };
30    }
31
32    let mut buf = IrOp::ir_op();
33    let mut int_index = IrOp::ir_op();
34
35    translate_buffer_args_and_check_bounds(
36        build,
37        nparams,
38        arg,
39        args,
40        arg3,
41        size,
42        pcpos,
43        &mut buf,
44        &mut int_index,
45        load_int_64,
46    );
47
48    let num_value = if load_int_64 {
49        builtin_load_int_64(build, arg3)
50    } else {
51        builtin_load_double(build, arg3)
52    };
53
54    let value_to_write = if conv_cmd == IrCmd::NOP {
55        num_value
56    } else {
57        build.inst_ir_cmd_ir_op(conv_cmd, num_value)
58    };
59
60    let tag_buffer = build.const_tag(lua_Type::LUA_TBUFFER as u8);
61
62    build.inst_ir_cmd_ir_op_ir_op_ir_op_ir_op(
63        write_cmd,
64        buf,
65        int_index,
66        value_to_write,
67        tag_buffer,
68    );
69
70    BuiltinImplResult {
71        r#type: BuiltinImplType::Full,
72        actual_result_count: 0,
73    }
74}