Second half of fix for 304376 (r=mrbkap).

This commit is contained in:
brendan%mozilla.org 2006-04-19 23:36:16 +00:00
Родитель 7f41614839
Коммит 1734f2c734
18 изменённых файлов: 151 добавлений и 117 удалений

Просмотреть файл

@ -1087,11 +1087,11 @@ JS_SetGlobalObject(JSContext *cx, JSObject *obj)
#if JS_HAS_XML_SUPPORT
cx->xmlSettingFlags = 0;
#endif
memset(cx->prototypes, 0, sizeof cx->prototypes);
memset(cx->classObjects, 0, sizeof cx->classObjects);
}
static JSObject *
InitFunctionAndObjectClasses(JSContext *cx, JSObject *obj)
JSObject *
js_InitFunctionAndObjectClasses(JSContext *cx, JSObject *obj)
{
JSDHashTable *table;
JSBool resolving;
@ -1170,7 +1170,7 @@ JS_InitStandardClasses(JSContext *cx, JSObject *obj)
#endif
/* Function and Object require cooperative bootstrapping magic. */
if (!InitFunctionAndObjectClasses(cx, obj))
if (!js_InitFunctionAndObjectClasses(cx, obj))
return JS_FALSE;
/* Initialize the rest of the standard objects and functions. */
@ -1212,35 +1212,35 @@ static struct {
JSObjectOp init;
size_t atomOffset;
} standard_class_atoms[] = {
{InitFunctionAndObjectClasses, CLASS_ATOM_OFFSET(Function)},
{InitFunctionAndObjectClasses, CLASS_ATOM_OFFSET(Object)},
{js_InitArrayClass, CLASS_ATOM_OFFSET(Array)},
{js_InitBooleanClass, CLASS_ATOM_OFFSET(Boolean)},
{js_InitDateClass, CLASS_ATOM_OFFSET(Date)},
{js_InitMathClass, CLASS_ATOM_OFFSET(Math)},
{js_InitNumberClass, CLASS_ATOM_OFFSET(Number)},
{js_InitStringClass, CLASS_ATOM_OFFSET(String)},
{js_InitFunctionAndObjectClasses, CLASS_ATOM_OFFSET(Function)},
{js_InitFunctionAndObjectClasses, CLASS_ATOM_OFFSET(Object)},
{js_InitArrayClass, CLASS_ATOM_OFFSET(Array)},
{js_InitBooleanClass, CLASS_ATOM_OFFSET(Boolean)},
{js_InitDateClass, CLASS_ATOM_OFFSET(Date)},
{js_InitMathClass, CLASS_ATOM_OFFSET(Math)},
{js_InitNumberClass, CLASS_ATOM_OFFSET(Number)},
{js_InitStringClass, CLASS_ATOM_OFFSET(String)},
#if JS_HAS_CALL_OBJECT
{js_InitCallClass, CLASS_ATOM_OFFSET(Call)},
{js_InitCallClass, CLASS_ATOM_OFFSET(Call)},
#endif
#if JS_HAS_ERROR_EXCEPTIONS
{js_InitExceptionClasses, CLASS_ATOM_OFFSET(Error)},
{js_InitExceptionClasses, CLASS_ATOM_OFFSET(Error)},
#endif
#if JS_HAS_REGEXPS
{js_InitRegExpClass, CLASS_ATOM_OFFSET(RegExp)},
{js_InitRegExpClass, CLASS_ATOM_OFFSET(RegExp)},
#endif
#if JS_HAS_SCRIPT_OBJECT
{js_InitScriptClass, CLASS_ATOM_OFFSET(Script)},
{js_InitScriptClass, CLASS_ATOM_OFFSET(Script)},
#endif
#if JS_HAS_XML_SUPPORT
{js_InitXMLClass, CLASS_ATOM_OFFSET(XML)},
{js_InitNamespaceClass, CLASS_ATOM_OFFSET(Namespace)},
{js_InitQNameClass, CLASS_ATOM_OFFSET(QName)},
{js_InitXMLClass, CLASS_ATOM_OFFSET(XML)},
{js_InitNamespaceClass, CLASS_ATOM_OFFSET(Namespace)},
{js_InitQNameClass, CLASS_ATOM_OFFSET(QName)},
#endif
#if JS_HAS_FILE_OBJECT
{js_InitFileClass, CLASS_ATOM_OFFSET(File)},
{js_InitFileClass, CLASS_ATOM_OFFSET(File)},
#endif
{NULL, 0}
{NULL, 0}
};
/*
@ -1562,11 +1562,11 @@ JS_EnumerateResolvedStandardClasses(JSContext *cx, JSObject *obj,
}
JS_PUBLIC_API(JSBool)
JS_GetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **protop)
JS_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **objp)
{
CHECK_REQUEST(cx);
return js_GetCachedPrototype(cx, obj, key, protop);
return js_GetClassObject(cx, obj, key, objp);
}
#undef ATOM_OFFSET
@ -2043,18 +2043,40 @@ JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto,
JSPropertySpec *static_ps, JSFunctionSpec *static_fs)
{
JSAtom *atom;
JSProtoKey key;
JSObject *proto, *ctor;
JSTempValueRooter tvr;
jsval cval, rval;
JSBool named;
JSFunction *fun;
JSProtoKey key;
CHECK_REQUEST(cx);
atom = js_Atomize(cx, clasp->name, strlen(clasp->name), 0);
if (!atom)
return NULL;
/*
* When initializing a standard class, if no parent_proto (grand-proto of
* instances of the class, parent-proto of the class's prototype object)
* is given, we must use Object.prototype if it is available. Otherwise,
* we could look up the wrong binding for a class name in obj. Example:
*
* String = Array;
* print("hi there".join);
*
* should print undefined, not Array.prototype.join. This is required by
* ECMA-262, alas. It might have been better to make String readonly and
* permanent in the global object, instead -- but that's too big a change
* to swallow at this point.
*/
key = JSCLASS_CACHED_PROTO_KEY(clasp);
if (key != JSProto_Null &&
!parent_proto &&
!js_GetClassPrototype(cx, obj, INT_TO_JSID(JSProto_Object),
&parent_proto)) {
return NULL;
}
/* Create a prototype object for this class. */
proto = js_NewObject(cx, clasp, parent_proto, obj);
if (!proto)
@ -2115,10 +2137,7 @@ JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto,
/* Bootstrap Function.prototype (see also JS_InitStandardClasses). */
if (OBJ_GET_CLASS(cx, ctor) == clasp) {
/* XXXMLM - this fails in framesets that are writing over
* themselves!
* JS_ASSERT(!OBJ_GET_PROTO(cx, ctor));
*/
JS_ASSERT(!OBJ_GET_PROTO(cx, ctor));
OBJ_SET_PROTO(cx, ctor, proto);
}
}
@ -2132,9 +2151,8 @@ JS_InitClass(JSContext *cx, JSObject *obj, JSObject *parent_proto,
}
/* If this is a standard class, cache its prototype. */
key = JSCLASS_CACHED_PROTO_KEY(clasp);
if (key != JSProto_Null)
js_SetCachedPrototype(cx, obj, key, proto);
js_SetClassObject(cx, obj, key, ctor);
out:
JS_POP_TEMP_ROOT(cx, &tvr);
@ -3105,7 +3123,7 @@ JS_ClearScope(JSContext *cx, JSObject *obj)
if (obj->map->ops->clear)
obj->map->ops->clear(cx, obj);
if (cx->globalObject == obj)
memset(cx->prototypes, 0, sizeof cx->prototypes);
memset(cx->classObjects, 0, sizeof cx->classObjects);
}
JS_PUBLIC_API(JSIdArray *)

Просмотреть файл

@ -568,8 +568,8 @@ JS_EnumerateResolvedStandardClasses(JSContext *cx, JSObject *obj,
JSIdArray *ida);
extern JS_PUBLIC_API(JSBool)
JS_GetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **protop);
JS_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **objp);
extern JS_PUBLIC_API(JSObject *)
JS_GetScopeChain(JSContext *cx);

Просмотреть файл

@ -351,7 +351,7 @@ array_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
JSClass js_ArrayClass = {
"Array",
0,
JSCLASS_HAS_CACHED_PROTO(JSProto_Array),
array_addProperty, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, array_convert, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS

Просмотреть файл

@ -56,7 +56,7 @@
JSClass js_BooleanClass = {
"Boolean",
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_Boolean),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS

Просмотреть файл

@ -775,7 +775,18 @@ js_MarkLocalRoots(JSContext *cx, JSLocalRootStack *lrs)
JS_ASSERT(!lrc);
}
static JSObjectOp lazy_cached_prototype_init[JSProto_LIMIT] = {
JS_STATIC_DLL_CALLBACK(JSObject *)
js_InitNullClass(JSContext *cx, JSObject *obj)
{
JS_ASSERT(0);
return NULL;
}
#define JS_PROTO(name,init) extern JSObject *init(JSContext *, JSObject *);
#include "jsproto.tbl"
#undef JS_PROTO
static JSObjectOp lazy_prototype_init[JSProto_LIMIT] = {
#define JS_PROTO(name,init) init,
#include "jsproto.tbl"
#undef JS_PROTO
@ -819,58 +830,60 @@ FindContextForObject(JSContext *cx, JSObject *obj)
}
JSBool
js_GetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **protop)
js_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **objp)
{
JSBool ok;
JSResolvingKey rkey;
JSResolvingEntry *rentry;
uint32 generation;
JSObject *pobj;
JSObject *tmp, *cobj;
JSContext *ocx;
JSObjectOp init;
rkey.obj = obj;
rkey.id = INT_TO_JSID(key);
ok = js_StartResolving(cx, &rkey, JSRESFLAG_PROTOCACHE, &rentry);
rkey.id = ATOM_TO_JSID(cx->runtime->atomState.classAtoms[key]);
ok = js_StartResolving(cx, &rkey, JSRESFLAG_LOOKUP, &rentry);
if (!ok)
return JS_FALSE;
if (!rentry) {
/* Already caching key in obj -- suppress recursion. */
*protop = NULL;
*objp = NULL;
return JS_TRUE;
}
generation = cx->resolvingTable->generation;
while ((pobj = OBJ_GET_PARENT(cx, obj)) != NULL)
obj = pobj;
while ((tmp = OBJ_GET_PARENT(cx, obj)) != NULL)
obj = tmp;
if (obj == cx->globalObject) {
ocx = cx;
} else {
ocx = FindContextForObject(cx, obj);
if (!ocx)
if (!ocx) {
cobj = NULL;
goto out;
}
}
pobj = ocx->prototypes[key];
if (!pobj) {
init = lazy_cached_prototype_init[key];
cobj = ocx->classObjects[key];
if (!cobj) {
init = lazy_prototype_init[key];
if (init) {
if (!init(cx, obj))
ok = JS_FALSE;
pobj = ocx->prototypes[key];
cobj = ocx->classObjects[key];
}
}
out:
*protop = pobj;
js_StopResolving(cx, &rkey, JSRESFLAG_PROTOCACHE, rentry, generation);
*objp = cobj;
js_StopResolving(cx, &rkey, JSRESFLAG_LOOKUP, rentry, generation);
return ok;
}
void
js_SetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject *value)
js_SetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject *value)
{
JSContext *ocx;
@ -882,7 +895,7 @@ js_SetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
if (!ocx)
return;
}
ocx->prototypes[key] = value;
ocx->classObjects[key] = value;
}
static void

Просмотреть файл

@ -393,7 +393,6 @@ typedef struct JSResolvingEntry {
#define JSRESFLAG_LOOKUP 0x1 /* resolving id from lookup */
#define JSRESFLAG_WATCH 0x2 /* resolving id from watch */
#define JSRESFLAG_PROTOCACHE 0x4 /* resolving prototype cache key */
typedef struct JSLocalRootChunk JSLocalRootChunk;
@ -604,8 +603,8 @@ struct JSContext {
/* Stack of thread-stack-allocated temporary GC roots. */
JSTempValueRooter *tempValueRooters;
/* Roots for the standard object prototypes (Object.prototype, etc.) */
JSObject *prototypes[JSProto_LIMIT];
/* Roots for the standard class objects (Object, Function, etc.) */
JSObject *classObjects[JSProto_LIMIT];
#ifdef GC_MARK_DEBUG
/* Top of the GC mark stack. */
@ -744,12 +743,12 @@ js_MarkLocalRoots(JSContext *cx, JSLocalRootStack *lrs);
* Fast access to immutable standard objects (constructors and prototypes).
*/
extern JSBool
js_GetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **protop);
js_GetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject **objp);
extern void
js_SetCachedPrototype(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject *value);
js_SetClassObject(JSContext *cx, JSObject *obj, JSProtoKey key,
JSObject *value);
/*
* Report an exception, which is currently realized as a printf-style format

Просмотреть файл

@ -474,7 +474,7 @@ msFromTime(jsdouble t)
static JSClass date_class = {
js_Date_str,
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_Date),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS

Просмотреть файл

@ -80,7 +80,7 @@ exn_finalize(JSContext *cx, JSObject *obj);
static JSClass ExceptionClass = {
js_Error_str,
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_Error),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, exn_finalize,
NULL, NULL, NULL, Exception,

Просмотреть файл

@ -894,7 +894,8 @@ call_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
JSClass js_CallClass = {
js_Call_str,
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE,
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE |
JSCLASS_HAS_CACHED_PROTO(JSProto_Call),
JS_PropertyStub, JS_PropertyStub,
call_getProperty, call_setProperty,
call_enumerate, (JSResolveOp)call_resolve,
@ -1441,7 +1442,8 @@ fun_reserveSlots(JSContext *cx, JSObject *obj)
*/
JS_FRIEND_DATA(JSClass) js_FunctionClass = {
js_Function_str,
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_HAS_RESERVED_SLOTS(2),
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_HAS_RESERVED_SLOTS(2) |
JSCLASS_HAS_CACHED_PROTO(JSProto_Function),
JS_PropertyStub, JS_PropertyStub,
fun_getProperty, JS_PropertyStub,
fun_enumerate, (JSResolveOp)fun_resolve,

Просмотреть файл

@ -2069,7 +2069,7 @@ restart:
}
for (i = 0; i < JSProto_LIMIT; i++)
GC_MARK(cx, acx->prototypes[i], "prototypes[i]");
GC_MARK(cx, acx->classObjects[i], "classObjects[i]");
}
#ifdef DUMP_CALL_TABLE

Просмотреть файл

@ -94,7 +94,7 @@ static JSConstDoubleSpec math_constants[] = {
static JSClass math_class = {
js_Math_str,
0,
JSCLASS_HAS_CACHED_PROTO(JSProto_Math),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS

Просмотреть файл

@ -163,7 +163,7 @@ static JSFunctionSpec number_functions[] = {
JSClass js_NumberClass = {
js_Number_str,
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_Number),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS

Просмотреть файл

@ -99,7 +99,7 @@ JS_FRIEND_DATA(JSObjectOps) js_ObjectOps = {
JSClass js_ObjectClass = {
js_Object_str,
0,
JSCLASS_HAS_CACHED_PROTO(JSProto_Object),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS
@ -1197,7 +1197,8 @@ obj_eval(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if (obj != callerScopeChain) {
if (!js_CheckPrincipalsAccess(cx, obj,
caller->script->principals,
cx->runtime->atomState.evalAtom)) {
cx->runtime->atomState.evalAtom))
{
return JS_FALSE;
}
@ -1853,13 +1854,6 @@ js_InitObjectClass(JSContext *cx, JSObject *obj)
if (!proto)
return NULL;
#if JS_HAS_OBJ_PROTO_PROP
if (!JS_InitClass(cx, obj, NULL, &js_WithClass, With, 0,
NULL, NULL, NULL, NULL)) {
return NULL;
}
#endif
/* ECMA (15.1.2.1) says 'eval' is also a property of the global object. */
if (!OBJ_GET_PROPERTY(cx, proto,
ATOM_TO_JSID(cx->runtime->atomState.evalAtom),
@ -2127,7 +2121,7 @@ bad:
JSBool
js_FindClassObject(JSContext *cx, JSObject *start, jsid id, jsval *vp)
{
JSObject *obj, *pobj;
JSObject *obj, *cobj, *pobj;
JSProtoKey key;
JSProperty *prop;
JSScopeProperty *sprop;
@ -2149,10 +2143,10 @@ js_FindClassObject(JSContext *cx, JSObject *start, jsid id, jsval *vp)
if (JSID_IS_INT(id)) {
key = JSID_TO_INT(id);
JS_ASSERT(key != JSProto_Null);
if (!js_GetCachedPrototype(cx, obj, key, &pobj))
if (!js_GetClassObject(cx, obj, key, &cobj))
return JS_FALSE;
if (pobj) {
*vp = OBJECT_TO_JSVAL(pobj);
if (cobj) {
*vp = OBJECT_TO_JSVAL(cobj);
return JS_TRUE;
}
id = ATOM_TO_JSID(cx->runtime->atomState.classAtoms[key]);

Просмотреть файл

@ -1,5 +1,5 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set sw=4 ts=8 et tw=80:
* vim: set sw=4 ts=8 et tw=80 ft=c:
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
@ -36,29 +36,28 @@
*
* ***** END LICENSE BLOCK ***** */
JS_PROTO(Null, NULL)
JS_PROTO(Object, NULL)
JS_PROTO(Function, NULL)
JS_PROTO(Array, NULL)
JS_PROTO(Boolean, NULL)
JS_PROTO(Call, NULL)
JS_PROTO(Date, NULL)
JS_PROTO(File, NULL)
JS_PROTO(Math, NULL)
JS_PROTO(Number, NULL)
JS_PROTO(String, NULL)
JS_PROTO(RegExp, NULL)
JS_PROTO(Script, NULL)
JS_PROTO(XML, NULL)
JS_PROTO(Namespace, NULL)
JS_PROTO(QName, NULL)
JS_PROTO(AnyName, NULL)
JS_PROTO(AttributeName, NULL)
JS_PROTO(Error, NULL)
JS_PROTO(InternalError, NULL)
JS_PROTO(EvalError, NULL)
JS_PROTO(RangeError, NULL)
JS_PROTO(ReferenceError, NULL)
JS_PROTO(SyntaxError, NULL)
JS_PROTO(TypeError, NULL)
JS_PROTO(URIError, NULL)
JS_PROTO(Null, js_InitNullClass)
JS_PROTO(Object, js_InitFunctionAndObjectClasses)
JS_PROTO(Function, js_InitFunctionAndObjectClasses)
JS_PROTO(Array, js_InitArrayClass)
JS_PROTO(Boolean, js_InitBooleanClass)
JS_PROTO(Call, js_InitCallClass)
JS_PROTO(Date, js_InitDateClass)
JS_PROTO(Math, js_InitMathClass)
JS_PROTO(Number, js_InitNumberClass)
JS_PROTO(String, js_InitStringClass)
JS_PROTO(RegExp, js_InitRegExpClass)
JS_PROTO(Script, js_InitScriptClass)
JS_PROTO(XML, js_InitXMLClass)
JS_PROTO(Namespace, js_InitNamespaceClass)
JS_PROTO(QName, js_InitQNameClass)
JS_PROTO(AnyName, js_InitAnyNameClass)
JS_PROTO(AttributeName, js_InitAttributeNameClass)
JS_PROTO(Error, js_InitExceptionClasses)
JS_PROTO(InternalError, js_InitExceptionClasses)
JS_PROTO(EvalError, js_InitExceptionClasses)
JS_PROTO(RangeError, js_InitExceptionClasses)
JS_PROTO(ReferenceError, js_InitExceptionClasses)
JS_PROTO(SyntaxError, js_InitExceptionClasses)
JS_PROTO(TypeError, js_InitExceptionClasses)
JS_PROTO(URIError, js_InitExceptionClasses)

Просмотреть файл

@ -3766,7 +3766,8 @@ regexp_mark(JSContext *cx, JSObject *obj, void *arg)
JSClass js_RegExpClass = {
js_RegExp_str,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(1),
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(1) |
JSCLASS_HAS_CACHED_PROTO(JSProto_RegExp),
JS_PropertyStub, JS_PropertyStub,
regexp_getProperty, regexp_setProperty,
JS_EnumerateStub, JS_ResolveStub,

Просмотреть файл

@ -849,7 +849,7 @@ script_mark(JSContext *cx, JSObject *obj, void *arg)
JS_FRIEND_DATA(JSClass) js_ScriptClass = {
js_Script_str,
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_Script),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, script_finalize,
NULL, NULL, script_call, NULL,/*XXXbe xdr*/

Просмотреть файл

@ -608,7 +608,8 @@ str_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
JSClass js_StringClass = {
js_String_str,
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE,
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE |
JSCLASS_HAS_CACHED_PROTO(JSProto_String),
JS_PropertyStub, JS_PropertyStub, str_getProperty, JS_PropertyStub,
str_enumerate, (JSResolveOp)str_resolve, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS

Просмотреть файл

@ -241,7 +241,8 @@ namespace_equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
JS_FRIEND_DATA(JSExtendedClass) js_NamespaceClass = {
{ "Namespace",
JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_IS_EXTENDED,
JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_IS_EXTENDED |
JSCLASS_HAS_CACHED_PROTO(JSProto_Namespace),
JS_PropertyStub, JS_PropertyStub, namespace_getProperty, NULL,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, namespace_finalize,
NULL, NULL, NULL, NULL,
@ -444,7 +445,8 @@ qname_equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp)
JS_FRIEND_DATA(JSExtendedClass) js_QNameClass = {
{ "QName",
JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_IS_EXTENDED,
JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE | JSCLASS_IS_EXTENDED |
JSCLASS_HAS_CACHED_PROTO(JSProto_QName),
JS_PropertyStub, JS_PropertyStub, qname_getProperty, NULL,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, qname_finalize,
NULL, NULL, NULL, NULL,
@ -461,7 +463,9 @@ JS_FRIEND_DATA(JSExtendedClass) js_QNameClass = {
* in this implementation.
*/
JS_FRIEND_DATA(JSClass) js_AttributeNameClass = {
js_AttributeName_str, JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE,
js_AttributeName_str,
JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE |
JSCLASS_HAS_CACHED_PROTO(JSProto_AttributeName),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, qname_finalize,
NULL, NULL, NULL, NULL,
@ -469,7 +473,9 @@ JS_FRIEND_DATA(JSClass) js_AttributeNameClass = {
};
JS_FRIEND_DATA(JSClass) js_AnyNameClass = {
js_AnyName_str, JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE,
js_AnyName_str,
JSCLASS_HAS_PRIVATE | JSCLASS_CONSTRUCT_PROTOTYPE |
JSCLASS_HAS_CACHED_PROTO(JSProto_AnyName),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, anyname_finalize,
NULL, NULL, NULL, NULL,
@ -5458,7 +5464,8 @@ xml_getObjectOps(JSContext *cx, JSClass *clasp)
}
JS_FRIEND_DATA(JSClass) js_XMLClass = {
js_XML_str, JSCLASS_HAS_PRIVATE,
js_XML_str,
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_XML),
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, xml_finalize,
xml_getObjectOps, NULL, NULL, NULL,