@@ -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