Changeset 142 for trunk/orca
- Timestamp:
- 05/09/06 22:54:53 (3 years ago)
- Location:
- trunk/orca
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/orca/gc.c
r99 r142 169 169 #endif 170 170 171 // Function argument blocks will have blk->used set but no blk->values.172 171 if( ! it ) 173 172 return; … … 255 254 orSetBit( bsBlk.byteArray, idx ); 256 255 257 idx = it->func.context - orEnv->freeBlocks.sweepStart; 258 if( idx >= 0 ) 259 orSetBit( bsBlk.byteArray, idx ); 256 // Must check contents of argument block even if below 257 // sweepStart. 258 idx = it->func.context; 259 if( idx > 0 ) 260 { 261 // During recursion this will waste some time 262 // rechecking stack values. 263 checkBlock( orBLOCKS + idx ); 264 } 260 265 break; 261 266 -
trunk/orca/ovalue.c
r140 r142 1561 1561 OR_NATIVE( orEitherNative ) 1562 1562 { 1563 OValue* blkArg = a1 + 2; ;1563 OValue* blkArg = a1 + 2; 1564 1564 if( a1->type != OT_NONE ) 1565 1565 { … … 2970 2970 int vi; 2971 2971 2972 orRefAvailErr( 3 ) 2973 orRefPush( OT_BLOCK, a1->index ); 2972 blkN = a1->index; 2973 2974 orRefAvailErr( 2 ) 2975 orRefPush( OT_BLOCK, blkN ); 2976 2974 2977 rblk = orMakeBlock(0); 2975 2976 2978 nblkN = orBlockN(rblk); 2977 blkN = a1->index; 2978 blk = orB LOCK( a1);2979 2980 blk = orBlockPtr( blkN ); 2979 2981 used = blk->used; 2980 2982 vi = a1->series.it; 2981 2983 2982 orRefPush( OT_BLOCK, blkN );2983 2984 orRefPush( OT_BLOCK, nblkN ); 2984 2985 … … 3000 3001 } 3001 3002 3002 orRefPop( 3);3003 orRefPop( 2 ); 3003 3004 orResultBLOCK( nblkN ); 3004 3005 } … … 4365 4366 orRefPush( OT_BLOCK, ctx.vblkN ); 4366 4367 4368 // Initialize values for GC. 4369 it = vblk->values; 4367 4370 next = vblk->values + total; 4371 while( it != next ) 4372 { 4373 orSetTF( it, OT_NONE ); 4374 ++it; 4375 } 4376 4368 4377 orSetTF( next, OT_UNSET ); 4369 4378 next->RECURSE_COUNT = 0; -
trunk/orca/print.c
r98 r142 1127 1127 OR_NATIVE_PUB( orFormNative ) 1128 1128 { 1129 OString* str = orMakeString( 0 ); 1129 OString* str; 1130 1131 ++orEnv->dataStack.used; 1132 str = orMakeString( 0 ); 1133 --orEnv->dataStack.used; 1134 1130 1135 orForm( str, a1 ); 1131 1136 orResultSTRING( orStringN(str) ); … … 1139 1144 { 1140 1145 #define REF_MOLD_ONLY a1+1 1141 OString* str = orMakeString( 0 ); 1146 OString* str; 1147 1148 ++orEnv->dataStack.used; 1149 str = orMakeString( 0 ); 1150 --orEnv->dataStack.used; 1151 1142 1152 mold( str, a1, 0, orRefineSet(REF_MOLD_ONLY) ? MOLD_NO_BRACES : 0 ); 1143 1153 if( str->used )
