Changeset 510 for trunk/thune/thune.c
- Timestamp:
- 02/10/08 23:53:46 (9 months ago)
- Files:
-
- 1 modified
-
trunk/thune/thune.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/thune/thune.c
r506 r510 45 45 case CC_EVAL: 46 46 case CC_EVAL_RUNNING: 47 case CC_REDUCE: 47 48 case CC_FOREVER: 48 case CC_REDUCE:49 49 toc -= CC_LEN_EVAL; 50 50 break; 51 51 52 case CC_LOOP: 52 53 case CC_ITER: 53 54 case CC_EACH: … … 795 796 goto bad_opcode_type; 796 797 break; 797 798 #if 0 798 799 case OP_INC_WORD: // ( -- ) 799 800 if( (pc == end) || (! ur_is(pc, UT_WORD)) ) … … 841 842 } 842 843 break; 843 844 #endif 844 845 case OP_VERIFY: // (val type -- val) 845 846 // (v1 v2 t1 t2 -- v1 v2) … … 869 870 goto control; 870 871 872 case OP_LOOP: // (body n [n2] -- ) 873 { 874 int n0, n1; 875 int prevInt; 876 UCell* prev = ur_s_prev(UR_TOS); 877 878 if( ur_is(prev, UT_INT) ) 879 { 880 n0 = ur_int(prev); 881 --prev; 882 prevInt = 1; 883 } 884 else 885 { 886 n0 = 0; 887 prevInt = 0; 888 } 889 890 if( ! ur_is(UR_TOS, UT_INT) || ! ur_is(prev, UT_BLOCK) ) 891 { 892 ur_throwErr( UR_ERR_DATATYPE, 893 "loop expected block! int!" ); 894 goto throw_cc; 895 } 896 n1 = ur_int(UR_TOS); 897 UR_S_DROP; 898 if( prevInt ) 899 UR_S_DROP; 900 if( n1 > n0 ) 901 { 902 PUSHC_EVAL( blkN, start, pc ); 903 SET_BLK_PC( UR_TOS->series.n, 904 UR_TOS->series.it ); 905 ur_copyCell( ut->toc, *UR_TOS ); 906 UR_C_GROW; 907 908 UR_TOC->loop.code = CC_LOOP; 909 UR_TOC->loop.flags = prevInt; 910 UR_TOC->loop.n = n1; 911 UR_TOC->loop.it = n0; 912 UR_C_GROW; 913 914 if( prevInt ) // Loop body must drop counter. 915 { 916 ur_initInt( UR_TOS, n0 ); 917 UR_S_GROW; 918 } 919 } 920 UR_S_DROP; 921 } 922 break; 923 871 924 //case OP_END: 872 925 // goto finish; … … 1070 1123 goto control; 1071 1124 1072 case CC_FOREVER:1073 SET_BLK_PC( UR_TOC->eval.n, UR_TOC->eval.it );1074 UR_C_GROW;1075 goto execute;1076 1077 1125 case CC_REDUCE: 1078 1126 { … … 1097 1145 ur_setSeries(ntos, rblkN, 0); 1098 1146 } 1147 goto control; 1148 1149 case CC_FOREVER: 1150 SET_BLK_PC( UR_TOC->eval.n, UR_TOC->eval.it ); 1151 UR_C_GROW; 1152 goto execute; 1153 1154 case CC_LOOP: 1155 if( ++UR_TOC->loop.it < UR_TOC->loop.n ) 1156 { 1157 UCell* ser = ut->toc - 1; 1158 if( UR_TOC->loop.flags ) 1159 { 1160 UR_S_GROW; // Loop code must drop TOS. 1161 ur_initInt( UR_TOS, UR_TOC->loop.it ); 1162 } 1163 SET_BLK_PC( ser->series.n, ser->series.it ); 1164 UR_C_GROW; 1165 goto execute; 1166 } 1167 UR_C_DEC; 1099 1168 goto control; 1100 1169 … … 1202 1271 break; 1203 1272 1273 case CC_LOOP: 1204 1274 case CC_ITER: 1205 1275 case CC_EACH:
