@@ -605,13 +605,13 @@ x*/ static REBINT Do_Args_Light(REBVAL *func, REBVAL *path, REBSER *block, REBCN
605
605
606
606
/***********************************************************************
607
607
**
608
- */ static REBINT Do_Args (REBVAL * func , REBVAL * path , REBSER * block , REBCNT index )
608
+ */ static REBINT Do_Args (REBCNT func_offset , REBVAL * path , REBSER * block , REBCNT index )
609
609
/*
610
610
** Evaluate code block according to the function arg spec.
611
611
** Args are pushed onto the data stack in the same order
612
612
** as the function frame.
613
613
**
614
- ** func : function or path value
614
+ ** func_offset : offset of the function or path value, relative to DS_Base
615
615
** path: refinements or object/function path
616
616
** block: current evaluation block
617
617
** index: current evaluation index
@@ -625,11 +625,15 @@ x*/ static REBINT Do_Args_Light(REBVAL *func, REBVAL *path, REBSER *block, REBCN
625
625
REBINT dsp = DSP + 1 ; // stack base
626
626
REBINT dsf = dsp - DSF_BIAS ;
627
627
REBVAL * tos ;
628
+ REBVAL * func ;
628
629
629
- if (IS_OP (func )) dsf -- ; // adjust for extra arg
630
+ if ((dsp + 100 ) > (REBINT )SERIES_REST (DS_Series )) {
631
+ Expand_Stack (STACK_MIN );
632
+ }
630
633
631
- if ((dsp + 100 ) > (REBINT )SERIES_REST (DS_Series ))
632
- Trap0 (RE_STACK_OVERFLOW ); //Expand_Stack();
634
+ func = & DS_Base [func_offset ];
635
+
636
+ if (IS_OP (func )) dsf -- ; // adjust for extra arg
633
637
634
638
// Get list of words:
635
639
words = VAL_FUNC_WORDS (func );
@@ -654,6 +658,8 @@ x*/ static REBINT Do_Args_Light(REBVAL *func, REBVAL *path, REBSER *block, REBCN
654
658
ds = dsp ;
655
659
for (; NOT_END (args ); args ++ , ds ++ ) {
656
660
661
+ func = & DS_Base [func_offset ]; //DS_Base could be changed
662
+
657
663
//if (Trace_Flags) Trace_Arg(ds - dsp, args, path);
658
664
659
665
// Process each formal argument:
@@ -865,7 +871,8 @@ x*/ static REBINT Do_Args_Light(REBVAL *func, REBVAL *path, REBSER *block, REBCN
865
871
Debug_Value (word , 4 , 0 );
866
872
Dump_Values (value , 4 );
867
873
}
868
- index = Do_Args (value , 0 , block , index + 1 ); // uses old DSF, updates DSP
874
+ index = Do_Args (dsf + 3 , 0 , block , index + 1 ); // uses old DSF, updates DSP
875
+ value = DSF_FUNC (dsf ); //reevaluate value, because stack could be expanded in Do_Args
869
876
eval_func2 :
870
877
// Evaluate the function:
871
878
DSF = dsf ; // Set new DSF
@@ -924,8 +931,10 @@ x*/ static REBINT Do_Args_Light(REBVAL *func, REBVAL *path, REBSER *block, REBCN
924
931
// Can be object/func or func/refinements or object/func/refinement:
925
932
dsf = Push_Func (TRUE, block , index , VAL_WORD_SYM (word ), value ); // Do not unset TOS1 (it is the value)
926
933
value = DS_TOP ;
927
- index = Do_Args ( value , word + 1 , block , index + 1 ) ;
934
+ REBCNT offset = value - DS_Base ;
928
935
ftype = VAL_TYPE (value )- REB_NATIVE ;
936
+ index = Do_Args (offset , word + 1 , block , index + 1 );
937
+ value = & DS_Base [offset ]; //restore in case the stack is expanded
929
938
goto eval_func2 ;
930
939
} else
931
940
index ++ ;
@@ -1368,6 +1377,7 @@ x*/ static REBINT Do_Args_Light(REBVAL *func, REBVAL *path, REBSER *block, REBCN
1368
1377
1369
1378
// Evaluate the function:
1370
1379
DSF = dsf ;
1380
+ func = DSF_FUNC (dsf ); //stack could be expanded
1371
1381
Func_Dispatch [ftype ](func );
1372
1382
DSP = dsf ;
1373
1383
DSF = PRIOR_DSF (dsf );
0 commit comments