--- sbbs/include/mozilla/js/jsatom.h 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/include/mozilla/js/jsatom.h 2018/04/24 16:42:12 1.1.1.2 @@ -58,11 +58,13 @@ JS_BEGIN_EXTERN_C #define ATOM_PINNED 0x01 /* atom is pinned against GC */ #define ATOM_INTERNED 0x02 /* pinned variant for JS_Intern* API */ #define ATOM_MARK 0x04 /* atom is reachable via GC */ +#define ATOM_HIDDEN 0x08 /* atom is in special hidden subspace */ #define ATOM_NOCOPY 0x40 /* don't copy atom string bytes */ #define ATOM_TMPSTR 0x80 /* internal, to avoid extra string */ struct JSAtom { - JSHashEntry entry; /* key is jsval, value keyword info */ + JSHashEntry entry; /* key is jsval or unhidden atom + if ATOM_HIDDEN */ uint32 flags; /* pinned, interned, and mark flags */ jsatomid number; /* atom serial number and hash code */ }; @@ -87,22 +89,19 @@ struct JSAtom { extern JS_FRIEND_API(const char *) js_AtomToPrintableString(JSContext *cx, JSAtom *atom); -#define ATOM_KEYWORD(atom) ((struct keyword *)(atom)->entry.value) -#define ATOM_SET_KEYWORD(atom,kw) ((atom)->entry.value = (kw)) - struct JSAtomListElement { JSHashEntry entry; }; #define ALE_ATOM(ale) ((JSAtom *) (ale)->entry.key) -#define ALE_INDEX(ale) ((jsatomid) (ale)->entry.value) +#define ALE_INDEX(ale) ((jsatomid) JS_PTR_TO_UINT32((ale)->entry.value)) #define ALE_JSOP(ale) ((JSOp) (ale)->entry.value) #define ALE_VALUE(ale) ((jsval) (ale)->entry.value) #define ALE_NEXT(ale) ((JSAtomListElement *) (ale)->entry.next) #define ALE_SET_ATOM(ale,atom) ((ale)->entry.key = (const void *)(atom)) -#define ALE_SET_INDEX(ale,index)((ale)->entry.value = (void *)(index)) -#define ALE_SET_JSOP(ale,op) ((ale)->entry.value = (void *)(op)) +#define ALE_SET_INDEX(ale,index)((ale)->entry.value = JS_UINT32_TO_PTR(index)) +#define ALE_SET_JSOP(ale,op) ((ale)->entry.value = JS_UINT32_TO_PTR(op)) #define ALE_SET_VALUE(ale,val) ((ale)->entry.value = (JSHashEntry *)(val)) #define ALE_SET_NEXT(ale,link) ((ale)->entry.next = (JSHashEntry *)(link)) @@ -153,61 +152,66 @@ struct JSAtomState { jsatomid number; /* one beyond greatest atom number */ jsatomid liveAtoms; /* number of live atoms after last GC */ + /* The rt->emptyString atom, see jsstr.c's js_InitRuntimeStringState. */ + JSAtom *emptyAtom; + /* Type names and value literals. */ JSAtom *typeAtoms[JSTYPE_LIMIT]; JSAtom *booleanAtoms[2]; JSAtom *nullAtom; + /* Standard class constructor or prototype names. */ + JSAtom *classAtoms[JSProto_LIMIT]; + /* Various built-in or commonly-used atoms, pinned on first context. */ - JSAtom *ArgumentsAtom; - JSAtom *ArrayAtom; - JSAtom *BooleanAtom; - JSAtom *CallAtom; - JSAtom *DateAtom; - JSAtom *ErrorAtom; - JSAtom *FunctionAtom; - JSAtom *MathAtom; - JSAtom *NumberAtom; - JSAtom *ObjectAtom; - JSAtom *RegExpAtom; - JSAtom *ScriptAtom; - JSAtom *StringAtom; JSAtom *anonymousAtom; JSAtom *argumentsAtom; JSAtom *arityAtom; JSAtom *calleeAtom; JSAtom *callerAtom; JSAtom *classPrototypeAtom; + JSAtom *closeAtom; JSAtom *constructorAtom; JSAtom *countAtom; + JSAtom *eachAtom; + JSAtom *etagoAtom; JSAtom *evalAtom; + JSAtom *fileNameAtom; JSAtom *getAtom; JSAtom *getterAtom; JSAtom *indexAtom; JSAtom *inputAtom; + JSAtom *iteratorAtom; JSAtom *lengthAtom; + JSAtom *lineNumberAtom; + JSAtom *messageAtom; JSAtom *nameAtom; + JSAtom *namespaceAtom; + JSAtom *nextAtom; JSAtom *noSuchMethodAtom; JSAtom *parentAtom; JSAtom *protoAtom; + JSAtom *ptagcAtom; + JSAtom *qualifierAtom; JSAtom *setAtom; JSAtom *setterAtom; + JSAtom *spaceAtom; + JSAtom *stackAtom; + JSAtom *stagoAtom; + JSAtom *starAtom; + JSAtom *starQualifierAtom; + JSAtom *tagcAtom; JSAtom *toLocaleStringAtom; JSAtom *toSourceAtom; JSAtom *toStringAtom; JSAtom *valueOfAtom; + JSAtom *xmlAtom; /* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass. */ struct { - JSAtom *EvalErrorAtom; JSAtom *InfinityAtom; - JSAtom *InternalErrorAtom; JSAtom *NaNAtom; - JSAtom *RangeErrorAtom; - JSAtom *ReferenceErrorAtom; - JSAtom *SyntaxErrorAtom; - JSAtom *TypeErrorAtom; - JSAtom *URIErrorAtom; + JSAtom *XMLListAtom; JSAtom *decodeURIAtom; JSAtom *decodeURIComponentAtom; JSAtom *defineGetterAtom; @@ -215,10 +219,12 @@ struct JSAtomState { JSAtom *encodeURIAtom; JSAtom *encodeURIComponentAtom; JSAtom *escapeAtom; + JSAtom *functionNamespaceURIAtom; JSAtom *hasOwnPropertyAtom; JSAtom *isFiniteAtom; JSAtom *isNaNAtom; JSAtom *isPrototypeOfAtom; + JSAtom *isXMLNameAtom; JSAtom *lookupGetterAtom; JSAtom *lookupSetterAtom; JSAtom *parseFloatAtom; @@ -243,46 +249,63 @@ struct JSAtomState { #endif }; +#define CLASS_ATOM(cx,name) \ + ((cx)->runtime->atomState.classAtoms[JSProto_##name]) + /* Well-known predefined strings and their atoms. */ -extern const char *js_type_str[]; -extern const char *js_boolean_str[]; +extern const char *js_type_strs[]; +extern const char *js_boolean_strs[]; +extern const char *js_proto_strs[]; + +#define JS_PROTO(name,code,init) extern const char js_##name##_str[]; +#include "jsproto.tbl" +#undef JS_PROTO -extern const char js_Arguments_str[]; -extern const char js_Array_str[]; -extern const char js_Boolean_str[]; -extern const char js_Call_str[]; -extern const char js_Date_str[]; -extern const char js_Function_str[]; -extern const char js_Math_str[]; -extern const char js_Number_str[]; -extern const char js_Object_str[]; -extern const char js_RegExp_str[]; -extern const char js_Script_str[]; -extern const char js_String_str[]; extern const char js_anonymous_str[]; extern const char js_arguments_str[]; extern const char js_arity_str[]; extern const char js_callee_str[]; extern const char js_caller_str[]; extern const char js_class_prototype_str[]; +extern const char js_close_str[]; extern const char js_constructor_str[]; extern const char js_count_str[]; +extern const char js_etago_str[]; +extern const char js_each_str[]; extern const char js_eval_str[]; -extern const char js_getter_str[]; +extern const char js_fileName_str[]; extern const char js_get_str[]; +extern const char js_getter_str[]; extern const char js_index_str[]; extern const char js_input_str[]; +extern const char js_iterator_str[]; extern const char js_length_str[]; +extern const char js_lineNumber_str[]; +extern const char js_message_str[]; extern const char js_name_str[]; +extern const char js_namespace_str[]; +extern const char js_next_str[]; extern const char js_noSuchMethod_str[]; +extern const char js_object_str[]; extern const char js_parent_str[]; +extern const char js_private_str[]; extern const char js_proto_str[]; +extern const char js_ptagc_str[]; +extern const char js_qualifier_str[]; +extern const char js_send_str[]; extern const char js_setter_str[]; extern const char js_set_str[]; +extern const char js_space_str[]; +extern const char js_stack_str[]; +extern const char js_stago_str[]; +extern const char js_star_str[]; +extern const char js_starQualifier_str[]; +extern const char js_tagc_str[]; extern const char js_toSource_str[]; extern const char js_toString_str[]; extern const char js_toLocaleString_str[]; extern const char js_valueOf_str[]; +extern const char js_xml_str[]; #ifdef NARCISSUS extern const char js_call_str[]; @@ -328,7 +351,7 @@ typedef void (*JSGCThingMarker)(void *thing, void *data); extern void -js_MarkAtomState(JSAtomState *state, uintN gcflags, JSGCThingMarker mark, +js_MarkAtomState(JSAtomState *state, JSBool keepAtoms, JSGCThingMarker mark, void *data); extern void @@ -382,6 +405,13 @@ extern JS_FRIEND_API(JSAtom *) js_AtomizeChars(JSContext *cx, const jschar *chars, size_t length, uintN flags); /* + * Return an existing atom for the given char array or null if the char + * sequence is currently not atomized. + */ +extern JSAtom * +js_GetExistingStringAtom(JSContext *cx, const jschar *chars, size_t length); + +/* * This variant handles all value tag types. */ extern JSAtom *