Changeset 427

Show
Ignore:
Timestamp:
07/07/07 04:41:31 (15 months ago)
Author:
krobillard
Message:

Setting words in the shared global store now throws an error.
Default binding changed so top-level set-words are added to thread context.

Location:
branches/thune/thread_safe
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • branches/thune/thread_safe/context.c

    r426 r427  
    526526 
    527527 
     528extern UContext ur_envGlobal; 
     529 
     530/* 
     531   wc->flags, wc->word wordBlk, valBlk, & index are set. 
     532   ctop must be greater than cbot. 
     533*/ 
     534void ur_internDefault( UThread* ut, UCell* wc, UAtom atom, 
     535                       UCell* cbot, UCell* ctop ) 
     536{ 
     537    UCell* cit; 
     538    int wrdN; 
     539 
     540    // Look for atom in module context stack. 
     541    cit = ctop; 
     542    do 
     543    { 
     544        --cit; 
     545        wrdN = ur_lookup( cit, atom ); 
     546        if( wrdN > -1 ) 
     547            goto assign; 
     548    } 
     549    while( cit != cbot ); 
     550 
     551 
     552    // Now try the shared global context. 
     553    if( ut->env->blocks.arr.used ) 
     554    { 
     555        wrdN = ur_lookup( &ur_envGlobal, atom ); 
     556        if( wrdN > -1 ) 
     557        { 
     558            ur_setBindType( wc, UR_BIND_GLOBAL ); 
     559            wc->word.wordBlk = ur_envGlobal.ctx.wordBlk; 
     560            wc->word.valBlk  = ur_envGlobal.ctx.valBlk; 
     561            wc->word.index   = wrdN; 
     562            return; 
     563        } 
     564    } 
     565 
     566    // Word not found, so intern into current module (top of context stack). 
     567    cit = ctop - 1; 
     568    wrdN = ur_internWord( cit, atom ); 
     569 
     570assign: 
     571 
     572    ur_setBindType( wc, UR_BIND_THREAD ); 
     573    wc->word.wordBlk = cit->ctx.wordBlk; 
     574    wc->word.valBlk  = cit->ctx.valBlk; 
     575    wc->word.index   = wrdN; 
     576} 
     577 
     578 
     579static 
     580UBlock* _bindDefault( UThread* ut, UIndex blkN, UCell* cbot, UCell* ctop ) 
     581{ 
     582    UBlock* blk; 
     583    UCell* it; 
     584    UCell* end; 
     585 
     586    if( ur_isGlobal(blkN) ) 
     587        return 0;       // Cannot bind global blocks. 
     588 
     589    blk = ur_blockPtr( blkN ); 
     590    it  = blk->ptr.cells; 
     591    end = it + blk->used; 
     592 
     593    while( it != end ) 
     594    { 
     595        switch( ur_type(it) ) 
     596        { 
     597            case UT_WORD: 
     598            case UT_SETWORD: 
     599            case UT_GETWORD: 
     600            case UT_LITWORD: 
     601            case UT_SELECT: 
     602            case UT_SETSELECT: 
     603            case UT_LITSELECT: 
     604            case UT_OPCODE: 
     605                ur_internDefault( ut, it, ur_atom(it), cbot, ctop ); 
     606                break; 
     607 
     608            case UT_PATH: 
     609            case UT_SETPATH: 
     610            { 
     611                UCell* path1 = ur_blockPtr( it->series.n )->ptr.cells; 
     612                if( ur_isAWord(path1) ) 
     613                { 
     614                    ur_internDefault( ut, path1, ur_atom(path1), cbot, ctop ); 
     615                } 
     616            } 
     617                break; 
     618 
     619            case UT_BLOCK: 
     620            case UT_PAREN: 
     621                _bindDefault( ut, it->series.n, cbot, ctop ); 
     622                break; 
     623 
     624            case UT_FUNCTION: 
     625                _bindDefault( ut, it->func.bodyN, cbot, ctop ); 
     626                break; 
     627        } 
     628 
     629        ++it; 
     630    } 
     631 
     632    return blk; 
     633} 
     634 
     635 
     636void ur_bindDefault( UThread* ut, UIndex blkN ) 
     637{ 
     638    UBlock* blk; 
     639    UBlock* cblk; 
     640    UCell* ctx; 
     641    UCell* it; 
     642    UCell* end; 
     643 
     644    cblk = tBlockPtr( BLK_CTX_STACK ); 
     645    ctx = cblk->ptr.cells + (cblk->used - 1); 
     646 
     647    // Intern all set-words found in block to the top context. 
     648    blk = ur_blockPtr( blkN ); 
     649    it  = blk->ptr.cells; 
     650    end = it + blk->used; 
     651    while( it != end ) 
     652    { 
     653        if( ur_is(it, UT_SETWORD) ) 
     654            ur_internWord( ctx, it->word.atom ); 
     655        ++it; 
     656    } 
     657 
     658    _bindDefault( ut, blkN, cblk->ptr.cells, 
     659                            cblk->ptr.cells + cblk->used ); 
     660} 
     661 
     662 
     663#if 0 
     664/** 
     665   Intern all set-words found in block to the top context. 
     666*/ 
     667void ur_internSetWords( UThread* ut, UIndex blkN ) 
     668{ 
     669    UBlock* blk; 
     670    UBlock* cblk; 
     671    UCell* ctx; 
     672    UCell* it; 
     673    UCell* end; 
     674 
     675    cblk = tBlockPtr( BLK_CTX_STACK ); 
     676    ctx = cblk->ptr.cells + (cblk->used - 1); 
     677 
     678    blk = ur_blockPtr( blkN ); 
     679    it  = blk->ptr.cells; 
     680    end = it + blk->used; 
     681    while( it != end ) 
     682    { 
     683        if( ur_is(it, UT_SETWORD) ) 
     684            ur_internWord( ctx, it->word.atom ); 
     685        ++it; 
     686    } 
     687} 
     688#endif 
     689 
     690 
    528691/*EOF*/ 
  • branches/thune/thread_safe/eval.c

    r426 r427  
    2424 
    2525 
    26 extern UContext ur_global; 
     26extern UContext ur_thrGlobal; 
    2727extern UContext ur_envGlobal; 
    2828 
     
    6666    int wrdN; 
    6767 
    68     global = (ut->env->blocks.arr.used) ? &ur_envGlobal : &ur_global; 
     68    global = (ut->env->blocks.arr.used) ? &ur_envGlobal : &ur_thrGlobal; 
    6969 
    7070    wrdN = ur_lookup( global, UR_ATOM_KERNEL_OPS ); 
     
    358358 
    359359 
    360 #define _throwUnset(th,cell)    _throwUnsetF(th,cell,"unset") 
    361 #define _throwUnbound(th,cell)  _throwUnsetF(th,cell,"unbound") 
     360#define _throwUnset(th,cell)    _throwUnsetF(th,cell,"is unset") 
     361#define _throwUnbound(th,cell)  _throwUnsetF(th,cell,"is unbound") 
    362362 
    363363static void _throwUnsetF( UThread* ut, const UCell* wcell, const char* umsg ) 
     
    368368    ur_atomStr( ur_atom(wcell), str ); 
    369369    ur_termCStr( str ); 
    370     ur_throwErr( UR_ERR_SCRIPT, "word '%s is %s", str->ptr.c, umsg ); 
     370    ur_throwErr( UR_ERR_SCRIPT, "word '%s %s", str->ptr.c, umsg ); 
    371371} 
    372372 
     
    413413                ++it; 
    414414            } 
    415             _throwUnsetF( ut, pc, "out-of-scope local" ); 
     415            _throwUnsetF( ut, pc, "is out-of-scope local" ); 
    416416            return 0; 
    417417        } 
     
    419419            if( pc->word.wordBlk != ut->localWordBlk ) 
    420420            { 
    421                 _throwUnsetF( ut, pc, "out-of-scope local" ); 
     421                _throwUnsetF( ut, pc, "is out-of-scope local" ); 
    422422                return 0; 
    423423            } 
     
    431431    } 
    432432 
    433     _throwUnsetF( ut, pc, "Invalid bind mask" ); 
     433    _throwUnsetF( ut, pc, "has invalid bind mask" ); 
    434434    return 0; 
    435435} 
     
    452452    { 
    453453        case UR_BIND_THREAD: 
    454             // ur_blockPtr( pc->word.valBlk ) 
    455             blk = (((UBlock*) ut->blocks.arr.ptr.v) + pc->word.valBlk); 
     454            blk = tBlockPtr( pc->word.valBlk ); 
    456455            dest = blk->ptr.cells + wrdN; 
    457456            break; 
    458457 
    459458        case UR_BIND_GLOBAL: 
    460             // ur_blockPtr( pc->word.valBlk ) 
    461             blk = (((UBlock*) ut->env->blocks.arr.ptr.v) - pc->word.valBlk); 
    462             dest = blk->ptr.cells + wrdN; 
    463             break; 
     459            _throwUnsetF( ut, pc, "is in shared global storage" ); 
     460            return 0; 
    464461 
    465462        case UR_BIND_LOCAL: 
     
    476473                ++it; 
    477474            } 
    478             _throwUnsetF( ut, pc, "out-of-scope local" ); 
     475            _throwUnsetF( ut, pc, "is out-of-scope local" ); 
    479476            return 0; 
    480477        } 
     
    482479#ifdef UR_CONFIG_DATAFLOW 
    483480        case UR_BIND_PLUG: 
    484             // Assuming there are no global components. 
     481            // Using tBlockPtr - assuming there are no global components. 
    485482            ur_setPlug( ut, tBlockPtr(pc->word.valBlk), wrdN, val ); 
    486483            return 1; 
     
    488485 
    489486        default: 
    490             _throwUnsetF( ut, pc, "Invalid bind mask" ); 
     487            _throwUnsetF( ut, pc, "has invalid bind mask" ); 
    491488            return 0; 
    492489    } 
     
    520517    if( end != cmd ) 
    521518    { 
    522         blkN = ur_tokenize( ut, cmd, end, 0 ); 
     519        blkN = ur_tokenize( ut, cmd, end ); 
    523520        if( blkN ) 
    524521        { 
     
    984981            if( tos->word.valBlk == BLK_GLOBAL_VAL ) 
    985982            { 
    986                 tos->word.index = ur_internWord( &ur_global, ur_atom(tos) ); 
     983                tos->word.index = ur_internWord( &ur_thrGlobal, ur_atom(tos) ); 
    987984            } 
    988985            else     
  • branches/thune/thread_safe/gl/gx_atoms.h

    r420 r427  
    11// This file is automatically generated - do not edit. 
    22 
    3 #define UR_ATOM_DRAW_LIST_OPCODES               316 
    4 #define UR_ATOM_WIDTH           317 
    5 #define UR_ATOM_HEIGHT          318 
    6 #define UR_ATOM_AREA            319 
    7 #define UR_ATOM_RECT            320 
    8 #define UR_ATOM_RASTER          321 
    9 #define UR_ATOM_TEXTURE         322 
    10 #define UR_ATOM_ELEM            323 
    11 #define UR_ATOM_CLOSE           176 
    12 #define UR_ATOM_FOCUS           324 
    13 #define UR_ATOM_RESIZE          325 
    14 #define UR_ATOM_KEY_DOWN                326 
    15 #define UR_ATOM_KEY_UP          327 
    16 #define UR_ATOM_MOUSE_MOVE              328 
    17 #define UR_ATOM_MOUSE_UP                329 
    18 #define UR_ATOM_MOUSE_DOWN              330 
    19 #define UR_ATOM_MOUSE_WHEEL             331 
    20 #define UR_ATOM_AMBIENT         332 
    21 #define UR_ATOM_DIFFUSE         333 
    22 #define UR_ATOM_SPECULAR                334 
    23 #define UR_ATOM_POS             335 
    24 #define UR_ATOM_SHADER          336 
    25 #define UR_ATOM_VERTEX          337 
    26 #define UR_ATOM_FRAGMENT                338 
    27 #define UR_ATOM_DEFAULT         339 
    28 #define UR_ATOM_WAIT            340 
    29 #define UR_ATOM_RGB             341 
    30 #define UR_ATOM_RGBA            342 
    31 #define UR_ATOM_DEPTH           343 
    32 #define UR_ATOM_CLAMP           344 
    33 #define UR_ATOM_REPEAT          345 
    34 #define UR_ATOM_NEAREST         346 
    35 #define UR_ATOM_LINEAR          347 
    36 #define UR_ATOM_MIN             348 
    37 #define UR_ATOM_MAG             349 
    38 #define UR_ATOM_MIPMAP          350 
    39 #define UR_ATOM_ON              255 
    40 #define UR_ATOM_OFF             257 
    41 #define UR_ATOM_ADD             195 
    42 #define UR_ATOM_BURN            351 
    43 #define UR_ATOM_COLOR           352 
    44 #define UR_ATOM_TRANS           353 
    45 #define UR_ATOM_SPRITE          354 
     3#define UR_ATOM_DRAW_LIST_OPCODES               317 
     4#define UR_ATOM_WIDTH           318 
     5#define UR_ATOM_HEIGHT          319 
     6#define UR_ATOM_AREA            320 
     7#define UR_ATOM_RECT            321 
     8#define UR_ATOM_RASTER          322 
     9#define UR_ATOM_TEXTURE         323 
     10#define UR_ATOM_ELEM            324 
     11#define UR_ATOM_CLOSE           177 
     12#define UR_ATOM_FOCUS           325 
     13#define UR_ATOM_RESIZE          326 
     14#define UR_ATOM_KEY_DOWN                327 
     15#define UR_ATOM_KEY_UP          328 
     16#define UR_ATOM_MOUSE_MOVE              329 
     17#define UR_ATOM_MOUSE_UP                330 
     18#define UR_ATOM_MOUSE_DOWN              331 
     19#define UR_ATOM_MOUSE_WHEEL             332 
     20#define UR_ATOM_AMBIENT         333 
     21#define UR_ATOM_DIFFUSE         334 
     22#define UR_ATOM_SPECULAR                335 
     23#define UR_ATOM_POS             336 
     24#define UR_ATOM_SHADER          337 
     25#define UR_ATOM_VERTEX          338 
     26#define UR_ATOM_FRAGMENT                339 
     27#define UR_ATOM_DEFAULT         340 
     28#define UR_ATOM_WAIT            341 
     29#define UR_ATOM_RGB             342 
     30#define UR_ATOM_RGBA            343 
     31#define UR_ATOM_DEPTH           344 
     32#define UR_ATOM_CLAMP           345 
     33#define UR_ATOM_REPEAT          346 
     34#define UR_ATOM_NEAREST         347 
     35#define UR_ATOM_LINEAR          348 
     36#define UR_ATOM_MIN             349 
     37#define UR_ATOM_MAG             350 
     38#define UR_ATOM_MIPMAP          351 
     39#define UR_ATOM_ON              256 
     40#define UR_ATOM_OFF             258 
     41#define UR_ATOM_ADD             196 
     42#define UR_ATOM_BURN            352 
     43#define UR_ATOM_COLOR           353 
     44#define UR_ATOM_TRANS           354 
     45#define UR_ATOM_SPRITE          355 
  • branches/thune/thread_safe/make.c

    r426 r427  
    3333extern double ur_stringToDec( const char*, const char*, const char** ); 
    3434 
    35 extern UContext ur_global; 
    36 extern UContext ur_envGlobal; 
     35extern UContext ur_thrGlobal; 
    3736 
    3837 
    3938//#define GC_STRESS_TEST  1 
    4039 
     40 
     41extern void ur_internDefault( UThread* ut, UCell* wc, UAtom atom, 
     42                              UCell* cbot, UCell* ctop ); 
    4143 
    4244/* 
     
    4547static void ur_internGlobal( UThread* ut, UCell* wc, UAtom atom ) 
    4648{ 
    47     UBlock* mblk; 
    48     UCell* mtop; 
    49     UCell* mbot; 
    50     int wrdN; 
    51  
    52     // Look for atom in module context stack. 
    53     mblk = ur_blockPtr( BLK_CTX_STACK ); 
    54     mbot = mblk->ptr.cells; 
    55     mtop = mbot + mblk->used; 
    56     do 
    57     { 
    58         --mtop; 
    59         wrdN = ur_lookup( mtop, atom ); 
    60         if( wrdN > -1 ) 
    61             goto assign; 
    62     } 
    63     while( mtop != mbot ); 
    64  
    65  
    66     // Now try the shared global context. 
    67     if( ut->env->blocks.arr.used ) 
    68     { 
    69         wrdN = ur_lookup( &ur_envGlobal, atom ); 
    70         if( wrdN > -1 ) 
    71         { 
    72             ur_setBindType( wc, UR_BIND_GLOBAL ); 
    73             wc->word.wordBlk = ur_envGlobal.ctx.wordBlk; 
    74             wc->word.valBlk  = ur_envGlobal.ctx.valBlk; 
    75             wc->word.index   = wrdN; 
    76             return; 
    77         } 
    78     } 
    79  
    80     // Word not found, so intern into current module (top of context stack). 
    81     mtop = mbot + (mblk->used - 1); 
    82     wrdN = ur_internWord( mtop, atom ); 
    83  
    84 assign: 
    85  
    86     // UR_BIND_THREAD should already be set. 
    87     wc->word.wordBlk = mtop->ctx.wordBlk; 
    88     wc->word.valBlk  = mtop->ctx.valBlk; 
    89     wc->word.index   = wrdN; 
     49    UBlock* cblk = tBlockPtr( BLK_CTX_STACK ); 
     50    ur_internDefault( ut, wc, atom, cblk->ptr.cells, 
     51                                    cblk->ptr.cells + cblk->used ); 
    9052} 
    9153 
     
    12821244            ++cp; 
    12831245 
    1284         wrdN = ur_internWord( &ur_global, 
     1246        wrdN = ur_internWord( &ur_thrGlobal, 
    12851247                              ur_intern(def->name, cp - def->name) ); 
    12861248 
     
    12881250        ur_initType( cell, UT_CALL ); 
    12891251        cell->call.addr = (call_t) def->addr; 
    1290  
    1291         /* 
    1292         ur_appendWord( wblk, UT_WORD, "make", 4 ); 
    1293         cell = ur_appendCell( vblk, UT_CALL ); 
    1294         cell->call.addr = (call_t) uc_make; 
    1295         */ 
    12961252 
    12971253        ++def; 
     
    13201276    UCell* cell = ur_appendCell( blk, type ); 
    13211277 
     1278#if 0 
    13221279    // Add word to global context. 
    13231280 
    13241281    ur_atom(cell) = ur_intern( name, len ); 
    13251282    ur_sel(cell)  = UR_CTX_UNORDERED; 
     1283 
    13261284    ur_internGlobal( ut, cell, ur_atom(cell) ); 
     1285#else 
     1286    ur_setUnbound( cell, ur_intern( name, len ) ); 
     1287#endif 
    13271288 
    13281289    return cell; 
     
    16161577                if( spA ) 
    16171578                { 
    1618                     blkN = ur_tokenize( ut, spA, spB, 0 ); 
     1579                    blkN = ur_tokenize( ut, spA, spB ); 
    16191580                    if( ! blkN ) 
    16201581                        return;     // ur_tokenize() has thrown. 
  • branches/thune/thread_safe/thune.c

    r426 r427  
    475475                            tblkN = ur_tokenize( ut, 
    476476                                                 str->ptr.c + val->series.it, 
    477                                                  str->ptr.c + str->used, 0 ); 
     477                                                 str->ptr.c + str->used ); 
    478478                            if( ! tblkN ) 
    479479                                goto throw_cc; 
  • branches/thune/thread_safe/tokenize.c

    r426 r427  
    2929extern void ur_makeVec3( UCell* res, const char* spA, const char* spB ); 
    3030extern const char* ur_readBinary( UBinary*, const char* it, const char* end ); 
     31 
     32extern void ur_bindDefault( UThread*, UIndex blkN ); 
    3133 
    3234 
     
    299301 \return  Returns block index or zero if an error is thrown. 
    300302*/ 
    301 UIndex ur_tokenize( UThread* ut, const char* it, const char* end, 
    302                     void* tci ) 
     303UIndex ur_tokenize( UThread* ut, const char* it, const char* end ) 
    303304{ 
    304305    UArray stack; 
     
    314315    int macroNest = 0; 
    315316#endif 
    316  
    317     (void) tci; 
    318317 
    319318 
     
    441440                        UCell* otos; 
    442441                        UBlock* blk; 
     442                        UIndex blkN; 
    443443 
    444444                        otos = UR_TOS; 
    445                         ur_infuseOpcodes( ut, STACK[ stack.used ] ); 
    446                         tn = ur_eval( ut, STACK[ stack.used ], 0 ); 
     445                        blkN = STACK[ stack.used ]; 
     446 
     447                        ur_bindDefault( ut, blkN ); 
     448                        ur_infuseOpcodes( ut, blkN ); 
     449 
     450                        tn = ur_eval( ut, blkN, 0 ); 
    447451                        if( tn == UR_EVAL_ERROR ) 
    448452                        { 
     
    10351039    hold = STACK[0]; 
    10361040    ur_arrayFree( &stack ); 
     1041 
     1042    ur_bindDefault( ut, hold ); 
     1043 
    10371044    return hold; 
    10381045 
  • branches/thune/thread_safe/urlan.c

    r426 r427  
    4040   The global context is fixed so it can be shared by all UrlanEnv instances. 
    4141*/ 
    42 UCellContext ur_global = 
     42UCellContext ur_thrGlobal = 
    4343{ 
    4444    UT_CONTEXT, 0, 0, 
     
    209209    dtBlk = ur_blockPtr( blkN ); 
    210210 
    211     i = ur_internWord( (UCell*) &ur_global, ur_intern( "datatypes", 9 ) ); 
     211    i = ur_internWord( (UCell*) &ur_thrGlobal, ur_intern( "datatypes", 9 ) ); 
    212212    cell = vblk->ptr.cells + i; 
    213213    ur_initBlock( cell, blkN, 0 ); 
     
    222222 
    223223    /* Add 'none */ 
    224     i = ur_internWord( (UCell*) &ur_global, ur_intern( "none", 4 ) ); 
     224    i = ur_internWord( (UCell*) &ur_thrGlobal, ur_intern( "none", 4 ) ); 
    225225    cell = vblk->ptr.cells + i; 
    226226    ur_initType( cell, UT_NONE ); 
     
    502502    //ur_makeBlock( 0 );        // 4 - BLK_DSTACK 
    503503 
    504     ur_pushContext( ut, (UCell*) &ur_global ); 
     504    ur_pushContext( ut, (UCell*) &ur_thrGlobal ); 
    505505 
    506506    { 
     
    530530    ur_evalCStr( _bootScript, sizeof(_bootScript) ); 
    531531#else 
    532     n = ur_tokenize( ut, _bootScript, 
    533                      _bootScript + sizeof(_bootScript), 0 ); 
     532    n = ur_tokenize( ut, _bootScript, _bootScript + sizeof(_bootScript) ); 
    534533    if( ! n ) 
    535534        return UR_EVAL_ERROR; 
    536     ur_bind( n, (UCell*) &ur_global ); 
     535    ur_bind( n, (UCell*) &ur_thrGlobal ); 
    537536    n = ur_eval( ut, n, 0 ); 
    538537    if( n != UR_EVAL_OK ) 
     
    674673    //ur_makeBlock( 1024 );     // 4 - BLK_DSTACK 
    675674 
    676     ur_pushContext( ut, (UCell*) &ur_global ); 
     675    ur_pushContext( ut, (UCell*) &ur_thrGlobal ); 
    677676 
    678677    ur_makeBinary( 0 );       // 0 - BIN_THREAD_TMP 
     
    855854    UCell* val; 
    856855 
    857     val = (UCell*) &ur_global; 
     856    val = (UCell*) &ur_thrGlobal; 
    858857    wrd = ur_lookup( val, firstAtom ); 
    859858    if( wrd < 0 ) 
  • branches/thune/thread_safe/urlan.h

    r426 r427  
    539539void    ur_gcMarkBlock( UCollector*, UIndex ); 
    540540void    ur_gcMarkResource( UCollector*, UIndex ); 
    541 UIndex  ur_tokenize( UThread*, const char* it, const char* end, void* ); 
     541UIndex  ur_tokenize( UThread*, const char* it, const char* end ); 
    542542void    ur_throwErr( UThread*, int exceptionType, const char* fmt, ... ); 
    543543int     ur_userAllows( UThread*, const char* fmt, ... );