Annotation of sbbs/javascript/include/mozilla/js/jsatom.h, revision 1.1.1.1

1.1       root        1: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
                      2:  *
                      3:  * The contents of this file are subject to the Netscape Public
                      4:  * License Version 1.1 (the "License"); you may not use this file
                      5:  * except in compliance with the License. You may obtain a copy of
                      6:  * the License at http://www.mozilla.org/NPL/
                      7:  *
                      8:  * Software distributed under the License is distributed on an "AS
                      9:  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
                     10:  * implied. See the License for the specific language governing
                     11:  * rights and limitations under the License.
                     12:  *
                     13:  * The Original Code is Mozilla Communicator client code, released
                     14:  * March 31, 1998.
                     15:  *
                     16:  * The Initial Developer of the Original Code is Netscape
                     17:  * Communications Corporation.  Portions created by Netscape are
                     18:  * Copyright (C) 1998 Netscape Communications Corporation. All
                     19:  * Rights Reserved.
                     20:  *
                     21:  * Contributor(s): 
                     22:  *
                     23:  * Alternatively, the contents of this file may be used under the
                     24:  * terms of the GNU Public License (the "GPL"), in which case the
                     25:  * provisions of the GPL are applicable instead of those above.
                     26:  * If you wish to allow use of your version of this file only
                     27:  * under the terms of the GPL and not to allow others to use your
                     28:  * version of this file under the NPL, indicate your decision by
                     29:  * deleting the provisions above and replace them with the notice
                     30:  * and other provisions required by the GPL.  If you do not delete
                     31:  * the provisions above, a recipient may use your version of this
                     32:  * file under either the NPL or the GPL.
                     33:  */
                     34: 
                     35: #ifndef jsatom_h___
                     36: #define jsatom_h___
                     37: /*
                     38:  * JS atom table.
                     39:  */
                     40: #include <stddef.h>
                     41: #include "jstypes.h"
                     42: #include "jshash.h" /* Added by JSIFY */
                     43: #include "jsapi.h"
                     44: #include "jsprvtd.h"
                     45: #include "jspubtd.h"
                     46: 
                     47: #ifdef JS_THREADSAFE
                     48: #include "jslock.h"
                     49: #endif
                     50: 
                     51: JS_BEGIN_EXTERN_C
                     52: 
                     53: #define ATOM_PINNED     0x01            /* atom is pinned against GC */
                     54: #define ATOM_INTERNED   0x02            /* pinned variant for JS_Intern* API */
                     55: #define ATOM_MARK       0x04            /* atom is reachable via GC */
                     56: #define ATOM_NOCOPY     0x40            /* don't copy atom string bytes */
                     57: #define ATOM_TMPSTR     0x80            /* internal, to avoid extra string */
                     58: 
                     59: struct JSAtom {
                     60:     JSHashEntry         entry;          /* key is jsval, value keyword info */
                     61:     uint32              flags;          /* pinned, interned, and mark flags */
                     62:     jsatomid            number;         /* atom serial number and hash code */
                     63: };
                     64: 
                     65: #define ATOM_KEY(atom)            ((jsval)(atom)->entry.key)
                     66: #define ATOM_IS_OBJECT(atom)      JSVAL_IS_OBJECT(ATOM_KEY(atom))
                     67: #define ATOM_TO_OBJECT(atom)      JSVAL_TO_OBJECT(ATOM_KEY(atom))
                     68: #define ATOM_IS_INT(atom)         JSVAL_IS_INT(ATOM_KEY(atom))
                     69: #define ATOM_TO_INT(atom)         JSVAL_TO_INT(ATOM_KEY(atom))
                     70: #define ATOM_IS_DOUBLE(atom)      JSVAL_IS_DOUBLE(ATOM_KEY(atom))
                     71: #define ATOM_TO_DOUBLE(atom)      JSVAL_TO_DOUBLE(ATOM_KEY(atom))
                     72: #define ATOM_IS_STRING(atom)      JSVAL_IS_STRING(ATOM_KEY(atom))
                     73: #define ATOM_TO_STRING(atom)      JSVAL_TO_STRING(ATOM_KEY(atom))
                     74: #define ATOM_IS_BOOLEAN(atom)     JSVAL_IS_BOOLEAN(ATOM_KEY(atom))
                     75: #define ATOM_TO_BOOLEAN(atom)     JSVAL_TO_BOOLEAN(ATOM_KEY(atom))
                     76: 
                     77: /*
                     78:  * Return a printable, lossless char[] representation of a string-type atom.
                     79:  * The lifetime of the result extends at least until the next GC activation,
                     80:  * longer if cx's string newborn root is not overwritten.
                     81:  */
                     82: extern JS_FRIEND_API(const char *)
                     83: js_AtomToPrintableString(JSContext *cx, JSAtom *atom);
                     84: 
                     85: #define ATOM_KEYWORD(atom)        ((struct keyword *)(atom)->entry.value)
                     86: #define ATOM_SET_KEYWORD(atom,kw) ((atom)->entry.value = (kw))
                     87: 
                     88: struct JSAtomListElement {
                     89:     JSHashEntry         entry;
                     90: };
                     91: 
                     92: #define ALE_ATOM(ale)   ((JSAtom *) (ale)->entry.key)
                     93: #define ALE_INDEX(ale)  ((jsatomid) (ale)->entry.value)
                     94: #define ALE_JSOP(ale)   ((JSOp) (ale)->entry.value)
                     95: #define ALE_NEXT(ale)   ((JSAtomListElement *) (ale)->entry.next)
                     96: 
                     97: #define ALE_SET_ATOM(ale,atom)  ((ale)->entry.key = (const void *)(atom))
                     98: #define ALE_SET_INDEX(ale,index)((ale)->entry.value = (void *)(index))
                     99: #define ALE_SET_JSOP(ale,op)    ((ale)->entry.value = (void *)(op))
                    100: #define ALE_SET_NEXT(ale,link)  ((ale)->entry.next = (JSHashEntry *)(link))
                    101: 
                    102: struct JSAtomList {
                    103:     JSAtomListElement   *list;          /* literals indexed for mapping */
                    104:     JSHashTable         *table;         /* hash table if list gets too long */
                    105:     jsuint              count;          /* count of indexed literals */
                    106: };
                    107: 
                    108: #define ATOM_LIST_INIT(al)  ((al)->list = NULL, (al)->table = NULL,           \
                    109:                              (al)->count = 0)
                    110: 
                    111: #define ATOM_LIST_SEARCH(_ale,_al,_atom)                                      \
                    112:     JS_BEGIN_MACRO                                                            \
                    113:         JSHashEntry **_hep;                                                   \
                    114:         ATOM_LIST_LOOKUP(_ale, _hep, _al, _atom);                             \
                    115:     JS_END_MACRO
                    116: 
                    117: #define ATOM_LIST_LOOKUP(_ale,_hep,_al,_atom)                                 \
                    118:     JS_BEGIN_MACRO                                                            \
                    119:         if ((_al)->table) {                                                   \
                    120:             _hep = JS_HashTableRawLookup((_al)->table, _atom->number, _atom); \
                    121:             _ale = *_hep ? (JSAtomListElement *) *_hep : NULL;                \
                    122:         } else {                                                              \
                    123:             JSAtomListElement **_alep = &(_al)->list;                         \
                    124:             _hep = NULL;                                                      \
                    125:             while ((_ale = *_alep) != NULL) {                                 \
                    126:                 if (ALE_ATOM(_ale) == (_atom)) {                              \
                    127:                     /* Hit, move atom's element to the front of the list. */  \
                    128:                     *_alep = ALE_NEXT(_ale);                                  \
                    129:                     ALE_SET_NEXT(_ale, (_al)->list);                          \
                    130:                     (_al)->list = _ale;                                       \
                    131:                     break;                                                    \
                    132:                 }                                                             \
                    133:                 _alep = (JSAtomListElement **)&_ale->entry.next;              \
                    134:             }                                                                 \
                    135:         }                                                                     \
                    136:     JS_END_MACRO
                    137: 
                    138: struct JSAtomMap {
                    139:     JSAtom              **vector;       /* array of ptrs to indexed atoms */
                    140:     jsatomid            length;         /* count of (to-be-)indexed atoms */
                    141: };
                    142: 
                    143: struct JSAtomState {
                    144:     JSRuntime           *runtime;       /* runtime that owns us */
                    145:     JSHashTable         *table;         /* hash table containing all atoms */
                    146:     jsatomid            number;         /* one beyond greatest atom number */
                    147:     jsatomid            liveAtoms;      /* number of live atoms after last GC */
                    148: 
                    149:     /* Type names and value literals. */
                    150:     JSAtom              *typeAtoms[JSTYPE_LIMIT];
                    151:     JSAtom              *booleanAtoms[2];
                    152:     JSAtom              *nullAtom;
                    153: 
                    154:     /* Various built-in or commonly-used atoms, pinned on first context. */
                    155:     JSAtom              *ArgumentsAtom;
                    156:     JSAtom              *ArrayAtom;
                    157:     JSAtom              *BooleanAtom;
                    158:     JSAtom              *CallAtom;
                    159:     JSAtom              *DateAtom;
                    160:     JSAtom              *ErrorAtom;
                    161:     JSAtom              *FunctionAtom;
                    162:     JSAtom              *MathAtom;
                    163:     JSAtom              *NumberAtom;
                    164:     JSAtom              *ObjectAtom;
                    165:     JSAtom              *RegExpAtom;
                    166:     JSAtom              *ScriptAtom;
                    167:     JSAtom              *StringAtom;
                    168:     JSAtom              *anonymousAtom;
                    169:     JSAtom              *argumentsAtom;
                    170:     JSAtom              *arityAtom;
                    171:     JSAtom              *calleeAtom;
                    172:     JSAtom              *callerAtom;
                    173:     JSAtom              *classPrototypeAtom;
                    174:     JSAtom              *constructorAtom;
                    175:     JSAtom              *countAtom;
                    176:     JSAtom              *evalAtom;
                    177:     JSAtom              *getAtom;
                    178:     JSAtom              *getterAtom;
                    179:     JSAtom              *indexAtom;
                    180:     JSAtom              *inputAtom;
                    181:     JSAtom              *lengthAtom;
                    182:     JSAtom              *nameAtom;
                    183:     JSAtom              *parentAtom;
                    184:     JSAtom              *protoAtom;
                    185:     JSAtom              *setAtom;
                    186:     JSAtom              *setterAtom;
                    187:     JSAtom              *toLocaleStringAtom;
                    188:     JSAtom              *toSourceAtom;
                    189:     JSAtom              *toStringAtom;
                    190:     JSAtom              *valueOfAtom;
                    191: 
                    192:     /* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass. */
                    193:     struct {
                    194:         JSAtom          *EvalErrorAtom;
                    195:         JSAtom          *InfinityAtom;
                    196:         JSAtom          *InternalErrorAtom;
                    197:         JSAtom          *NaNAtom;
                    198:         JSAtom          *RangeErrorAtom;
                    199:         JSAtom          *ReferenceErrorAtom;
                    200:         JSAtom          *SyntaxErrorAtom;
                    201:         JSAtom          *TypeErrorAtom;
                    202:         JSAtom          *URIErrorAtom;
                    203:         JSAtom          *decodeURIAtom;
                    204:         JSAtom          *decodeURIComponentAtom;
                    205:         JSAtom          *defineGetterAtom;
                    206:         JSAtom          *defineSetterAtom;
                    207:         JSAtom          *encodeURIAtom;
                    208:         JSAtom          *encodeURIComponentAtom;
                    209:         JSAtom          *escapeAtom;
                    210:         JSAtom          *hasOwnPropertyAtom;
                    211:         JSAtom          *isFiniteAtom;
                    212:         JSAtom          *isNaNAtom;
                    213:         JSAtom          *isPrototypeOfAtom;
                    214:         JSAtom          *lookupGetterAtom;
                    215:         JSAtom          *lookupSetterAtom;
                    216:         JSAtom          *parseFloatAtom;
                    217:         JSAtom          *parseIntAtom;
                    218:         JSAtom          *propertyIsEnumerableAtom;
                    219:         JSAtom          *unescapeAtom;
                    220:         JSAtom          *unevalAtom;
                    221:         JSAtom          *unwatchAtom;
                    222:         JSAtom          *watchAtom;
                    223:     } lazy;
                    224: 
                    225: #ifdef JS_THREADSAFE
                    226:     JSThinLock          lock;
                    227:     volatile uint32     tablegen;
                    228: #endif
                    229: };
                    230: 
                    231: /* Well-known predefined strings and their atoms. */
                    232: extern const char   *js_type_str[];
                    233: extern const char   *js_boolean_str[];
                    234: 
                    235: extern const char   js_Arguments_str[];
                    236: extern const char   js_Array_str[];
                    237: extern const char   js_Boolean_str[];
                    238: extern const char   js_Call_str[];
                    239: extern const char   js_Date_str[];
                    240: extern const char   js_Function_str[];
                    241: extern const char   js_Math_str[];
                    242: extern const char   js_Number_str[];
                    243: extern const char   js_Object_str[];
                    244: extern const char   js_RegExp_str[];
                    245: extern const char   js_Script_str[];
                    246: extern const char   js_String_str[];
                    247: extern const char   js_anonymous_str[];
                    248: extern const char   js_arguments_str[];
                    249: extern const char   js_arity_str[];
                    250: extern const char   js_callee_str[];
                    251: extern const char   js_caller_str[];
                    252: extern const char   js_class_prototype_str[];
                    253: extern const char   js_constructor_str[];
                    254: extern const char   js_count_str[];
                    255: extern const char   js_eval_str[];
                    256: extern const char   js_getter_str[];
                    257: extern const char   js_get_str[];
                    258: extern const char   js_index_str[];
                    259: extern const char   js_input_str[];
                    260: extern const char   js_length_str[];
                    261: extern const char   js_name_str[];
                    262: extern const char   js_parent_str[];
                    263: extern const char   js_proto_str[];
                    264: extern const char   js_setter_str[];
                    265: extern const char   js_set_str[];
                    266: extern const char   js_toSource_str[];
                    267: extern const char   js_toString_str[];
                    268: extern const char   js_toLocaleString_str[];
                    269: extern const char   js_valueOf_str[];
                    270: 
                    271: /*
                    272:  * Initialize atom state.  Return true on success, false with an out of
                    273:  * memory error report on failure.
                    274:  */
                    275: extern JSBool
                    276: js_InitAtomState(JSContext *cx, JSAtomState *state);
                    277: 
                    278: /*
                    279:  * Free and clear atom state (except for any interned string atoms).
                    280:  */
                    281: extern void
                    282: js_FreeAtomState(JSContext *cx, JSAtomState *state);
                    283: 
                    284: /*
                    285:  * Interned strings are atoms that live until state's runtime is destroyed.
                    286:  * This function frees all interned string atoms, and then frees and clears
                    287:  * state's members (just as js_FreeAtomState does), unless there aren't any
                    288:  * interned strings in state -- in which case state must be "free" already.
                    289:  *
                    290:  * NB: js_FreeAtomState is called for each "last" context being destroyed in
                    291:  * a runtime, where there may yet be another context created in the runtime;
                    292:  * whereas js_FinishAtomState is called from JS_DestroyRuntime, when we know
                    293:  * that no more contexts will be created.  Thus we minimize garbage during
                    294:  * context-free episodes on a runtime, while preserving atoms created by the
                    295:  * JS_Intern*String APIs for the life of the runtime.
                    296:  */
                    297: extern void
                    298: js_FinishAtomState(JSAtomState *state);
                    299: 
                    300: /*
                    301:  * Atom garbage collection hooks.
                    302:  */
                    303: typedef void
                    304: (*JSGCThingMarker)(void *thing, void *data);
                    305: 
                    306: extern void
                    307: js_MarkAtomState(JSAtomState *state, uintN gcflags, JSGCThingMarker mark,
                    308:                  void *data);
                    309: 
                    310: extern void
                    311: js_SweepAtomState(JSAtomState *state);
                    312: 
                    313: extern JSBool
                    314: js_InitPinnedAtoms(JSContext *cx, JSAtomState *state);
                    315: 
                    316: extern void
                    317: js_UnpinPinnedAtoms(JSAtomState *state);
                    318: 
                    319: /*
                    320:  * Find or create the atom for an object.  If we create a new atom, give it the
                    321:  * type indicated in flags.  Return 0 on failure to allocate memory.
                    322:  */
                    323: extern JSAtom *
                    324: js_AtomizeObject(JSContext *cx, JSObject *obj, uintN flags);
                    325: 
                    326: /*
                    327:  * Find or create the atom for a Boolean value.  If we create a new atom, give
                    328:  * it the type indicated in flags.  Return 0 on failure to allocate memory.
                    329:  */
                    330: extern JSAtom *
                    331: js_AtomizeBoolean(JSContext *cx, JSBool b, uintN flags);
                    332: 
                    333: /*
                    334:  * Find or create the atom for an integer value.  If we create a new atom, give
                    335:  * it the type indicated in flags.  Return 0 on failure to allocate memory.
                    336:  */
                    337: extern JSAtom *
                    338: js_AtomizeInt(JSContext *cx, jsint i, uintN flags);
                    339: 
                    340: /*
                    341:  * Find or create the atom for a double value.  If we create a new atom, give
                    342:  * it the type indicated in flags.  Return 0 on failure to allocate memory.
                    343:  */
                    344: extern JSAtom *
                    345: js_AtomizeDouble(JSContext *cx, jsdouble d, uintN flags);
                    346: 
                    347: /*
                    348:  * Find or create the atom for a string.  If we create a new atom, give it the
                    349:  * type indicated in flags.  Return 0 on failure to allocate memory.
                    350:  */
                    351: extern JSAtom *
                    352: js_AtomizeString(JSContext *cx, JSString *str, uintN flags);
                    353: 
                    354: extern JS_FRIEND_API(JSAtom *)
                    355: js_Atomize(JSContext *cx, const char *bytes, size_t length, uintN flags);
                    356: 
                    357: extern JS_FRIEND_API(JSAtom *)
                    358: js_AtomizeChars(JSContext *cx, const jschar *chars, size_t length, uintN flags);
                    359: 
                    360: /*
                    361:  * This variant handles all value tag types.
                    362:  */
                    363: extern JSAtom *
                    364: js_AtomizeValue(JSContext *cx, jsval value, uintN flags);
                    365: 
                    366: /*
                    367:  * Convert v to an atomized string.
                    368:  */
                    369: extern JSAtom *
                    370: js_ValueToStringAtom(JSContext *cx, jsval v);
                    371: 
                    372: /*
                    373:  * Assign atom an index and insert it on al.
                    374:  */
                    375: extern JSAtomListElement *
                    376: js_IndexAtom(JSContext *cx, JSAtom *atom, JSAtomList *al);
                    377: 
                    378: /*
                    379:  * Get the atom with index i from map.
                    380:  */
                    381: extern JS_FRIEND_API(JSAtom *)
                    382: js_GetAtom(JSContext *cx, JSAtomMap *map, jsatomid i);
                    383: 
                    384: /*
                    385:  * For all unmapped atoms recorded in al, add a mapping from the atom's index
                    386:  * to its address.  The GC must not run until all indexed atoms in atomLists
                    387:  * have been mapped by scripts connected to live objects (Function and Script
                    388:  * class objects have scripts as/in their private data -- the GC knows about
                    389:  * these two classes).
                    390:  */
                    391: extern JS_FRIEND_API(JSBool)
                    392: js_InitAtomMap(JSContext *cx, JSAtomMap *map, JSAtomList *al);
                    393: 
                    394: /*
                    395:  * Free map->vector and clear map.
                    396:  */
                    397: extern JS_FRIEND_API(void)
                    398: js_FreeAtomMap(JSContext *cx, JSAtomMap *map);
                    399: 
                    400: JS_END_EXTERN_C
                    401: 
                    402: #endif /* jsatom_h___ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.