Changeset 144 for trunk/orca/context.c

Show
Ignore:
Timestamp:
05/11/06 14:23:03 (3 years ago)
Author:
krobillard
Message:

Native arguments are now kept on the stack until after the call and the
result is now always put into a1.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/orca/context.c

    r140 r144  
    876876    body = orBlockN( blk ); 
    877877    bi   = 0; 
     878    a1[2].series.n = body;      // Replace original on stack to keep from GC. 
    878879    orBind( blk, &ctx ); 
    879880 
     
    12091210 
    12101211/* 
    1211    'variables   [word! block!] 
    1212    series       [series!] 
    1213    body         [block!] 
     1212  foreach: native [ 
     1213    'variables   [word! block!] 
     1214    series       [series!] 
     1215    body         [block!] 
     1216  ] 
    12141217*/ 
    12151218//see orForeachNative 
     
    12261229    OIndex si   = a2->series.it; 
    12271230 
    1228     OIndex sdest = 0;//in second buffer 
     1231    OIndex sdest = 0;       //in second buffer 
    12291232    OIndex sorig = si;  
    12301233    OIndex ssrc; 
     
    12341237    OIndex bi   = (a1 + 2)->series.it; 
    12351238 
    1236     // Binding a copy of the body to a private context is horribly 
    1237     // expensive but what choice do we have? 
    1238     // Still, 'foreach is faster than 'forall (probably because using paths 
    1239     // is so slow). 
    1240  
    1241     orRefAvailErr( 5 ) // 4 + block-temp 
     1239 
     1240    orRefAvailErr( 5 )      // 4 + block-temp 
    12421241 
    12431242    // Must hold body & a2 in case orMakeContext() or orCopyBlock() trigger 
     
    12751274            ++it; 
    12761275        } 
    1277  
    12781276    } 
    12791277    else 
     
    12931291    body = orBlockN( blk ); 
    12941292    bi   = 0; 
     1293    a1[2].series.n = body;      // Replace original on stack to keep from GC. 
    12951294    orBind( blk, &ctx ); 
    12961295 
     
    13051304        case OT_PATH: 
    13061305        { 
    1307           OIndex keeptBlkIndex; 
    1308           OBlock* keeptBlock; 
    1309           OValue *keept; 
     1306            OIndex keeptBlkIndex; 
     1307            OBlock* keeptBlock; 
     1308            OValue* keept; 
    13101309 
    13111310            blk = orBlockPtr( serN ); 
    1312             keeptBlock = orMakeBlock( blk->used ); 
    1313             keeptBlkIndex = orBlockN( keeptBlock ); 
    1314             orRefPush( OT_BLOCK, keeptBlkIndex ); 
    1315             keept = keeptBlock->values;  
     1311            keeptBlock = orMakeBlock( blk->used ); 
     1312            keeptBlkIndex = orBlockN( keeptBlock ); 
     1313            orRefPush( OT_BLOCK, keeptBlkIndex ); 
     1314            keept = keeptBlock->values;  
    13161315            send = blk->used; 
    13171316 
     
    13281327                blk = orBlockPtr( serN );          // Reacquire. 
    13291328                send = blk->used; 
    1330                 keeptBlock =  orBlockPtr( keeptBlkIndex ); 
    1331                 keept = keeptBlock->values;  
    1332  
    1333                 if( !orIfTrue(orRESULT)){ 
    1334                   memCpy( keept + sdest, blk->values + si, vlen * sizeof(OValue) ); 
    1335                   sdest += vlen; 
    1336                   keeptBlock->used = sdest; 
    1337                 } 
     1329                keeptBlock = orBlockPtr( keeptBlkIndex ); 
     1330                keept = keeptBlock->values;  
     1331 
     1332                if( ! orIfTrue(orTOS) ) 
     1333                { 
     1334                    memCpy( keept + sdest, blk->values + si, 
     1335                            vlen * sizeof(OValue) ); 
     1336                    sdest += vlen; 
     1337                    keeptBlock->used = sdest; 
     1338                } 
    13381339                si += vlen;  
    13391340            } 
    13401341 
    1341             //handle rest, if less values then loopvars 
     1342            // handle rest, if less values then loopvars 
    13421343 
    13431344            if( si < blk->used ) 
     
    13581359                if( orErrorThrown ) 
    13591360                    goto error; 
    1360  
    1361                 blk = orBlockPtr( serN );          // Reacquire. 
    1362                 send = blk->used; 
    1363                 keeptBlock =  orBlockPtr( keeptBlkIndex ); 
    1364                 keept = keeptBlock->values;  
    1365  
    1366                 if( !orIfTrue(orRESULT)){ 
    1367                   memCpy( keept + sdest, blk->values + si, (blk->used - si) * sizeof(OValue) ); 
    1368                   sdest += blk->used - si; 
    1369                   keeptBlock->used = sdest; 
    1370                 }                
    1371             } 
    1372          
    1373             orResultBLOCK( serN ); 
    1374             blk->used = sorig + sdest; 
    1375             orRESULT->series.it = sorig; 
    1376             memCpy( blk->values + sorig, keept, sdest * sizeof(OValue)); 
    1377             orRefPop( 1 ); //free(keept); 
    1378         } 
    1379         break; 
     1361                blk = orBlockPtr( serN );          // Reacquire. 
     1362                send = blk->used; 
     1363                keeptBlock = orBlockPtr( keeptBlkIndex ); 
     1364                keept = keeptBlock->values;  
     1365 
     1366                if( ! orIfTrue(orTOS) ) 
     1367                { 
     1368                    memCpy( keept + sdest, blk->values + si, 
     1369                            (blk->used - si) * sizeof(OValue) ); 
     1370                    sdest += blk->used - si; 
     1371                    keeptBlock->used = sdest; 
     1372                }                
     1373            } 
     1374 
     1375            orResultBLOCK( serN ); 
     1376            blk->used = sorig + sdest; 
     1377            a1->series.it = sorig; 
     1378            memCpy( blk->values + sorig, keept, sdest * sizeof(OValue)); 
     1379            orRefPop( 1 ); //free(keept); 
     1380        } 
     1381            break; 
    13801382 
    13811383        case OT_STRING: 
     
    13851387        { 
    13861388            OString* str = orStringPtr( serN ); 
    1387             char *keept = malloc(str->used); 
     1389            char* keept = malloc(str->used); 
    13881390            send = str->used; 
    13891391 
     
    14001402            while( si < send ) 
    14011403            { 
    1402               ssrc = si; 
     1404                ssrc = si; 
    14031405                for( rlen = 0; rlen < vlen; ++rlen ) 
    14041406                    (wval + rlen)->integer = str->charArray[ si++ ]; 
     
    14081410                    goto error; 
    14091411                str = orStringPtr( serN );     // Reacquire. 
    1410                 send = str->used; 
    1411  
    1412                 if( !orIfTrue(orRESULT)){ 
    1413                   strNCpy( keept + sdest, str->charArray + ssrc, vlen ); 
    1414                   sdest += vlen; 
    1415                 } 
     1412                send = str->used; 
     1413 
     1414                if( ! orIfTrue(orTOS) ) 
     1415                { 
     1416                    strNCpy( keept + sdest, str->charArray + ssrc, vlen ); 
     1417                    sdest += vlen; 
     1418                } 
    14161419            } 
    14171420 
     
    14191422            { 
    14201423                rlen = str->used - si; 
    1421               ssrc = si; 
     1424                ssrc = si; 
    14221425 
    14231426                while( si < str->used ) 
     
    14351438 
    14361439                orEvalBlock( orBlockPtr( body ), bi ); 
    1437  
    14381440                if( orErrorThrown ) 
    14391441                    goto error; 
    1440  
    1441                 str = orStringPtr( serN );          // Reacquire. 
     1442                str = orStringPtr( serN );          // Reacquire. 
    14421443                send = str->used; 
    1443                 if( !orIfTrue(orRESULT)){ 
    1444                   strNCpy( keept + sdest, str->charArray + ssrc, (str->used - ssrc) ); 
    1445                   sdest += str->used - ssrc; 
    1446                 }                
    1447             } 
    1448  
    1449             orResultSTRING( serN ); 
    1450             str->used = sorig + sdest; 
    1451             orRESULT->series.it = sorig; 
    1452             strNCpy( str->charArray + sorig, keept, str->used ); 
    1453             free(keept); 
     1444                if( ! orIfTrue(orTOS) ) 
     1445                { 
     1446                    strNCpy( keept + sdest, str->charArray + ssrc, 
     1447                             (str->used - ssrc) ); 
     1448                    sdest += str->used - ssrc; 
     1449                }                
     1450            } 
     1451 
     1452            orResultSTRING( serN ); 
     1453            str->used = sorig + sdest; 
     1454            a1->series.it = sorig; 
     1455            strNCpy( str->charArray + sorig, keept, str->used ); 
     1456            free(keept); 
    14541457        } 
    14551458            break; 
    14561459 
    1457     default: 
    1458       orError("remove-each for this type not implemented"); 
    1459  
    1460  
    1461 /*         case OT_LIST: */ 
    1462 /*             if( a1->type == OT_BLOCK ) */ 
    1463 /*             { */ 
    1464 /*                 orError( "foreach block! list! not implemented" ); */ 
    1465 /*                 break; */ 
    1466 /*             } */ 
    1467  
    1468 /*             orResultNONE; */ 
    1469  
    1470 /*             if( a2->series.index ) */ 
    1471 /*             { */ 
    1472 /*                 OValue* begin; */ 
    1473 /*                 OValue* it; */ 
    1474  
    1475 /*                 blk = orBLOCK(a2); */ 
    1476 /*                 begin = blk->values; */ 
    1477 /*                 it    = begin + a2->series.index; */ 
    1478  
    1479 /*                 while( it->LIST_NEXT > 0 ) */ 
    1480 /*                 { */ 
    1481 /*                     orCopyV( wval, it[1] ); */ 
    1482  
    1483 /*                     orEvalBlock( orBlockPtr( body ), bi ); */ 
    1484 /*                     if( orErrorThrown ) */ 
    1485 /*                         goto error; */ 
    1486  
    1487 /*                     //blk = orBlockPtr( serN );          // Reacquire. */ 
    1488 /*                     //orListNextNode( blk, it ); */ 
    1489 /*                     it = begin + it->LIST_NEXT; */ 
    1490 /*                 } */ 
    1491 /*             } */ 
    1492 /*             break; */ 
     1460        default: 
     1461            orError("remove-each for this type not implemented"); 
    14931462    } 
    14941463