luaur_code_gen/functions/
load_double_or_constant.rs1use crate::enums::ir_cmd::IrCmd;
2use crate::enums::ir_op_kind::IrOpKind;
3use crate::functions::vm_const_op::vm_const_op;
4use crate::macros::codegen_assert::CODEGEN_ASSERT;
5use crate::records::ir_builder::IrBuilder;
6use crate::records::ir_op::IrOp;
7use luaur_vm::type_aliases::t_value::TValue;
8
9pub fn load_double_or_constant(build: &mut IrBuilder, arg: IrOp) -> IrOp {
10 if arg.kind() == IrOpKind::VmConst {
11 CODEGEN_ASSERT!(!build.function.proto.is_null());
12 let protok_idx = vm_const_op(arg) as usize;
13 let protok: TValue = unsafe { *(*build.function.proto).k.add(protok_idx) };
14 CODEGEN_ASSERT!(protok.tt == luaur_vm::enums::lua_type::lua_Type::LUA_TNUMBER as i32);
15 return build.const_double(unsafe { protok.value.n });
16 }
17
18 build.inst_ir_cmd_ir_op(IrCmd::LOAD_DOUBLE, arg)
19}