зеркало из https://github.com/mozilla/gecko-dev.git
Second half of fix for 304376 (r=mrbkap).
This commit is contained in:
Родитель
7f41614839
Коммит
1734f2c734
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче