Changeset 144 for trunk/orca

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.

Location:
trunk/orca
Files:
23 modified

Legend:

Unmodified
Added
Removed
  • trunk/orca/console.c

    r61 r144  
    126126                { 
    127127                    OValue* val; 
    128                     val = orRESULT; 
     128                    val = orTOS; 
    129129                    if( (val->type != OT_UNSET) && 
    130130                        (val->type != OT_OBJECT) && 
  • 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 
  • trunk/orca/files.c

    r136 r144  
    2626extern int orIsDir( const char* path ); 
    2727extern int orFileModified( const char* path, OValue* res ); 
    28 extern void orReadDir( const char* filename ); 
     28extern void orReadDir( OValue*, const char* filename ); 
    2929extern void orNowNative( OValue* a1 ); 
    3030extern void orChangeDirNative( OValue* a1 ); 
     
    126126    OString* str = orSTRING(a1); 
    127127    orTermCStr( str ); 
    128     status = orFileModified( str->charArray + a1->series.it, orRESULT ); 
     128    status = orFileModified( str->charArray + a1->series.it, a1 ); 
    129129    if( status < 0 ) 
    130130    { 
     
    248248#define REF_READ_SIZE       a1+6 
    249249 
     250/* 
     251    read: native [ 
     252        source [file! port!] 
     253        /binary 
     254        /lines 
     255        /skip length [number!] 
     256        /part size [number!] 
     257    ] 
     258*/ 
    250259OR_NATIVE( orReadNative ) 
    251260{ 
     
    257266 
    258267        orTermCStr( str ); 
    259  
    260268        fn = str->charArray + a1->series.it; 
     269 
    261270        n = orIsDir( fn ); 
    262271        if( n < 0 ) 
     
    266275        else if( n == 1 ) 
    267276        { 
    268             orReadDir( fn ); 
     277            // TODO: Hold a1 from GC (or copy fn). 
     278            orReadDir( a1, fn ); 
    269279        } 
    270280        else 
     
    361371 
    362372        assert( (devID > -1) && (devID < arr->used) ); 
    363         ((OPortDevice**) arr->buf)[ devID ]->read( &a1->ctx ); 
     373        ((OPortDevice**) arr->buf)[ devID ]->read( &a1->ctx, a1 ); 
    364374    } 
    365375} 
  • trunk/orca/gl/audio.c

    r43 r144  
    157157            alGenBuffers( 1, &buffer ); 
    158158            alBufferData( buffer, format, data, size, freq ); 
     159            { 
     160            OValue* a1 = orTOS; 
    159161            orResult( OT_SOUND, buffer ); 
     162            } 
    160163        } 
    161164        else 
  • trunk/orca/gl/gx.c

    r86 r144  
    480480        resd_add( &gEnv.resd, &tex->res, key ); 
    481481 
    482         result = orRESULT; 
     482        result = orTOS; 
    483483        orCopyV( result, *val ); 
    484484        orLoadNative( result ); 
  • trunk/orca/gl/gx.h

    r42 r144  
    147147 
    148148#define gxResultRES(rp) \ 
    149    {OValue* _or_result = orRESULT; \ 
    150     orSetTF(_or_result, OT_RESOURCE); \ 
    151     _or_result->argc  = rp->res.resType; \ 
    152     _or_result->index = rp->res.resKey;} 
     149   {orSetTF(a1, OT_RESOURCE); \ 
     150    a1->argc  = rp->res.resType; \ 
     151    a1->index = rp->res.resKey;} 
    153152 
    154153#define gxResType(val)  val->argc 
  • trunk/orca/gl/joystick.c

    r54 r144  
    132132  Set 'input block values. 
    133133*/ 
    134 static void jsRead( OContext* ctx ) 
     134static void jsRead( OContext* ctx, OValue* a1 ) 
    135135{ 
    136136    int events = 0; 
  • trunk/orca/gl/main.c

    r61 r144  
    5656    { 
    5757        OIndex strN; 
     58        OValue* tos; 
    5859 
     60        tos = orTOS; 
    5961        strN = orMakeCString( argv[1], -1 ); 
    60         orResultFILE( strN ); 
     62        orSetTF(tos, OT_FILE ); 
     63        orSetSeries(tos, strN, 0 ); 
    6164 
    62         orDoNative( orRESULT ); 
     65        orDoNative( tos ); 
    6366        if( orErrorThrown ) 
    6467        { 
     
    123126                { 
    124127                    OValue* val; 
    125                     val = orRESULT; 
     128                    val = orTOS; 
    126129                    if( (val->type != OT_UNSET) && 
    127130                        (val->type != OT_OBJECT) && 
  • trunk/orca/gl/png_load.c

    r1 r144  
    5757 
    5858        bin = orMakeImage( format, width, height ); 
     59        { 
     60        OValue* a1 = orTOS; 
    5961        orResult( OT_IMAGE, orBinaryN(bin) ); 
     62        } 
    6063 
    6164        if( bin->byteArray ) 
  • trunk/orca/internal.h

    r26 r144  
    1515 
    1616 
    17 #define orPushStack     ++orEnv->dataStack.used 
    18 #define orPopStack      --orEnv->dataStack.used 
     17#define orStackGrow(n)      orEnv->dataStack.used += n 
     18#define orStackDrop(n)      orEnv->dataStack.used -= n 
    1919 
    2020#define OA_EXPAND1(type,arr,newptr) \ 
  • trunk/orca/math.c

    r94 r144  
    170170 
    171171 
    172 static void orOpPower( OValue* a ) 
     172static void orOpPower( OValue* a1 ) 
    173173{ 
    174174    double x, y; 
    175     OValue* b = a + 1; 
    176     if( a->type == OT_INTEGER ) 
     175    OValue* b = a1 + 1; 
     176    if( a1->type == OT_INTEGER ) 
    177177    { 
    178178        if( b->type == OT_INTEGER ) 
     
    182182            if( n ) 
    183183            { 
    184                 sum = orInt(a); 
     184                sum = orInt(a1); 
    185185                while( --n ) 
    186                     sum *= orInt(a); 
     186                    sum *= orInt(a1); 
    187187            } 
    188188            else 
     
    195195        else if( b->type == OT_DECIMAL ) 
    196196        { 
    197             x = (double) orInt(a); 
     197            x = (double) orInt(a1); 
    198198            y = orDecimal(b); 
    199199            goto fp; 
    200200        } 
    201         a = b; 
    202     } 
    203     else if( a->type == OT_DECIMAL ) 
    204     { 
    205         x = orDecimal(a); 
     201        a1 = b; 
     202    } 
     203    else if( a1->type == OT_DECIMAL ) 
     204    { 
     205        x = orDecimal(a1); 
    206206        if( b->type == OT_INTEGER ) 
    207207        { 
     
    214214            goto fp; 
    215215        } 
    216         a = b; 
    217     } 
    218     orErrorOp( "**", a ); 
     216        a1 = b; 
     217    } 
     218    orErrorOp( "**", a1 ); 
    219219    return; 
    220220 
     
    224224 
    225225 
    226 static void orOpRemainder( OValue* a ) 
     226static void orOpRemainder( OValue* a1 ) 
    227227{ 
    228228    double x, y; 
    229     OValue* b = a + 1; 
    230     if( a->type == OT_INTEGER ) 
     229    OValue* b = a1 + 1; 
     230    if( a1->type == OT_INTEGER ) 
    231231    { 
    232232        if( b->type == OT_INTEGER ) 
    233233        { 
    234             orResult( OT_INTEGER, orInt(a) % orInt(b) ); 
     234            orResult( OT_INTEGER, orInt(a1) % orInt(b) ); 
    235235            return; 
    236236        } 
    237237        else if( b->type == OT_DECIMAL ) 
    238238        { 
    239             x = (double) orInt(a); 
     239            x = (double) orInt(a1); 
    240240            y = orDecimal(b); 
    241241            goto fp; 
    242242        } 
    243         a = b; 
    244     } 
    245     else if( a->type == OT_DECIMAL ) 
    246     { 
    247         x = orDecimal(a); 
     243        a1 = b; 
     244    } 
     245    else if( a1->type == OT_DECIMAL ) 
     246    { 
     247        x = orDecimal(a1); 
    248248        if( b->type == OT_INTEGER ) 
    249249        { 
     
    256256            goto fp; 
    257257        } 
    258         a = b; 
    259     } 
    260     orErrorOp( "//", a ); 
     258        a1 = b; 
     259    } 
     260    orErrorOp( "//", a1 ); 
    261261    return; 
    262262 
  • trunk/orca/op.c

    r98 r144  
    2828 
    2929 
    30 void orOpAdd( OValue* a ) 
    31 { 
    32     OValue* b = a + 1; 
    33     if( orIs(a, OT_INTEGER) ) 
    34     { 
    35         if( orIs(b, OT_INTEGER) ) 
    36         { 
    37             orResult( OT_INTEGER, orInt(a) + orInt(b) ); 
    38             return; 
    39         } 
    40         else if( orIs(b, OT_DECIMAL) ) 
    41         { 
    42             orResultDECIMAL( (double) orInt(a) + orDecimal(b) ); 
     30void orOpAdd( OValue* a1 ) 
     31{ 
     32    OValue* b = a1 + 1; 
     33    if( orIs(a1, OT_INTEGER) ) 
     34    { 
     35        if( orIs(b, OT_INTEGER) ) 
     36        { 
     37            orResult( OT_INTEGER, orInt(a1) + orInt(b) ); 
     38            return; 
     39        } 
     40        else if( orIs(b, OT_DECIMAL) ) 
     41        { 
     42            orResultDECIMAL( (double) orInt(a1) + orDecimal(b) ); 
    4343            return; 
    4444        } 
     
    5252            for( i = 0; i < res->argc; i++ ) 
    5353            { 
    54                 tmp = orInt(a) + b->tuple[i]; 
     54                tmp = orInt(a1) + b->tuple[i]; 
    5555                res->tuple[i] = orToByteRange(tmp); 
    5656            }    
     
    5959            return; 
    6060        } 
    61         a = b; 
    62     } 
    63     else if( orIs(a, OT_DECIMAL) ) 
    64