Changeset 26

Show
Ignore:
Timestamp:
02/07/06 00:52:42 (3 years ago)
Author:
krobillard
Message:

Atom names are now stored in a single string.
Maximum word length is now 32.

Location:
trunk/orca
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • trunk/orca/bytecode.c

    r25 r26  
    5555        case OT_REFINEMENT: 
    5656        { 
    57             int len; 
     57            int pos; 
    5858            int atom; 
    59             OString* str; 
    6059 
    6160            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; 
    6970            *cp++ = val->type; 
    70             *cp++ = str->used; 
    71  
    72             memCpy( cp, str->charArray, str->used ); 
     71            *cp   = bin->used - pos - 2; 
    7372        } 
    7473            break; 
  • trunk/orca/context.c

    r25 r26  
    2525 
    2626 
    27 OIndex orInternAtom( const char* str, int len ) 
     27typedef struct 
     28{ 
     29    uint16_t nameIndex;     // Index into BIN_ATOM_NAMES ptr.c 
     30    uint16_t nameLen; 
     31} 
     32AtomRec; 
     33 
     34 
     35/** 
     36  Appends atom name to string. 
     37*/ 
     38void 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 
     54const 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*/ 
     77OAtom orInternAtom( const char* str, int len ) 
    2878{ 
    2979    char* cp; 
    3080    const char* ep; 
    3181    const char* sp; 
    32     OString* cstr; 
    3382    OArray* atoms; 
    34     OIndex* it; 
    35     OIndex* end; 
     83    OString* names; 
     84    AtomRec* rec; 
     85    AtomRec* end; 
     86    char buf[ MAX_WORD_LEN ]; 
    3687 
    3788 
    3889    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; 
    4598    while( cp != ep ) 
    4699    { 
     
    51104    } 
    52105 
    53  
    54106    // Check if atom already exists. 
    55107 
    56108    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; 
    67120            while( cp != ep ) 
    68121            { 
     
    73126 
    74127            if( cp == ep ) 
    75                 return it - atoms->indices; 
    76         } 
    77         ++it; 
     128                goto done; 
     129        } 
     130        ++rec; 
    78131    } 
    79132 
     
    81134    // Nope, add new atom. 
    82135 
    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 
     144done: 
     145 
     146    return rec - ((AtomRec*) atoms->buf); 
    91147} 
    92148 
  • trunk/orca/gc.c

    r1 r26  
    518518    assert( orEnv->error == 0 ); 
    519519 
     520 
     521    // Enable this if orLockGarbageCollector() is removed. 
     522    //orSetBit( bsStr.byteArray, BIN_ATOM_NAMES ); 
     523 
    520524    blk = (OBlock*) orEnv->blocks.buf; 
    521525 
     
    581585 
    582586 
    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  
    597587    orSweepArray( &bsBlk, &orEnv->freeBlocks,  &orEnv->blocks ); 
    598588    orSweepArray( &bsStr, &orEnv->freeStrings, &orEnv->strings ); 
  • trunk/orca/internal.h

    r1 r26  
    22#define INTERNAL_H 
    33 
     4 
     5#define MAX_WORD_LEN        32      /* LIMIT: word length */ 
     6 
     7#define BIN_ATOM_NAMES      0 
    48 
    59#define GLOBAL_CTXN         0 
  • trunk/orca/ovalue.c

    r25 r26  
    101101 
    102102extern OBlock* orTokenize( const char*, const char* ); 
     103extern const char* orAtomCString( OAtom ); 
    103104 
    104105extern void orBindNative( OValue* ); 
     
    336337    orInitAGC( &env->freeIntArr ); 
    337338#endif 
     339 
     340    orMakeString( 2048 );     // BIN_ATOM_NAMES 
    338341 
    339342    makeGlobalContext(); 
     
    13661369        if( val->type == OT_UNSET ) 
    13671370        { 
    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 ) ); 
    13701372        } 
    13711373        else 
     
    19961998 
    19971999unset: 
    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 ) ); 
    20032001    return -1; 
    20042002 
     
    22202218            { 
    22212219                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) ); 
    22262221                    return -1; 
    22272222 
     
    23172312                if( wblk->values[ pc->word.index ].flags & OR_WORD_PROT ) 
    23182313                { 
    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 ) ); 
    23212316                    goto sThrown; 
    23222317                } 
    23232318            } 
    23242319#ifdef TRACE 
    2325             cprint( "TR> %s:\n", orAtomString(pc->word.atom)->charArray ); 
     2320            cprint( "TR> %s:\n", orAtomCString( pc->word.atom ) ); 
    23262321#endif 
    23272322            PUSH_CALL( wval, OC_SETWORD, 0 ); 
     
    27682763    if( si == send ) 
    27692764    { 
    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 ) ); 
    27722767        goto sThrown; 
    27732768    } 
     
    30933088                (it->type == OT_LITWORD) ) 
    30943089            { 
    3095                 OString* str = orAtomString( it->word.atom ); 
    30963090                dprint( " %d %d %s\n", it->word.context, it->word.index, 
    3097                         str->charArray ); 
     3091                        orAtomCString( it->word.atom ) ); 
    30983092            } 
    30993093            else if( it->type == OT_DATATYPE ) 
     
    39383932            orDatatypeName(type), 
    39393933            (orSTRINGS + wrd->str)->charArray, 
    3940             orAtomString(wrd->atom)->charArray, 
     3934            orAtomCString( wrd->atom ), 
    39413935            val->word.atom ); 
    39423936#endif 
     
    42864280        { 
    42874281#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 ) ); 
    42904284#endif 
    42914285            prevWord = 1; 
  • trunk/orca/ovalue.h

    r25 r26  
    384384void    orInitEnv( OEnv*, int dataStackSize, int callStackSize ); 
    385385void    orFreeEnv( OEnv* ); 
    386 OIndex  orInternAtom( const char* str, int len ); 
     386void    orAtomStr( OAtom, OString* ); 
     387OAtom   orInternAtom( const char* str, int len ); 
    387388OIndex  orInternA( OBlock* wordBlk, OAtom ); 
    388389OValue* orIntern( OContext*, const char* str, int len, OValue* wordV ); 
     
    506507    val = blk->values + wv->word.index 
    507508 
    508 #define orAtomString(atom)      (orSTRINGS + orEnv->atoms.indices[atom]) 
    509  
    510509#define orMakePath(n)           orMakeBlock(n) 
    511510#define orMakeBinary(n)         ((OBinary*) orMakeString(n)) 
  • trunk/orca/print.c

    r25 r26  
    374374    OValue* it; 
    375375    OValue* end; 
    376     OString* str; 
    377376 
    378377    wblk = orBlockPtr( ctx->wblkN ); 
     
    392391    while( it != end ) 
    393392    { 
    394         str = orAtomString( wval->word.atom ); 
    395  
    396393        indent( out, depth ); 
    397         append( out, str->charArray, str->used ); 
     394 
     395        orAtomStr( wval->word.atom, out ); 
    398396        append( out, ": ", 2 ); 
    399397 
     
    519517                            break; 
    520518 
    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 ); 
    525520                            break; 
    526521 
    527522        case OT_WORD: 
    528523        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 ); 
    534525                            break; 
    535526 
     
    703694                            break; 
    704695 
    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 ); 
    728707                            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 ); 
    737712                            break; 
    738713 
     
    10481023            OValue* end = it + wblk->used; 
    10491024            OValue* vit = vblk->values; 
    1050             OString* str; 
    10511025 
    10521026            ((OValue*) val)->flags |= OR_FLAG_RECURSION; 
     
    10671041                    indent(out, depth + 1); 
    10681042 
    1069                     str = orAtomString( it->word.atom ); 
    1070                     append( out, str->charArray, str->used ); 
     1043                    orAtomStr( it->word.atom, out ); 
    10711044                    append( out, ": ", 2 ); 
    10721045                    mold( out, vit, depth + 1 );