Changeset 503 for trunk/thune/thune.c

Show
Ignore:
Timestamp:
01/21/08 16:21:29 (10 months ago)
Author:
krobillard
Message:

Iter/each can now take skip value on stack. Each.set works again.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/thune/thune.c

    r502 r503  
    601601                    break; 
    602602 
    603                 case OP_ITER:           // (series blk -- ) 
     603                case OP_ITER:           // (series blk [skip] -- ) 
    604604                case OP_EACH: 
    605                     if( ur_is(UR_TOS, UT_BLOCK) && 
    606                         (ur_itLen( ut, ur_s_prev(UR_TOS) ) > 0) ) 
    607                     { 
    608                         int itype = (ur_opcode(val) == OP_ITER) ? 
     605                { 
     606                    int itype; 
     607                    int skip; 
     608 
     609                    if( ur_is(UR_TOS, UT_INT) ) 
     610                    { 
     611                        skip = ur_int(UR_TOS); 
     612                        UR_S_DROP; 
     613                    } 
     614                    else 
     615                    { 
     616                        skip = ur_sel(val); 
     617                    } 
     618 
     619                    if( ! ur_is(UR_TOS, UT_BLOCK) ) 
     620                    { 
     621                        ur_throwErr( UR_ERR_DATATYPE, 
     622                             "iter/each expected block! for body" ); 
     623                        goto throw_cc; 
     624                    } 
     625 
     626                    if( ur_itLen( ut, ur_s_prev(UR_TOS) ) > 0 ) 
     627                    { 
     628                        itype = (ur_opcode(val) == OP_ITER) ? 
    609629                                    CC_ITER : CC_EACH; 
    610                         int skip = ur_sel(val); 
    611                         if( skip == 0 ) 
    612                             skip = 1; 
    613630 
    614631                        PUSHC_EVAL( blkN, start, pc ); 
     
    620637                        //ur_copyCell( ut->toc, UR_TOS ); 
    621638                        UR_TOC->iter.code = itype; 
    622                         UR_TOC->iter.skip = skip; 
     639                        UR_TOC->iter.skip = skip ? skip : 1; 
    623640                        ut->toc->series.n   = UR_TOS->series.n; 
    624641                        ut->toc->series.it  = UR_TOS->series.it; 
     
    634651                        UR_S_DROPN(2); 
    635652                    } 
     653                } 
    636654                    break; 
    637655