bug 517749 - removal of weakRoots.newborn = null. r=mrbkap
This commit is contained in:
@@ -555,22 +555,16 @@ js_SetLengthProperty(JSContext *cx, JSObject *obj, jsdouble length)
|
||||
JSBool
|
||||
js_HasLengthProperty(JSContext *cx, JSObject *obj, jsuint *lengthp)
|
||||
{
|
||||
JSErrorReporter older;
|
||||
JSTempValueRooter tvr;
|
||||
jsid id;
|
||||
JSBool ok;
|
||||
|
||||
older = JS_SetErrorReporter(cx, NULL);
|
||||
JS_PUSH_SINGLE_TEMP_ROOT(cx, JSVAL_NULL, &tvr);
|
||||
id = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
||||
ok = obj->getProperty(cx, id, &tvr.u.value);
|
||||
JSErrorReporter older = JS_SetErrorReporter(cx, NULL);
|
||||
JSAutoTempValueRooter tvr(cx, JSVAL_NULL);
|
||||
jsid id = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
||||
JSBool ok = obj->getProperty(cx, id, tvr.addr());
|
||||
JS_SetErrorReporter(cx, older);
|
||||
if (ok) {
|
||||
*lengthp = ValueIsLength(cx, &tvr.u.value);
|
||||
ok = !JSVAL_IS_NULL(tvr.u.value);
|
||||
}
|
||||
JS_POP_TEMP_ROOT(cx, &tvr);
|
||||
return ok;
|
||||
if (!ok)
|
||||
return false;
|
||||
|
||||
*lengthp = ValueIsLength(cx, tvr.addr());
|
||||
return !JSVAL_IS_NULL(tvr.value());
|
||||
}
|
||||
|
||||
JSBool
|
||||
@@ -1809,12 +1803,8 @@ array_join(JSContext *cx, uintN argc, jsval *vp)
|
||||
static JSBool
|
||||
array_reverse(JSContext *cx, uintN argc, jsval *vp)
|
||||
{
|
||||
JSObject *obj;
|
||||
JSTempValueRooter tvr;
|
||||
jsuint len, half, i;
|
||||
JSBool ok, hole, hole2;
|
||||
|
||||
obj = JS_THIS_OBJECT(cx, vp);
|
||||
jsuint len;
|
||||
JSObject *obj = JS_THIS_OBJECT(cx, vp);
|
||||
if (!obj || !js_GetLengthProperty(cx, obj, &len))
|
||||
return JS_FALSE;
|
||||
*vp = OBJECT_TO_JSVAL(obj);
|
||||
@@ -1852,22 +1842,19 @@ array_reverse(JSContext *cx, uintN argc, jsval *vp)
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
ok = JS_TRUE;
|
||||
JS_PUSH_SINGLE_TEMP_ROOT(cx, JSVAL_NULL, &tvr);
|
||||
half = len / 2;
|
||||
for (i = 0; i < half; i++) {
|
||||
ok = JS_CHECK_OPERATION_LIMIT(cx) &&
|
||||
GetArrayElement(cx, obj, i, &hole, &tvr.u.value) &&
|
||||
GetArrayElement(cx, obj, len - i - 1, &hole2, vp) &&
|
||||
SetOrDeleteArrayElement(cx, obj, len - i - 1, hole, tvr.u.value) &&
|
||||
SetOrDeleteArrayElement(cx, obj, i, hole2, *vp);
|
||||
if (!ok)
|
||||
break;
|
||||
JSAutoTempValueRooter tvr(cx, JSVAL_NULL);
|
||||
for (jsuint i = 0, half = len / 2; i < half; i++) {
|
||||
JSBool hole, hole2;
|
||||
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
||||
!GetArrayElement(cx, obj, i, &hole, tvr.addr()) ||
|
||||
!GetArrayElement(cx, obj, len - i - 1, &hole2, vp) ||
|
||||
!SetOrDeleteArrayElement(cx, obj, len - i - 1, hole, tvr.value()) ||
|
||||
!SetOrDeleteArrayElement(cx, obj, i, hole2, *vp)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
JS_POP_TEMP_ROOT(cx, &tvr);
|
||||
|
||||
*vp = OBJECT_TO_JSVAL(obj);
|
||||
return ok;
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef struct MSortArgs {
|
||||
@@ -2810,8 +2797,7 @@ array_concat(JSContext *cx, uintN argc, jsval *vp)
|
||||
JSObject *aobj, *nobj;
|
||||
jsuint length, alength, slot;
|
||||
uintN i;
|
||||
JSBool hole, ok;
|
||||
JSTempValueRooter tvr;
|
||||
JSBool hole;
|
||||
|
||||
/* Treat our |this| object as the first argument; see ECMA 15.4.4.4. */
|
||||
argv = JS_ARGV(cx, vp) - 1;
|
||||
@@ -2849,14 +2835,12 @@ array_concat(JSContext *cx, uintN argc, jsval *vp)
|
||||
length = 0;
|
||||
}
|
||||
|
||||
MUST_FLOW_THROUGH("out");
|
||||
JS_PUSH_SINGLE_TEMP_ROOT(cx, JSVAL_NULL, &tvr);
|
||||
JSAutoTempValueRooter tvr(cx, JSVAL_NULL);
|
||||
|
||||
/* Loop over [0, argc] to concat args into nobj, expanding all Arrays. */
|
||||
for (i = 0; i <= argc; i++) {
|
||||
ok = JS_CHECK_OPERATION_LIMIT(cx);
|
||||
if (!ok)
|
||||
goto out;
|
||||
if (!JS_CHECK_OPERATION_LIMIT(cx))
|
||||
return false;
|
||||
v = argv[i];
|
||||
if (!JSVAL_IS_PRIMITIVE(v)) {
|
||||
JSObject *wobj;
|
||||
@@ -2864,30 +2848,25 @@ array_concat(JSContext *cx, uintN argc, jsval *vp)
|
||||
aobj = JSVAL_TO_OBJECT(v);
|
||||
wobj = js_GetWrappedObject(cx, aobj);
|
||||
if (OBJ_IS_ARRAY(cx, wobj)) {
|
||||
ok = aobj->getProperty(cx, ATOM_TO_JSID(cx->runtime->atomState.lengthAtom),
|
||||
&tvr.u.value);
|
||||
if (!ok)
|
||||
goto out;
|
||||
alength = ValueIsLength(cx, &tvr.u.value);
|
||||
ok = !JSVAL_IS_NULL(tvr.u.value);
|
||||
if (!ok)
|
||||
goto out;
|
||||
jsid id = ATOM_TO_JSID(cx->runtime->atomState.lengthAtom);
|
||||
if (!aobj->getProperty(cx, id, tvr.addr()))
|
||||
return false;
|
||||
alength = ValueIsLength(cx, tvr.addr());
|
||||
if (JSVAL_IS_NULL(tvr.value()))
|
||||
return false;
|
||||
for (slot = 0; slot < alength; slot++) {
|
||||
ok = JS_CHECK_OPERATION_LIMIT(cx) &&
|
||||
GetArrayElement(cx, aobj, slot, &hole,
|
||||
&tvr.u.value);
|
||||
if (!ok)
|
||||
goto out;
|
||||
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
|
||||
!GetArrayElement(cx, aobj, slot, &hole, tvr.addr())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Per ECMA 262, 15.4.4.4, step 9, ignore non-existent
|
||||
* properties.
|
||||
*/
|
||||
if (!hole) {
|
||||
ok = SetArrayElement(cx, nobj, length + slot,
|
||||
tvr.u.value);
|
||||
if (!ok)
|
||||
goto out;
|
||||
if (!hole &&
|
||||
!SetArrayElement(cx, nobj, length+slot, tvr.value())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
length += alength;
|
||||
@@ -2895,17 +2874,12 @@ array_concat(JSContext *cx, uintN argc, jsval *vp)
|
||||
}
|
||||
}
|
||||
|
||||
ok = SetArrayElement(cx, nobj, length, v);
|
||||
if (!ok)
|
||||
goto out;
|
||||
if (!SetArrayElement(cx, nobj, length, v))
|
||||
return false;
|
||||
length++;
|
||||
}
|
||||
|
||||
ok = js_SetLengthProperty(cx, nobj, length);
|
||||
|
||||
out:
|
||||
JS_POP_TEMP_ROOT(cx, &tvr);
|
||||
return ok;
|
||||
return js_SetLengthProperty(cx, nobj, length);
|
||||
}
|
||||
|
||||
static JSBool
|
||||
|
||||
Reference in New Issue
Block a user