Changeset 26
- Timestamp:
- 02/07/06 00:52:42 (3 years ago)
- Location:
- trunk/orca
- Files:
-
- 7 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/orca/bytecode.c
r25 r26 55 55 case OT_REFINEMENT: 56 56 { 57 int len;57 int pos; 58 58 int atom; 59 OString* str;60 59 61 60 atom = (val->type == OT_REFINEMENT) ? val->index : val->word.atom; 62 63 str = orAtomString( atom ); 64 65 // LIMIT: Assuming word names are never more than 255 characters. 66 67 len = str->used + 2; 68 RESERVE( len ); 61 pos = bin->used; 62 63 orArrayReserve( bin, 1, bin->used + 2 ); 64 bin->used += 2; 65 66 orAtomStr( atom, bin ); 67 68 // LIMIT: Word names can never be more than 255 characters. 69 cp = bin->byteArray + pos; 69 70 *cp++ = val->type; 70 *cp++ = str->used; 71 72 memCpy( cp, str->charArray, str->used ); 71 *cp = bin->used - pos - 2; 73 72 } 74 73 break; -
trunk/orca/context.c
r25 r26 25 25 26 26 27 OIndex orInternAtom( const char* str, int len ) 27 typedef struct 28 { 29 uint16_t nameIndex; // Index into BIN_ATOM_NAMES ptr.c 30 uint16_t nameLen; 31 } 32 AtomRec; 33 34 35 /** 36 Appends atom name to string. 37 */ 38 void orAtomStr( OAtom atom, OString* str ) 39 { 40 OBinary* names; 41 AtomRec* rec; 42 43 rec = ((AtomRec*) orEnv->atoms.buf) + atom; 44 names = orStringPtr( BIN_ATOM_NAMES ); 45 46 orArrayReserve( str, sizeof(char), str->used + rec->nameLen ); 47 memCpy( str->charArray + str->used, 48 names->charArray + rec->nameIndex, 49 rec->nameLen ); 50 str->used += rec->nameLen; 51 } 52 53 54 const char* orAtomCString( OAtom atom ) 55 { 56 static char buf[ MAX_WORD_LEN + 1 ]; 57 OBinary* names; 58 AtomRec* rec; 59 60 rec = ((AtomRec*) orEnv->atoms.buf) + atom; 61 names = orStringPtr( BIN_ATOM_NAMES ); 62 63 memCpy( buf, names->charArray + rec->nameIndex, rec->nameLen ); 64 buf[ rec->nameLen ] = '\0'; 65 return buf; 66 } 67 68 69 /** 70 Add atom to environment. 71 72 \param str Name of atom. 73 \param len Number of characters. Str will be truncated if greater than 32. 74 75 \returns Atom 76 */ 77 OAtom orInternAtom( const char* str, int len ) 28 78 { 29 79 char* cp; 30 80 const char* ep; 31 81 const char* sp; 32 OString* cstr;33 82 OArray* atoms; 34 OIndex* it; 35 OIndex* end; 83 OString* names; 84 AtomRec* rec; 85 AtomRec* end; 86 char buf[ MAX_WORD_LEN ]; 36 87 37 88 38 89 assert( len > 0 ); 39 assert( (unsigned int) len < sizeof(orTmp) ); 40 41 // Make lowercase and find end of string. 42 43 cp = orTmp; 44 ep = cp + len; 90 91 if( len > MAX_WORD_LEN ) 92 len = MAX_WORD_LEN; 93 94 // Make lowercase. 95 96 cp = buf; 97 ep = buf + len; 45 98 while( cp != ep ) 46 99 { … … 51 104 } 52 105 53 54 106 // Check if atom already exists. 55 107 56 108 atoms = &orEnv->atoms; 57 it = atoms->indices; 58 end = it + atoms->used; 59 60 while( it != end ) 61 { 62 cstr = orSTRINGS + *it; 63 if( cstr->used == len ) 64 { 65 sp = cstr->charArray; 66 cp = orTmp; 109 rec = (AtomRec*) atoms->buf; 110 end = rec + atoms->used; 111 112 names = orStringPtr( BIN_ATOM_NAMES ); 113 114 while( rec != end ) 115 { 116 if( rec->nameLen == len ) 117 { 118 sp = names->charArray + rec->nameIndex; 119 cp = buf; 67 120 while( cp != ep ) 68 121 { … … 73 126 74 127 if( cp == ep ) 75 return it - atoms->indices;76 } 77 ++ it;128 goto done; 129 } 130 ++rec; 78 131 } 79 132 … … 81 134 // Nope, add new atom. 82 135 83 // Must increment atoms->used after orMakeCString() in case garbage 84 // collection occurs (*it will be uninitialized). 85 //OA_EXPAND1( OIndex, atoms, it ); 86 orArrayReserve(atoms, sizeof(OIndex), atoms->used+1); 87 it = atoms->indices + atoms->used; 88 *it = orMakeCString( orTmp, len ); 89 ++atoms->used; 90 return it - atoms->indices; 136 OA_EXPAND1( AtomRec, atoms, rec ); 137 rec->nameIndex = names->used; 138 rec->nameLen = len; 139 140 orArrayReserve( names, sizeof(char), names->used + len ); 141 memCpy( names->charArray + names->used, buf, len ); 142 names->used += len; 143 144 done: 145 146 return rec - ((AtomRec*) atoms->buf); 91 147 } 92 148 -
trunk/orca/gc.c
r1 r26 518 518 assert( orEnv->error == 0 ); 519 519 520 521 // Enable this if orLockGarbageCollector() is removed. 522 //orSetBit( bsStr.byteArray, BIN_ATOM_NAMES ); 523 520 524 blk = (OBlock*) orEnv->blocks.buf; 521 525 … … 581 585 582 586 583 {584 // Mark strings used by atoms.585 int idx;586 OIndex* it = orEnv->atoms.indices + orEnv->sweepStartAtom;587 OIndex* end = orEnv->atoms.indices + orEnv->atoms.used;588 while( it != end )589 {590 idx = *it - orEnv->freeStrings.sweepStart;591 if( idx >= 0 )592 orSetBit( bsStr.byteArray, idx );593 ++it;594 }595 }596 597 587 orSweepArray( &bsBlk, &orEnv->freeBlocks, &orEnv->blocks ); 598 588 orSweepArray( &bsStr, &orEnv->freeStrings, &orEnv->strings ); -
trunk/orca/internal.h
r1 r26 2 2 #define INTERNAL_H 3 3 4 5 #define MAX_WORD_LEN 32 /* LIMIT: word length */ 6 7 #define BIN_ATOM_NAMES 0 4 8 5 9 #define GLOBAL_CTXN 0 -
trunk/orca/ovalue.c
r25 r26 101 101 102 102 extern OBlock* orTokenize( const char*, const char* ); 103 extern const char* orAtomCString( OAtom ); 103 104 104 105 extern void orBindNative( OValue* ); … … 336 337 orInitAGC( &env->freeIntArr ); 337 338 #endif 339 340 orMakeString( 2048 ); // BIN_ATOM_NAMES 338 341 339 342 makeGlobalContext(); … … 1366 1369 if( val->type == OT_UNSET ) 1367 1370 { 1368 OString* str = orAtomString( a1->word.atom ); 1369 orError( "%s has no value", str->charArray ); 1371 orError( "%s has no value", orAtomCString( a1->word.atom ) ); 1370 1372 } 1371 1373 else … … 1996 1998 1997 1999 unset: 1998 { 1999 OString* str; 2000 str = orAtomString( pit->word.atom ); 2001 orError( "Path word %s has no value", str->charArray ); 2002 } 2000 orError( "Path word %s has no value", orAtomCString( pit->word.atom ) ); 2003 2001 return -1; 2004 2002 … … 2220 2218 { 2221 2219 case OT_UNSET: 2222 { 2223 OString* str = orAtomString( pc->word.atom ); 2224 orError( "%s has no value", str->charArray ); 2225 } 2220 orError( "%s has no value", orAtomCString(pc->word.atom) ); 2226 2221 return -1; 2227 2222 … … 2317 2312 if( wblk->values[ pc->word.index ].flags & OR_WORD_PROT ) 2318 2313 { 2319 OString* str = orAtomString( pc->word.atom );2320 orError( "Word %s is protected", str->charArray);2314 orError( "Word %s is protected", 2315 orAtomCString( pc->word.atom ) ); 2321 2316 goto sThrown; 2322 2317 } 2323 2318 } 2324 2319 #ifdef TRACE 2325 cprint( "TR> %s:\n", orAtom String(pc->word.atom)->charArray);2320 cprint( "TR> %s:\n", orAtomCString( pc->word.atom ) ); 2326 2321 #endif 2327 2322 PUSH_CALL( wval, OC_SETWORD, 0 ); … … 2768 2763 if( si == send ) 2769 2764 { 2770 OString* str = orAtomString( pp->word.atom );2771 orError( "Function has no refinement %s", str->charArray );2765 orError( "Function has no refinement %s", 2766 orAtomCString( pp->word.atom ) ); 2772 2767 goto sThrown; 2773 2768 } … … 3093 3088 (it->type == OT_LITWORD) ) 3094 3089 { 3095 OString* str = orAtomString( it->word.atom );3096 3090 dprint( " %d %d %s\n", it->word.context, it->word.index, 3097 str->charArray);3091 orAtomCString( it->word.atom ) ); 3098 3092 } 3099 3093 else if( it->type == OT_DATATYPE ) … … 3938 3932 orDatatypeName(type), 3939 3933 (orSTRINGS + wrd->str)->charArray, 3940 orAtom String(wrd->atom)->charArray,3934 orAtomCString( wrd->atom ), 3941 3935 val->word.atom ); 3942 3936 #endif … … 4286 4280 { 4287 4281 #if 0 4288 OString* str = orAtomString( it->word.atom );4289 dprint( "orFuncNative - intern %s\n", str->charArray);4282 dprint( "orFuncNative - intern %s\n", 4283 orAtomCString( it->word.atom ) ); 4290 4284 #endif 4291 4285 prevWord = 1; -
trunk/orca/ovalue.h
r25 r26 384 384 void orInitEnv( OEnv*, int dataStackSize, int callStackSize ); 385 385 void orFreeEnv( OEnv* ); 386 OIndex orInternAtom( const char* str, int len ); 386 void orAtomStr( OAtom, OString* ); 387 OAtom orInternAtom( const char* str, int len ); 387 388 OIndex orInternA( OBlock* wordBlk, OAtom ); 388 389 OValue* orIntern( OContext*, const char* str, int len, OValue* wordV ); … … 506 507 val = blk->values + wv->word.index 507 508 508 #define orAtomString(atom) (orSTRINGS + orEnv->atoms.indices[atom])509 510 509 #define orMakePath(n) orMakeBlock(n) 511 510 #define orMakeBinary(n) ((OBinary*) orMakeString(n)) -
trunk/orca/print.c
r25 r26 374 374 OValue* it; 375 375 OValue* end; 376 OString* str;377 376 378 377 wblk = orBlockPtr( ctx->wblkN ); … … 392 391 while( it != end ) 393 392 { 394 str = orAtomString( wval->word.atom );395 396 393 indent( out, depth ); 397 append( out, str->charArray, str->used ); 394 395 orAtomStr( wval->word.atom, out ); 398 396 append( out, ": ", 2 ); 399 397 … … 519 517 break; 520 518 521 case OT_REFINEMENT: { 522 OString* str = orAtomString( val->index ); 523 append(out, str->charArray, str->used); 524 } 519 case OT_REFINEMENT: orAtomStr( val->index, out ); 525 520 break; 526 521 527 522 case OT_WORD: 528 523 case OT_LITWORD: 529 case OT_SETWORD: 530 case OT_GETWORD: { 531 OString* str = orAtomString( val->word.atom ); 532 append(out, str->charArray, str->used); 533 } 524 case OT_SETWORD: orAtomStr( val->word.atom, out ); 534 525 break; 535 526 … … 703 694 break; 704 695 705 case OT_REFINEMENT: { 706 OString* str = orAtomString( val->index ); 707 append1('/', out); 708 append(out, str->charArray, str->used); 709 } 710 break; 711 712 case OT_WORD: { 713 OString* str = orAtomString( val->word.atom ); 714 append(out, str->charArray, str->used); 715 } 716 break; 717 718 case OT_LITWORD: { 719 OString* str = orAtomString( val->word.atom ); 720 append1(39, out); 721 append(out, str->charArray, str->used); 722 } 723 break; 724 725 case OT_SETWORD: { 726 OString* str = orAtomString( val->word.atom ); 727 append(out, str->charArray, str->used); 696 case OT_REFINEMENT: append1('/', out); 697 orAtomStr( val->index, out ); 698 break; 699 700 case OT_LITWORD: append1('\'', out); 701 // fall through to OT_WORD 702 703 case OT_WORD: orAtomStr( val->word.atom, out ); 704 break; 705 706 case OT_SETWORD: orAtomStr( val->word.atom, out ); 728 707 append1(':', out); 729 } 730 break; 731 732 case OT_GETWORD: { 733 OString* str = orAtomString( val->word.atom ); 734 append1(':', out); 735 append(out, str->charArray, str->used); 736 } 708 break; 709 710 case OT_GETWORD: append1(':', out); 711 orAtomStr( val->word.atom, out ); 737 712 break; 738 713 … … 1048 1023 OValue* end = it + wblk->used; 1049 1024 OValue* vit = vblk->values; 1050 OString* str;1051 1025 1052 1026 ((OValue*) val)->flags |= OR_FLAG_RECURSION; … … 1067 1041 indent(out, depth + 1); 1068 1042 1069 str = orAtomString( it->word.atom ); 1070 append( out, str->charArray, str->used ); 1043 orAtomStr( it->word.atom, out ); 1071 1044 append( out, ": ", 2 ); 1072 1045 mold( out, vit, depth + 1 );
