Changeset 427
- Timestamp:
- 07/07/07 04:41:31 (15 months ago)
- Location:
- branches/thune/thread_safe
- Files:
-
- 8 modified
Legend:
- Unmodified
- Added
- Removed
-
branches/thune/thread_safe/context.c
r426 r427 526 526 527 527 528 extern UContext ur_envGlobal; 529 530 /* 531 wc->flags, wc->word wordBlk, valBlk, & index are set. 532 ctop must be greater than cbot. 533 */ 534 void 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 570 assign: 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 579 static 580 UBlock* _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 636 void 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 */ 667 void 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 528 691 /*EOF*/ -
branches/thune/thread_safe/eval.c
r426 r427 24 24 25 25 26 extern UContext ur_ global;26 extern UContext ur_thrGlobal; 27 27 extern UContext ur_envGlobal; 28 28 … … 66 66 int wrdN; 67 67 68 global = (ut->env->blocks.arr.used) ? &ur_envGlobal : &ur_ global;68 global = (ut->env->blocks.arr.used) ? &ur_envGlobal : &ur_thrGlobal; 69 69 70 70 wrdN = ur_lookup( global, UR_ATOM_KERNEL_OPS ); … … 358 358 359 359 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") 362 362 363 363 static void _throwUnsetF( UThread* ut, const UCell* wcell, const char* umsg ) … … 368 368 ur_atomStr( ur_atom(wcell), str ); 369 369 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 ); 371 371 } 372 372 … … 413 413 ++it; 414 414 } 415 _throwUnsetF( ut, pc, " out-of-scope local" );415 _throwUnsetF( ut, pc, "is out-of-scope local" ); 416 416 return 0; 417 417 } … … 419 419 if( pc->word.wordBlk != ut->localWordBlk ) 420 420 { 421 _throwUnsetF( ut, pc, " out-of-scope local" );421 _throwUnsetF( ut, pc, "is out-of-scope local" ); 422 422 return 0; 423 423 } … … 431 431 } 432 432 433 _throwUnsetF( ut, pc, " Invalid bind mask" );433 _throwUnsetF( ut, pc, "has invalid bind mask" ); 434 434 return 0; 435 435 } … … 452 452 { 453 453 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 ); 456 455 dest = blk->ptr.cells + wrdN; 457 456 break; 458 457 459 458 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; 464 461 465 462 case UR_BIND_LOCAL: … … 476 473 ++it; 477 474 } 478 _throwUnsetF( ut, pc, " out-of-scope local" );475 _throwUnsetF( ut, pc, "is out-of-scope local" ); 479 476 return 0; 480 477 } … … 482 479 #ifdef UR_CONFIG_DATAFLOW 483 480 case UR_BIND_PLUG: 484 // Assuming there are no global components.481 // Using tBlockPtr - assuming there are no global components. 485 482 ur_setPlug( ut, tBlockPtr(pc->word.valBlk), wrdN, val ); 486 483 return 1; … … 488 485 489 486 default: 490 _throwUnsetF( ut, pc, " Invalid bind mask" );487 _throwUnsetF( ut, pc, "has invalid bind mask" ); 491 488 return 0; 492 489 } … … 520 517 if( end != cmd ) 521 518 { 522 blkN = ur_tokenize( ut, cmd, end , 0);519 blkN = ur_tokenize( ut, cmd, end ); 523 520 if( blkN ) 524 521 { … … 984 981 if( tos->word.valBlk == BLK_GLOBAL_VAL ) 985 982 { 986 tos->word.index = ur_internWord( &ur_ global, ur_atom(tos) );983 tos->word.index = ur_internWord( &ur_thrGlobal, ur_atom(tos) ); 987 984 } 988 985 else -
branches/thune/thread_safe/gl/gx_atoms.h
r420 r427 1 1 // This file is automatically generated - do not edit. 2 2 3 #define UR_ATOM_DRAW_LIST_OPCODES 31 64 #define UR_ATOM_WIDTH 31 75 #define UR_ATOM_HEIGHT 31 86 #define UR_ATOM_AREA 3 197 #define UR_ATOM_RECT 32 08 #define UR_ATOM_RASTER 32 19 #define UR_ATOM_TEXTURE 32 210 #define UR_ATOM_ELEM 32 311 #define UR_ATOM_CLOSE 17 612 #define UR_ATOM_FOCUS 32 413 #define UR_ATOM_RESIZE 32 514 #define UR_ATOM_KEY_DOWN 32 615 #define UR_ATOM_KEY_UP 32 716 #define UR_ATOM_MOUSE_MOVE 32 817 #define UR_ATOM_MOUSE_UP 3 2918 #define UR_ATOM_MOUSE_DOWN 33 019 #define UR_ATOM_MOUSE_WHEEL 33 120 #define UR_ATOM_AMBIENT 33 221 #define UR_ATOM_DIFFUSE 33 322 #define UR_ATOM_SPECULAR 33 423 #define UR_ATOM_POS 33 524 #define UR_ATOM_SHADER 33 625 #define UR_ATOM_VERTEX 33 726 #define UR_ATOM_FRAGMENT 33 827 #define UR_ATOM_DEFAULT 3 3928 #define UR_ATOM_WAIT 34 029 #define UR_ATOM_RGB 34 130 #define UR_ATOM_RGBA 34 231 #define UR_ATOM_DEPTH 34 332 #define UR_ATOM_CLAMP 34 433 #define UR_ATOM_REPEAT 34 534 #define UR_ATOM_NEAREST 34 635 #define UR_ATOM_LINEAR 34 736 #define UR_ATOM_MIN 34 837 #define UR_ATOM_MAG 3 4938 #define UR_ATOM_MIPMAP 35 039 #define UR_ATOM_ON 25 540 #define UR_ATOM_OFF 25 741 #define UR_ATOM_ADD 19 542 #define UR_ATOM_BURN 35 143 #define UR_ATOM_COLOR 35 244 #define UR_ATOM_TRANS 35 345 #define UR_ATOM_SPRITE 35 43 #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 33 33 extern double ur_stringToDec( const char*, const char*, const char** ); 34 34 35 extern UContext ur_global; 36 extern UContext ur_envGlobal; 35 extern UContext ur_thrGlobal; 37 36 38 37 39 38 //#define GC_STRESS_TEST 1 40 39 40 41 extern void ur_internDefault( UThread* ut, UCell* wc, UAtom atom, 42 UCell* cbot, UCell* ctop ); 41 43 42 44 /* … … 45 47 static void ur_internGlobal( UThread* ut, UCell* wc, UAtom atom ) 46 48 { 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 ); 90 52 } 91 53 … … 1282 1244 ++cp; 1283 1245 1284 wrdN = ur_internWord( &ur_ global,1246 wrdN = ur_internWord( &ur_thrGlobal, 1285 1247 ur_intern(def->name, cp - def->name) ); 1286 1248 … … 1288 1250 ur_initType( cell, UT_CALL ); 1289 1251 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 */1296 1252 1297 1253 ++def; … … 1320 1276 UCell* cell = ur_appendCell( blk, type ); 1321 1277 1278 #if 0 1322 1279 // Add word to global context. 1323 1280 1324 1281 ur_atom(cell) = ur_intern( name, len ); 1325 1282 ur_sel(cell) = UR_CTX_UNORDERED; 1283 1326 1284 ur_internGlobal( ut, cell, ur_atom(cell) ); 1285 #else 1286 ur_setUnbound( cell, ur_intern( name, len ) ); 1287 #endif 1327 1288 1328 1289 return cell; … … 1616 1577 if( spA ) 1617 1578 { 1618 blkN = ur_tokenize( ut, spA, spB , 0);1579 blkN = ur_tokenize( ut, spA, spB ); 1619 1580 if( ! blkN ) 1620 1581 return; // ur_tokenize() has thrown. -
branches/thune/thread_safe/thune.c
r426 r427 475 475 tblkN = ur_tokenize( ut, 476 476 str->ptr.c + val->series.it, 477 str->ptr.c + str->used , 0);477 str->ptr.c + str->used ); 478 478 if( ! tblkN ) 479 479 goto throw_cc; -
branches/thune/thread_safe/tokenize.c
r426 r427 29 29 extern void ur_makeVec3( UCell* res, const char* spA, const char* spB ); 30 30 extern const char* ur_readBinary( UBinary*, const char* it, const char* end ); 31 32 extern void ur_bindDefault( UThread*, UIndex blkN ); 31 33 32 34 … … 299 301 \return Returns block index or zero if an error is thrown. 300 302 */ 301 UIndex ur_tokenize( UThread* ut, const char* it, const char* end, 302 void* tci ) 303 UIndex ur_tokenize( UThread* ut, const char* it, const char* end ) 303 304 { 304 305 UArray stack; … … 314 315 int macroNest = 0; 315 316 #endif 316 317 (void) tci;318 317 319 318 … … 441 440 UCell* otos; 442 441 UBlock* blk; 442 UIndex blkN; 443 443 444 444 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 ); 447 451 if( tn == UR_EVAL_ERROR ) 448 452 { … … 1035 1039 hold = STACK[0]; 1036 1040 ur_arrayFree( &stack ); 1041 1042 ur_bindDefault( ut, hold ); 1043 1037 1044 return hold; 1038 1045 -
branches/thune/thread_safe/urlan.c
r426 r427 40 40 The global context is fixed so it can be shared by all UrlanEnv instances. 41 41 */ 42 UCellContext ur_ global =42 UCellContext ur_thrGlobal = 43 43 { 44 44 UT_CONTEXT, 0, 0, … … 209 209 dtBlk = ur_blockPtr( blkN ); 210 210 211 i = ur_internWord( (UCell*) &ur_ global, ur_intern( "datatypes", 9 ) );211 i = ur_internWord( (UCell*) &ur_thrGlobal, ur_intern( "datatypes", 9 ) ); 212 212 cell = vblk->ptr.cells + i; 213 213 ur_initBlock( cell, blkN, 0 ); … … 222 222 223 223 /* Add 'none */ 224 i = ur_internWord( (UCell*) &ur_ global, ur_intern( "none", 4 ) );224 i = ur_internWord( (UCell*) &ur_thrGlobal, ur_intern( "none", 4 ) ); 225 225 cell = vblk->ptr.cells + i; 226 226 ur_initType( cell, UT_NONE ); … … 502 502 //ur_makeBlock( 0 ); // 4 - BLK_DSTACK 503 503 504 ur_pushContext( ut, (UCell*) &ur_ global );504 ur_pushContext( ut, (UCell*) &ur_thrGlobal ); 505 505 506 506 { … … 530 530 ur_evalCStr( _bootScript, sizeof(_bootScript) ); 531 531 #else 532 n = ur_tokenize( ut, _bootScript, 533 _bootScript + sizeof(_bootScript), 0 ); 532 n = ur_tokenize( ut, _bootScript, _bootScript + sizeof(_bootScript) ); 534 533 if( ! n ) 535 534 return UR_EVAL_ERROR; 536 ur_bind( n, (UCell*) &ur_ global );535 ur_bind( n, (UCell*) &ur_thrGlobal ); 537 536 n = ur_eval( ut, n, 0 ); 538 537 if( n != UR_EVAL_OK ) … … 674 673 //ur_makeBlock( 1024 ); // 4 - BLK_DSTACK 675 674 676 ur_pushContext( ut, (UCell*) &ur_ global );675 ur_pushContext( ut, (UCell*) &ur_thrGlobal ); 677 676 678 677 ur_makeBinary( 0 ); // 0 - BIN_THREAD_TMP … … 855 854 UCell* val; 856 855 857 val = (UCell*) &ur_ global;856 val = (UCell*) &ur_thrGlobal; 858 857 wrd = ur_lookup( val, firstAtom ); 859 858 if( wrd < 0 ) -
branches/thune/thread_safe/urlan.h
r426 r427 539 539 void ur_gcMarkBlock( UCollector*, UIndex ); 540 540 void ur_gcMarkResource( UCollector*, UIndex ); 541 UIndex ur_tokenize( UThread*, const char* it, const char* end , void*);541 UIndex ur_tokenize( UThread*, const char* it, const char* end ); 542 542 void ur_throwErr( UThread*, int exceptionType, const char* fmt, ... ); 543 543 int ur_userAllows( UThread*, const char* fmt, ... );
