Skip to main content

luaur_code_gen/functions/
load_double_or_constant.rs

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