зеркало из https://github.com/mozilla/gecko-dev.git
Use parent, if non-null, as scope chain with which to find default proto from Class.prototype, in js_{New,Construct}Object (75975, sr=jband&jst).
This commit is contained in:
Родитель
91b83e404f
Коммит
ef5f23f75e
|
@ -535,7 +535,7 @@ js_LeaveSharpObject(JSContext *cx, JSIdArray **idap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OBJ_TOSTRING_EXTRA 3 /* for 3 local GC roots */
|
#define OBJ_TOSTRING_EXTRA 3 /* for 3 local GC roots */
|
||||||
|
|
||||||
#if JS_HAS_INITIALIZERS || JS_HAS_TOSOURCE
|
#if JS_HAS_INITIALIZERS || JS_HAS_TOSOURCE
|
||||||
JSBool
|
JSBool
|
||||||
|
@ -844,7 +844,7 @@ js_obj_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
clazz = OBJ_GET_CLASS(cx, obj)->name;
|
clazz = OBJ_GET_CLASS(cx, obj)->name;
|
||||||
nchars = 9 + strlen(clazz); /* 9 for "[object ]" */
|
nchars = 9 + strlen(clazz); /* 9 for "[object ]" */
|
||||||
chars = (jschar *) JS_malloc(cx, (nchars + 1) * sizeof(jschar));
|
chars = (jschar *) JS_malloc(cx, (nchars + 1) * sizeof(jschar));
|
||||||
if (!chars)
|
if (!chars)
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
|
@ -1550,6 +1550,10 @@ js_DropObjectMap(JSContext *cx, JSObjectMap *map, JSObject *obj)
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static JSBool
|
||||||
|
GetClassPrototype(JSContext *cx, JSObject *scope, const char *name,
|
||||||
|
JSObject **protop);
|
||||||
|
|
||||||
JSObject *
|
JSObject *
|
||||||
js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent)
|
js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent)
|
||||||
{
|
{
|
||||||
|
@ -1567,9 +1571,9 @@ js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent)
|
||||||
|
|
||||||
/* Bootstrap the ur-object, and make it the default prototype object. */
|
/* Bootstrap the ur-object, and make it the default prototype object. */
|
||||||
if (!proto) {
|
if (!proto) {
|
||||||
if (!js_GetClassPrototype(cx, clasp->name, &proto))
|
if (!GetClassPrototype(cx, parent, clasp->name, &proto))
|
||||||
goto bad;
|
goto bad;
|
||||||
if (!proto && !js_GetClassPrototype(cx, js_ObjectClass.name, &proto))
|
if (!proto && !GetClassPrototype(cx, parent, js_Object_str, &proto))
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1636,10 +1640,10 @@ bad:
|
||||||
}
|
}
|
||||||
|
|
||||||
static JSBool
|
static JSBool
|
||||||
FindConstructor(JSContext *cx, const char *name, jsval *vp)
|
FindConstructor(JSContext *cx, JSObject *scope, const char *name, jsval *vp)
|
||||||
{
|
{
|
||||||
JSAtom *atom;
|
JSAtom *atom;
|
||||||
JSObject *obj, *tmp;
|
JSObject *obj;
|
||||||
JSObject *pobj;
|
JSObject *pobj;
|
||||||
JSScopeProperty *sprop;
|
JSScopeProperty *sprop;
|
||||||
|
|
||||||
|
@ -1647,12 +1651,12 @@ FindConstructor(JSContext *cx, const char *name, jsval *vp)
|
||||||
if (!atom)
|
if (!atom)
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
|
|
||||||
if (cx->fp && (tmp = cx->fp->scopeChain) != NULL) {
|
if (scope || (cx->fp && (scope = cx->fp->scopeChain) != NULL)) {
|
||||||
/* Find the topmost object in the scope chain. */
|
/* Find the topmost object in the scope chain. */
|
||||||
do {
|
do {
|
||||||
obj = tmp;
|
obj = scope;
|
||||||
tmp = OBJ_GET_PARENT(cx, obj);
|
scope = OBJ_GET_PARENT(cx, obj);
|
||||||
} while (tmp);
|
} while (scope);
|
||||||
} else {
|
} else {
|
||||||
obj = cx->globalObject;
|
obj = cx->globalObject;
|
||||||
if (!obj) {
|
if (!obj) {
|
||||||
|
@ -1682,7 +1686,7 @@ js_ConstructObject(JSContext *cx, JSClass *clasp, JSObject *proto,
|
||||||
jsval cval, rval;
|
jsval cval, rval;
|
||||||
JSObject *obj, *ctor;
|
JSObject *obj, *ctor;
|
||||||
|
|
||||||
if (!FindConstructor(cx, clasp->name, &cval))
|
if (!FindConstructor(cx, parent, clasp->name, &cval))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2051,7 +2055,7 @@ js_LookupProperty(JSContext *cx, JSObject *obj, jsid id, JSObject **objp,
|
||||||
}
|
}
|
||||||
if (sym && (sprop = sym_property(sym)) != NULL) {
|
if (sym && (sprop = sym_property(sym)) != NULL) {
|
||||||
JS_ASSERT(OBJ_SCOPE(obj) == scope);
|
JS_ASSERT(OBJ_SCOPE(obj) == scope);
|
||||||
*objp = scope->object; /* XXXbe hide in jsscope.[ch] */
|
*objp = scope->object; /* XXXbe hide in jsscope.[ch] */
|
||||||
#ifdef JS_THREADSAFE
|
#ifdef JS_THREADSAFE
|
||||||
js_HoldScopeProperty(cx, scope, sprop);
|
js_HoldScopeProperty(cx, scope, sprop);
|
||||||
#endif
|
#endif
|
||||||
|
@ -3041,11 +3045,18 @@ js_DropProperty(JSContext *cx, JSObject *obj, JSProperty *prop)
|
||||||
|
|
||||||
JSBool
|
JSBool
|
||||||
js_GetClassPrototype(JSContext *cx, const char *name, JSObject **protop)
|
js_GetClassPrototype(JSContext *cx, const char *name, JSObject **protop)
|
||||||
|
{
|
||||||
|
return GetClassPrototype(cx, NULL, name, protop);
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSBool
|
||||||
|
GetClassPrototype(JSContext *cx, JSObject *scope, const char *name,
|
||||||
|
JSObject **protop)
|
||||||
{
|
{
|
||||||
jsval v;
|
jsval v;
|
||||||
JSObject *ctor;
|
JSObject *ctor;
|
||||||
|
|
||||||
if (!FindConstructor(cx, name, &v))
|
if (!FindConstructor(cx, scope, name, &v))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
if (JSVAL_IS_FUNCTION(cx, v)) {
|
if (JSVAL_IS_FUNCTION(cx, v)) {
|
||||||
ctor = JSVAL_TO_OBJECT(v);
|
ctor = JSVAL_TO_OBJECT(v);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче