Changeset 84 for trunk/orca/context.c

Show
Ignore:
Timestamp:
03/09/06 01:20:06 (3 years ago)
Author:
volker
Message:

remove-each with block gc-hardened (but gc-effects not tested)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/orca/context.c

    r81 r84  
    12371237    // is so slow). 
    12381238 
    1239     orRefAvailErr( 4 ) 
     1239    orRefAvailErr( 5 ) // 4 + block-temp 
    12401240 
    12411241    // Must hold body & a2 in case orMakeContext() or orCopyBlock() trigger 
     
    13031303        case OT_PATH: 
    13041304        { 
     1305          OIndex keeptBlkIndex; 
     1306          OBlock* keeptBlock; 
     1307          OValue *keept; 
     1308 
    13051309            blk = orBlockPtr( serN ); 
    1306             OValue *keept = calloc(blk->used,sizeof(OValue)); 
     1310            keeptBlock = orMakeBlock( blk->used ); 
     1311            keeptBlkIndex = orBlockN( keeptBlock ); 
     1312            orRefPush( OT_BLOCK, keeptBlkIndex ); 
     1313            keept = keeptBlock->values;  
    13071314            send = blk->used; 
    13081315 
     
    13191326                blk = orBlockPtr( serN );          // Reacquire. 
    13201327                send = blk->used; 
     1328                keeptBlock =  orBlockPtr( keeptBlkIndex ); 
     1329                keept = keeptBlock->values;  
    13211330 
    13221331                if( !orIfTrue(orRESULT)){ 
    13231332                  memCpy( keept + sdest, blk->values + si, vlen * sizeof(OValue) ); 
    13241333                  sdest += vlen; 
     1334                  keeptBlock->used = sdest; 
    13251335                } 
    13261336                si += vlen;  
     
    13491359                blk = orBlockPtr( serN );          // Reacquire. 
    13501360                send = blk->used; 
     1361                keeptBlock =  orBlockPtr( keeptBlkIndex ); 
     1362                keept = keeptBlock->values;  
     1363 
    13511364                if( !orIfTrue(orRESULT)){ 
    13521365                  memCpy( keept + sdest, blk->values + si, (blk->used - si) * sizeof(OValue) ); 
    13531366                  sdest += blk->used - si; 
     1367                  keeptBlock->used = sdest; 
    13541368                }                
    13551369            } 
     
    13591373            orRESULT->series.it = sorig; 
    13601374            memCpy( blk->values + sorig, keept, sdest * sizeof(OValue)); 
    1361             free(keept); 
     1375            orRefPop( 1 ); //free(keept); 
    13621376        } 
    13631377        break;