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