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