Changeset 22183 for v6

Show
Ignore:
Timestamp:
09/07/08 20:02:24 (3 months ago)
Author:
ruoso
Message:

[smop] implementing the array iterator... some weirdness is still happening, the test is still failing... but it is mostly working

Location:
v6/smop
Files:
9 modified

Legend:

Unmodified
Added
Removed
  • v6/smop/CMakeLists.txt

    r22180 r22183  
    7171    src/smop_s1p_code.sm0p 
    7272    src/smop_s1p_map.sm0p 
     73    src/smop_s1p_array_iterator.sm0p 
    7374) 
    7475compile_sm0p (${sm0p_file}) 
     
    9091    src/smop_mold.c 
    9192    src/smop_s1p_array.c 
     93    src/smop_s1p_array_iterator.c 
    9294    src/smop_s1p_attribute.c 
    9395    src/smop_s1p_capturize.c 
  • v6/smop/include/smop_identifiers.h

    r22092 r22183  
    2626extern SMOP__Object* SMOP__ID__continues;         /* "continues" */ 
    2727extern SMOP__Object* SMOP__ID__copy;              /* "copy" */ 
     28extern SMOP__Object* SMOP__ID__count;             /* "count" */ 
    2829extern SMOP__Object* SMOP__ID__create_container;  /* "create_container" */ 
    2930extern SMOP__Object* SMOP__ID__CREATE;            /* "CREATE" */ 
     
    3637extern SMOP__Object* SMOP__ID__does;              /* "does" */ 
    3738extern SMOP__Object* SMOP__ID__drop;              /* "drop" */ 
    38 extern SMOP__Object* SMOP__ID__elems;          /* "elems" */ 
     39extern SMOP__Object* SMOP__ID__elems;             /* "elems" */ 
    3940extern SMOP__Object* SMOP__ID__eval;              /* "eval" */ 
    4041extern SMOP__Object* SMOP__ID__exists;            /* "exists" */ 
     
    5152extern SMOP__Object* SMOP__ID__HOW_methods;       /* "^methods" */ 
    5253extern SMOP__Object* SMOP__ID__identifier;        /* "identifier" */ 
    53 extern SMOP__Object* SMOP__ID__infix_eq;                    /* "infix:eq" */  
    54 extern SMOP__Object* SMOP__ID__infix_num_gt;                /* "infix:>" */  
     54extern SMOP__Object* SMOP__ID__infix_eq;          /* "infix:eq" */  
     55extern SMOP__Object* SMOP__ID__infix_num_gt;      /* "infix:>" */  
     56extern SMOP__Object* SMOP__ID__input_array;       /* "input_array" */  
    5557extern SMOP__Object* SMOP__ID__invocant;          /* "invocant" */ 
    5658extern SMOP__Object* SMOP__ID__isa;               /* "isa" */ 
     59extern SMOP__Object* SMOP__ID__Iterator;          /* "Iterator" */ 
    5760extern SMOP__Object* SMOP__ID__jail;              /* "jail" */ 
    5861extern SMOP__Object* SMOP__ID__lexical;           /* "lexical" */ 
     
    7477extern SMOP__Object* SMOP__ID__postcircumfix_square;          /* "postcircumfix:[ ]" */ 
    7578extern SMOP__Object* SMOP__ID__postfix_plusplus;              /* "postfix:++" */ 
     79extern SMOP__Object* SMOP__ID__prefix_equal;      /* "prefix:=" */ 
    7680extern SMOP__Object* SMOP__ID__private_name;      /* "private_name" */ 
    7781extern SMOP__Object* SMOP__ID__push;              /* "push" */ 
  • v6/smop/include/smop_s1p.h

    r22136 r22183  
    55extern SMOP__Object* SMOP__S1P__Scalar; 
    66extern SMOP__Object* SMOP__S1P__Array; 
     7extern SMOP__Object* SMOP__S1P__Array_Iterator; 
    78extern SMOP__Object* SMOP__S1P__IO; 
    89extern SMOP__Object* SMOP__S1P__Str; 
  • v6/smop/src/idconst_decl_all.h

    r22092 r22183  
    1414SMOP__Object* SMOP__ID__continues; 
    1515SMOP__Object* SMOP__ID__copy; 
     16SMOP__Object* SMOP__ID__count; 
    1617SMOP__Object* SMOP__ID__create_container; 
    1718SMOP__Object* SMOP__ID__CREATE; 
     
    4142SMOP__Object* SMOP__ID__infix_eq; 
    4243SMOP__Object* SMOP__ID__infix_num_gt; 
     44SMOP__Object* SMOP__ID__input_array; 
    4345SMOP__Object* SMOP__ID__invocant; 
    4446SMOP__Object* SMOP__ID__isa; 
     47SMOP__Object* SMOP__ID__Iterator; 
    4548SMOP__Object* SMOP__ID__jail; 
    4649SMOP__Object* SMOP__ID__lexical; 
     
    6265SMOP__Object* SMOP__ID__postcircumfix_square; 
    6366SMOP__Object* SMOP__ID__postfix_plusplus; 
     67SMOP__Object* SMOP__ID__prefix_equal; 
    6468SMOP__Object* SMOP__ID__private_name; 
    6569SMOP__Object* SMOP__ID__push; 
  • v6/smop/src/idconst_init_all.c

    r22092 r22183  
    1414SMOP__ID__continues = SMOP__NATIVE__idconst_create_nolist( "continues" ); 
    1515SMOP__ID__copy = SMOP__NATIVE__idconst_create_nolist( "copy" ); 
     16SMOP__ID__count = SMOP__NATIVE__idconst_create_nolist( "count" ); 
    1617SMOP__ID__create_container = SMOP__NATIVE__idconst_create_nolist( "create_container" ); 
    1718SMOP__ID__CREATE = SMOP__NATIVE__idconst_create_nolist( "CREATE" ); 
     
    4142SMOP__ID__infix_eq = SMOP__NATIVE__idconst_create_nolist( "infix:eq" ); 
    4243SMOP__ID__infix_num_gt = SMOP__NATIVE__idconst_create_nolist( "infix:>" ); 
     44SMOP__ID__input_array = SMOP__NATIVE__idconst_create_nolist( "input_array" ); 
    4345SMOP__ID__invocant = SMOP__NATIVE__idconst_create_nolist( "invocant" ); 
    4446SMOP__ID__isa = SMOP__NATIVE__idconst_create_nolist( "isa" ); 
     47SMOP__ID__Iterator = SMOP__NATIVE__idconst_create_nolist( "Iterator" ); 
    4548SMOP__ID__jail = SMOP__NATIVE__idconst_create_nolist( "jail" ); 
    4649SMOP__ID__lexical = SMOP__NATIVE__idconst_create_nolist( "lexical" ); 
     
    6265SMOP__ID__postcircumfix_square = SMOP__NATIVE__idconst_create_nolist( "postcircumfix:[ ]" ); 
    6366SMOP__ID__postfix_plusplus = SMOP__NATIVE__idconst_create_nolist( "postfix:++" ); 
     67SMOP__ID__prefix_equal = SMOP__NATIVE__idconst_create_nolist( "prefix:=" ); 
    6468SMOP__ID__private_name = SMOP__NATIVE__idconst_create_nolist( "private_name" ); 
    6569SMOP__ID__push = SMOP__NATIVE__idconst_create_nolist( "push" ); 
     
    98102SMOP__ID__signature = SMOP__NATIVE__idconst_create_nolist( "signature" ); 
    99103SMOP__ID__STORE = SMOP__NATIVE__idconst_create_nolist( "STORE" ); 
    100 constlist_size = 99; 
     104constlist_size = 103; 
    101105constlist = calloc(constlist_size,sizeof(SMOP__Object*)); 
    102106assert(constlist); 
     
    116120constlist[13] = SMOP__ID__continues; 
    117121constlist[14] = SMOP__ID__copy; 
    118 constlist[15] = SMOP__ID__create_container; 
    119 constlist[16] = SMOP__ID__CREATE; 
    120 constlist[17] = SMOP__ID__current; 
    121 constlist[18] = SMOP__ID__debug; 
    122 constlist[19] = SMOP__ID__defined; 
    123 constlist[20] = SMOP__ID__DESTROYALL; 
    124 constlist[21] = SMOP__ID__DESTROY; 
    125 constlist[22] = SMOP__ID__dispatch; 
    126 constlist[23] = SMOP__ID__does; 
    127 constlist[24] = SMOP__ID__drop; 
    128 constlist[25] = SMOP__ID__elems; 
    129 constlist[26] = SMOP__ID__eval; 
    130 constlist[27] = SMOP__ID__exists; 
    131 constlist[28] = SMOP__ID__FETCH; 
    132 constlist[29] = SMOP__ID__forget; 
    133 constlist[30] = SMOP__ID__free; 
    134 constlist[31] = SMOP__ID__goto; 
    135 constlist[32] = SMOP__ID__has_next; 
    136 constlist[33] = SMOP__ID__HOW_attributes; 
    137 constlist[34] = SMOP__ID__HOW_can; 
    138 constlist[35] = SMOP__ID__HOW_CREATE; 
    139 constlist[36] = SMOP__ID__HOW_has; 
    140 constlist[37] = SMOP__ID__HOW_isa; 
    141 constlist[38] = SMOP__ID__HOW_methods; 
    142 constlist[39] = SMOP__ID__identifier; 
    143 constlist[40] = SMOP__ID__infix_eq; 
    144 constlist[41] = SMOP__ID__infix_num_gt; 
    145 constlist[42] = SMOP__ID__invocant; 
    146 constlist[43] = SMOP__ID__isa; 
    147 constlist[44] = SMOP__ID__jail; 
    148 constlist[45] = SMOP__ID__lexical; 
    149 constlist[46] = SMOP__ID__loop; 
    150 constlist[47] = SMOP__ID__mold; 
    151 constlist[48] = SMOP__ID__move_capturize; 
    152 constlist[49] = SMOP__ID__move_identifier; 
    153 constlist[50] = SMOP__ID__move_responder; 
    154 constlist[51] = SMOP__ID__named; 
    155 constlist[52] = SMOP__ID__name; 
    156 constlist[53] = SMOP__ID__new; 
    157 constlist[54] = SMOP__ID__next; 
    158 constlist[55] = SMOP__ID__outer; 
    159 constlist[56] = SMOP__ID__past; 
    160 constlist[57] = SMOP__ID__perl; 
    161 constlist[58] = SMOP__ID__positional; 
    162 constlist[59] = SMOP__ID__postcircumfix_curly; 
    163 constlist[60] = SMOP__ID__postcircumfix_parens; 
    164 constlist[61] = SMOP__ID__postcircumfix_square; 
    165 constlist[62] = SMOP__ID__postfix_plusplus; 
    166 constlist[63] = SMOP__ID__private_name; 
    167 constlist[64] = SMOP__ID__push; 
    168 constlist[65] = SMOP__ID__register; 
    169 constlist[66] = SMOP__ID__REPR_attributes; 
    170 constlist[67] = SMOP__ID__REPR_bless; 
    171 constlist[68] = SMOP__ID__REPR_can; 
    172 constlist[69] = SMOP__ID__REPR_class_storage; 
    173 constlist[70] = SMOP__ID__REPR_clone; 
    174 constlist[71] = SMOP__ID__REPR_CREATE; 
    175 constlist[72] = SMOP__ID__REPR_defined; 
    176 constlist[73] = SMOP__ID__REPR_DESTROY; 
    177 constlist[74] = SMOP__ID__REPR_destroy_instance_storage; 
    178 constlist[75] = SMOP__ID__REPR_destroy_instance_storage_slot; 
    179 constlist[76] = SMOP__ID__REPR_does; 
    180 constlist[77] = SMOP__ID__REPR_has; 
    181 constlist[78] = SMOP__ID__REPR_how; 
    182 constlist[79] = SMOP__ID__REPR_initialize_instance_storage; 
    183 constlist[80] = SMOP__ID__REPR_initialize_instance_storage_slot; 
    184 constlist[81] = SMOP__ID__REPR_instance; 
    185 constlist[82] = SMOP__ID__REPR_instanceof; 
    186 constlist[83] = SMOP__ID__REPR_isa; 
    187 constlist[84] = SMOP__ID__REPR_methods; 
    188 constlist[85] = SMOP__ID__REPR_multimethods; 
    189 constlist[86] = SMOP__ID__REPR_multisubmethods; 
    190 constlist[87] = SMOP__ID__REPR_package; 
    191 constlist[88] = SMOP__ID__REPR_private_storage; 
    192 constlist[89] = SMOP__ID__REPR_properties; 
    193 constlist[90] = SMOP__ID__REPR_submethods; 
    194 constlist[91] = SMOP__ID__REPR_whence; 
    195 constlist[92] = SMOP__ID__REPR_who; 
    196 constlist[93] = SMOP__ID__responder; 
    197 constlist[94] = SMOP__ID__result; 
    198 constlist[95] = SMOP__ID__setr; 
    199 constlist[96] = SMOP__ID__shift; 
    200 constlist[97] = SMOP__ID__signature; 
    201 constlist[98] = SMOP__ID__STORE; 
     122constlist[15] = SMOP__ID__count; 
     123constlist[16] = SMOP__ID__create_container; 
     124constlist[17] = SMOP__ID__CREATE; 
     125constlist[18] = SMOP__ID__current; 
     126constlist[19] = SMOP__ID__debug; 
     127constlist[20] = SMOP__ID__defined; 
     128constlist[21] = SMOP__ID__DESTROYALL; 
     129constlist[22] = SMOP__ID__DESTROY; 
     130constlist[23] = SMOP__ID__dispatch; 
     131constlist[24] = SMOP__ID__does; 
     132constlist[25] = SMOP__ID__drop; 
     133constlist[26] = SMOP__ID__elems; 
     134constlist[27] = SMOP__ID__eval; 
     135constlist[28] = SMOP__ID__exists; 
     136constlist[29] = SMOP__ID__FETCH; 
     137constlist[30] = SMOP__ID__forget; 
     138constlist[31] = SMOP__ID__free; 
     139constlist[32] = SMOP__ID__goto; 
     140constlist[33] = SMOP__ID__has_next; 
     141constlist[34] = SMOP__ID__HOW_attributes; 
     142constlist[35] = SMOP__ID__HOW_can; 
     143constlist[36] = SMOP__ID__HOW_CREATE; 
     144constlist[37] = SMOP__ID__HOW_has; 
     145constlist[38] = SMOP__ID__HOW_isa; 
     146constlist[39] = SMOP__ID__HOW_methods; 
     147constlist[40] = SMOP__ID__identifier; 
     148constlist[41] = SMOP__ID__infix_eq; 
     149constlist[42] = SMOP__ID__infix_num_gt; 
     150constlist[43] = SMOP__ID__input_array; 
     151constlist[44] = SMOP__ID__invocant; 
     152constlist[45] = SMOP__ID__isa; 
     153constlist[46] = SMOP__ID__Iterator; 
     154constlist[47] = SMOP__ID__jail; 
     155constlist[48] = SMOP__ID__lexical; 
     156constlist[49] = SMOP__ID__loop; 
     157constlist[50] = SMOP__ID__mold; 
     158constlist[51] = SMOP__ID__move_capturize; 
     159constlist[52] = SMOP__ID__move_identifier; 
     160constlist[53] = SMOP__ID__move_responder; 
     161constlist[54] = SMOP__ID__named; 
     162constlist[55] = SMOP__ID__name; 
     163constlist[56] = SMOP__ID__new; 
     164constlist[57] = SMOP__ID__next; 
     165constlist[58] = SMOP__ID__outer; 
     166constlist[59] = SMOP__ID__past; 
     167constlist[60] = SMOP__ID__perl; 
     168constlist[61] = SMOP__ID__positional; 
     169constlist[62] = SMOP__ID__postcircumfix_curly; 
     170constlist[63] = SMOP__ID__postcircumfix_parens; 
     171constlist[64] = SMOP__ID__postcircumfix_square; 
     172constlist[65] = SMOP__ID__postfix_plusplus; 
     173constlist[66] = SMOP__ID__prefix_equal; 
     174constlist[67] = SMOP__ID__private_name; 
     175constlist[68] = SMOP__ID__push; 
     176constlist[69] = SMOP__ID__register; 
     177constlist[70] = SMOP__ID__REPR_attributes; 
     178constlist[71] = SMOP__ID__REPR_bless; 
     179constlist[72] = SMOP__ID__REPR_can; 
     180constlist[73] = SMOP__ID__REPR_class_storage; 
     181constlist[74] = SMOP__ID__REPR_clone; 
     182constlist[75] = SMOP__ID__REPR_CREATE; 
     183constlist[76] = SMOP__ID__REPR_defined; 
     184constlist[77] = SMOP__ID__REPR_DESTROY; 
     185constlist[78] = SMOP__ID__REPR_destroy_instance_storage; 
     186constlist[79] = SMOP__ID__REPR_destroy_instance_storage_slot; 
     187constlist[80] = SMOP__ID__REPR_does; 
     188constlist[81] = SMOP__ID__REPR_has; 
     189constlist[82] = SMOP__ID__REPR_how; 
     190constlist[83] = SMOP__ID__REPR_initialize_instance_storage; 
     191constlist[84] = SMOP__ID__REPR_initialize_instance_storage_slot; 
     192constlist[85] = SMOP__ID__REPR_instance; 
     193constlist[86] = SMOP__ID__REPR_instanceof; 
     194constlist[87] = SMOP__ID__REPR_isa; 
     195constlist[88] = SMOP__ID__REPR_methods; 
     196constlist[89] = SMOP__ID__REPR_multimethods; 
     197constlist[90] = SMOP__ID__REPR_multisubmethods; 
     198constlist[91] = SMOP__ID__REPR_package; 
     199constlist[92] = SMOP__ID__REPR_private_storage; 
     200constlist[93] = SMOP__ID__REPR_properties; 
     201constlist[94] = SMOP__ID__REPR_submethods; 
     202constlist[95] = SMOP__ID__REPR_whence; 
     203constlist[96] = SMOP__ID__REPR_who; 
     204constlist[97] = SMOP__ID__responder; 
     205constlist[98] = SMOP__ID__result; 
     206constlist[99] = SMOP__ID__setr; 
     207constlist[100] = SMOP__ID__shift; 
     208constlist[101] = SMOP__ID__signature; 
     209constlist[102] = SMOP__ID__STORE; 
  • v6/smop/src/native_bool.c

    r22017 r22183  
    1515                                     SMOP__Object* identifier, 
    1616                                     SMOP__Object* capture) { 
    17   ___UNKNOWN_METHOD___; 
    1817 
     18  if (identifier == SMOP__ID__bool) { 
     19    ___NATIVE_CAPTURE_ONLY___; 
     20    ___INVOCANT_RI_SHOULD_MATCH___; 
     21 
     22    SMOP_RELEASE(interpreter,capture); 
     23    return invocant; 
     24  } else { 
     25    ___UNKNOWN_METHOD___; 
     26  } 
    1927  SMOP_RELEASE(interpreter,capture); 
    2028  return SMOP__NATIVE__bool_false; 
  • v6/smop/src/smop_internal.h

    r22136 r22183  
    6161     smop_s1p_bindcapturesignature_init();  \ 
    6262     smop_s1p_pureprototypehow_init();      \ 
    63      smop_s1p_map_init(); 
     63     smop_s1p_map_init();                   \ 
     64     smop_s1p_array_iterator_init();         
    6465#define SMOP_INTERNAL_DESTROY_SEQUENCE      \ 
     66     smop_s1p_array_iterator_destr();       \ 
    6567     smop_s1p_map_destr();                  \ 
    6668     smop_s1p_pureprototypehow_destr();     \ 
     
    9092     smop_s1p_pureprototypehow_mold_init(); \ 
    9193     smop_s1p_map_mold_init();              \ 
     94     smop_s1p_array_iterator_mold_init();   \ 
    9295 
    9396#define SMOP_BOOTSTRAP_DESTR_SEQUENCE       \ 
     97     smop_s1p_array_iterator_mold_destr();  \ 
    9498     smop_s1p_map_mold_destr();             \ 
    9599     smop_s1p_pureprototypehow_mold_destr();\ 
  • v6/smop/src/smop_s1p_array.c

    r22033 r22183  
    6767    proxy->array = (smop_s1p_array_struct*) SMOP_REFERENCE(interpreter,invocant); 
    6868    ret = (SMOP__Object*) proxy; 
     69 
     70  } else if (identifier == SMOP__ID__Iterator) { 
     71    ret = SMOP__S1P__Array_Iterator_create(SMOP_REFERENCE(interpreter,(SMOP__Object*)invocant)); 
     72 
    6973  } else if (identifier == SMOP__ID__elems) { 
    7074    ret = SMOP__NATIVE__int_create(invocant->elems); 
     
    100104  } else if (identifier == SMOP__ID__DESTROYALL) { 
    101105    SMOP_RELEASE(interpreter,invocant->array); 
     106  } else if (identifier == SMOP__ID__bool) { 
     107    ret = SMOP__NATIVE__bool_true; 
    102108  } else { 
    103109      ___UNKNOWN_METHOD___ 
  • v6/smop/src/smop_s1p_array_iterator.sm0p

    r22181 r22183  
    3636  SMOP__Object* ret = SMOP__NATIVE__bool_false; 
    3737 
    38   ___UNKNOWN_METHOD___; 
     38  if (identifier == SMOP__ID__prefix_equal) { 
     39 
     40    SMOP__Object* frame = SMOP__Mold__Frame_create(interpreter,SMOP_REFERENCE(interpreter,smop_s1p_array_iterator_mold)); 
     41    SMOP__Object* back = SMOP_DISPATCH(interpreter, SMOP_RI(interpreter), 
     42      SMOP__ID__continuation, 
     43      SMOP__NATIVE__capture_create(interpreter,SMOP_REFERENCE(interpreter,interpreter), 
     44        NULL,NULL)); 
     45 
     46    mold_reg_set(interpreter,frame,0,SMOP_REFERENCE(interpreter,interpreter)); 
     47    mold_reg_set(interpreter,frame,1,SMOP_REFERENCE(interpreter,capture)); 
     48    mold_reg_set(interpreter,frame,2,SMOP_REFERENCE(interpreter,back)); 
     49 
     50    SMOP_DISPATCH(interpreter,SMOP_RI(interpreter),SMOP__ID__goto,frame); 
     51 
     52  } else if (identifier == SMOP__ID__input_array) { 
     53 
     54    smop_lowlevel_rdlock(invocant); 
     55    ret = ((SMOP__S1P__Array_Iterator_struct*)invocant)->input_array; 
     56    smop_lowlevel_unlock(invocant); 
     57 
     58    SMOP_REFERENCE(interpreter,ret); 
     59 
     60  } else if (identifier == SMOP__ID__count) { 
     61 
     62    smop_lowlevel_rdlock(invocant); 
     63    ret = ((SMOP__S1P__Array_Iterator_struct*)invocant)->count; 
     64    smop_lowlevel_unlock(invocant); 
     65 
     66    SMOP_REFERENCE(interpreter,ret); 
     67 
     68  } else if (identifier == SMOP__ID__FETCH) { 
     69 
     70    ret = SMOP_REFERENCE(interpreter,invocant); 
     71 
     72  } else { 
     73 
     74    ___UNKNOWN_METHOD___; 
     75 
     76  } 
    3977 
    4078  SMOP_RELEASE(interpreter,invocant); 
     
    64102    my $capture; 
    65103    my $back; 
    66     my $code; 
    67     my $outer; 
    68     my $signature; 
    69     my $mold; 
    70104 
    71105    my $void; 
    72106 
    73     my $lexical_proto = ¢SMOP__S1P__LexicalScope; 
    74     my $lexical = $lexical_proto."new"(); 
    75     my $lexical_outer_container = $lexical."outer"(); 
    76     $void = $lexical_outer_container."STORE"($outer); 
     107    my $iterator = $capture."invocant"(); 
     108    my $array = $iterator."input_array"(); 
     109    my $count = $iterator."count"(); 
    77110 
    78     my $actualcapture = $capture."positional"(0); 
     111    my $size = $array."elems"(); 
     112    my $bigger = $count."infix:>"($size); 
    79113 
    80     $void = $signature."BIND"($actualcapture,$lexical); 
    81     my $frame_proto = ¢SMOP__Mold__Frame; 
    82     my $frame = $frame_proto."new"($mold); 
    83     $void = $frame."set_reg"(0, $interpreter); 
    84     $void = $frame."set_reg"(1, $lexical); 
    85     $void = $frame."set_back"($back); 
    86     $void = $interpreter."goto"($frame); 
     114    if $bigger { goto final } else { goto has_next }; 
     115     has_next: 
     116      my $item = $array."postcircumfix:[ ]"($count); 
     117      $void = $count."postfix:++"(); 
     118      $void = $back."setr"($item); 
     119      $void = $interpreter."goto"($back); 
     120     final: 
     121      $void = $back."setr"(¢SMOP__NATIVE__bool_false); 
     122      $void = $interpreter."goto"($back) 
     123 
    87124  }; 
    88125}