Skip to content

Commit e2733e4

Browse files
committed
fix vararg
1 parent 847bcbd commit e2733e4

File tree

1 file changed

+25
-58
lines changed

1 file changed

+25
-58
lines changed

crates/luars/src/lua_vm/execute/control_instructions.rs

Lines changed: 25 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -841,70 +841,37 @@ pub fn exec_call(
841841
}
842842
}
843843

844+
// Use slow path for vararg functions
845+
if is_vararg {
846+
return exec_call_lua_vararg(
847+
vm,
848+
func_id,
849+
a,
850+
b,
851+
c,
852+
base,
853+
max_stack_size,
854+
num_params,
855+
code_ptr,
856+
constants_ptr,
857+
upvalues_ptr,
858+
frame_ptr_ptr,
859+
);
860+
}
861+
844862
let return_count = if c == 0 { usize::MAX } else { c - 1 };
845863

846864
// Ensure stack capacity
847865
let required_size = new_base + max_stack_size;
848866
vm.ensure_stack_capacity(required_size);
849867

850-
// Setup stack for new frame (without allocation)
851-
let actual_stack_size = if is_vararg {
852-
num_params
853-
} else {
854-
max_stack_size
855-
};
856-
857-
// Initialize stack in one pass using unsafe for maximum speed
858-
let nil_val = LuaValue::nil();
859-
let reg_ptr = vm.register_stack.as_mut_ptr();
860-
861-
unsafe {
862-
// Fill undefined parameters with nil
863-
if arg_count < num_params {
864-
for i in arg_count..actual_stack_size {
865-
*reg_ptr.add(new_base + i) = nil_val;
866-
}
867-
} else if !is_vararg {
868-
// Fill unused stack slots with nil (no vararg case)
869-
let fill_start = num_params.max(arg_count);
870-
for i in fill_start..actual_stack_size {
871-
*reg_ptr.add(new_base + i) = nil_val;
872-
}
873-
}
874-
875-
// Handle vararg: store extra arguments after fixed parameters
876-
if is_vararg && arg_count > num_params {
877-
let vararg_count = arg_count - num_params;
878-
let vararg_start = new_base + max_stack_size;
879-
let total_stack_size = max_stack_size + vararg_count;
880-
881-
// Ensure capacity for varargs
882-
if new_base + total_stack_size > vm.register_stack.len() {
883-
vm.ensure_stack_capacity(new_base + total_stack_size);
884-
}
885-
886-
// Move varargs to after max_stack
887-
let reg_ptr = vm.register_stack.as_mut_ptr();
888-
for i in 0..vararg_count {
889-
*reg_ptr.add(vararg_start + i) = *reg_ptr.add(new_base + num_params + i);
890-
}
891-
892-
// Clear the slots that held varargs
893-
for i in num_params..max_stack_size {
894-
*reg_ptr.add(new_base + i) = nil_val;
895-
}
896-
}
897-
898-
// Handle vararg case: clear slots after fixed params
899-
if is_vararg && arg_count > 0 {
900-
let total_stack_size = if arg_count > num_params {
901-
max_stack_size + (arg_count - num_params)
902-
} else {
903-
max_stack_size
904-
};
905-
let actual_stack_size = num_params;
906-
for i in actual_stack_size..total_stack_size {
907-
*reg_ptr.add(new_base + i) = nil_val;
868+
// Fill missing arguments with nil (non-vararg fast path)
869+
if arg_count < num_params {
870+
unsafe {
871+
let reg_ptr = vm.register_stack.as_mut_ptr().add(new_base);
872+
let nil_val = LuaValue::nil();
873+
for i in arg_count..num_params {
874+
*reg_ptr.add(i) = nil_val;
908875
}
909876
}
910877
}

0 commit comments

Comments
 (0)