Bug 686582 - Start adjust existing algorithms to use element-specific methods in preference to jsid-generalized ones. r=dvander

--HG--
extra : rebase_source : 0dbe07f70aa25238296aea3cb445016532f4eea9
This commit is contained in:
Jeff Walden 2011-08-10 14:54:52 -07:00
parent b4eea0475c
commit 8d687711db
6 changed files with 36 additions and 40 deletions

View File

@ -408,7 +408,7 @@ static bool
GetElementsSlow(JSContext *cx, JSObject *aobj, uint32 length, Value *vp)
{
for (uint32 i = 0; i < length; i++) {
if (!aobj->getProperty(cx, INT_TO_JSID(jsint(i)), &vp[i]))
if (!aobj->getElement(cx, i, &vp[i]))
return false;
}

View File

@ -665,7 +665,7 @@ js_Stringify(JSContext *cx, Value *vp, JSObject *replacer, Value space, StringBu
for (; i < len; i++) {
/* Step 4b(iv)(2). */
Value v;
if (!replacer->getProperty(cx, INT_TO_JSID(i), &v))
if (!replacer->getElement(cx, i, &v))
return false;
jsid id;

View File

@ -424,18 +424,16 @@ ArrayToIdVector(JSContext *cx, const Value &array, AutoIdVector &props)
if (!js_GetLengthProperty(cx, obj, &length))
return false;
AutoIdRooter idr(cx);
AutoValueRooter tvr(cx);
for (jsuint n = 0; n < length; ++n) {
if (!JS_CHECK_OPERATION_LIMIT(cx))
return false;
if (!IndexToId(cx, n, idr.addr()))
Value v;
if (!obj->getElement(cx, n, &v))
return false;
if (!obj->getProperty(cx, idr.id(), tvr.addr()))
jsid id;
if (!ValueToId(cx, v, &id))
return false;
if (!ValueToId(cx, tvr.value(), idr.addr()))
return false;
if (!props.append(js_CheckForStringIndex(idr.id())))
if (!props.append(js_CheckForStringIndex(id)))
return false;
}

View File

@ -229,27 +229,27 @@ class RegExpMatchBuilder
JSContext * const cx;
JSObject * const array;
bool setProperty(JSAtom *name, Value v) {
return !!js_DefineProperty(cx, array, ATOM_TO_JSID(name), &v,
PropertyStub, StrictPropertyStub, JSPROP_ENUMERATE);
}
public:
RegExpMatchBuilder(JSContext *cx, JSObject *array) : cx(cx), array(array) {}
bool append(int index, JSString *str) {
bool append(uint32 index, Value v) {
JS_ASSERT(!array->getOps()->getElement);
return !!js_DefineElement(cx, array, index, &v, PropertyStub, StrictPropertyStub,
JSPROP_ENUMERATE);
}
bool setIndex(int index) {
return setProperty(cx->runtime->atomState.indexAtom, Int32Value(index));
}
bool setInput(JSString *str) {
JS_ASSERT(str);
return append(INT_TO_JSID(index), StringValue(str));
}
bool append(jsid id, Value val) {
return !!js_DefineProperty(cx, array, id, &val, js::PropertyStub, js::StrictPropertyStub,
JSPROP_ENUMERATE);
}
bool appendIndex(int index) {
return append(ATOM_TO_JSID(cx->runtime->atomState.indexAtom), Int32Value(index));
}
/* Sets the input attribute of the match array. */
bool appendInput(JSString *str) {
JS_ASSERT(str);
return append(ATOM_TO_JSID(cx->runtime->atomState.inputAtom), StringValue(str));
return setProperty(cx->runtime->atomState.inputAtom, StringValue(str));
}
};
@ -315,18 +315,17 @@ RegExp::createResult(JSContext *cx, JSString *input, int *buf, size_t matchItemC
JS_ASSERT(start <= end);
JS_ASSERT(unsigned(end) <= input->length());
captured = js_NewDependentString(cx, input, start, end - start);
if (!(captured && builder.append(i / 2, captured)))
if (!captured || !builder.append(i / 2, StringValue(captured)))
return NULL;
} else {
/* Missing parenthesized match. */
JS_ASSERT(i != 0); /* Since we had a match, first pair must be present. */
if (!builder.append(INT_TO_JSID(i / 2), UndefinedValue()))
if (!builder.append(i / 2, UndefinedValue()))
return NULL;
}
}
if (!builder.appendIndex(buf[0]) ||
!builder.appendInput(input))
if (!builder.setIndex(buf[0]) || !builder.setInput(input))
return NULL;
return array;

View File

@ -341,7 +341,7 @@ static JSFunctionSpec string_functions[] = {
jschar js_empty_ucstr[] = {0};
JSSubString js_EmptySubString = {0, js_empty_ucstr};
#define STRING_ELEMENT_ATTRS (JSPROP_ENUMERATE|JSPROP_READONLY|JSPROP_PERMANENT)
static const uintN STRING_ELEMENT_ATTRS = JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT;
static JSBool
str_enumerate(JSContext *cx, JSObject *obj)
@ -351,9 +351,9 @@ str_enumerate(JSContext *cx, JSObject *obj)
JSString *str1 = js_NewDependentString(cx, str, i, 1);
if (!str1)
return false;
if (!obj->defineProperty(cx, INT_TO_JSID(i), StringValue(str1),
PropertyStub, StrictPropertyStub,
STRING_ELEMENT_ATTRS)) {
if (!obj->defineElement(cx, i, StringValue(str1),
PropertyStub, StrictPropertyStub,
STRING_ELEMENT_ATTRS)) {
return false;
}
}
@ -375,8 +375,8 @@ str_resolve(JSContext *cx, JSObject *obj, jsid id, uintN flags,
JSString *str1 = JSAtom::getUnitStringForElement(cx, str, size_t(slot));
if (!str1)
return JS_FALSE;
if (!obj->defineProperty(cx, id, StringValue(str1), NULL, NULL,
STRING_ELEMENT_ATTRS)) {
if (!obj->defineElement(cx, uint32(slot), StringValue(str1), NULL, NULL,
STRING_ELEMENT_ATTRS)) {
return JS_FALSE;
}
*objp = obj;
@ -1510,7 +1510,7 @@ BuildFlatMatchArray(JSContext *cx, JSString *textstr, const FlatMatch &fm, Value
return false;
vp->setObject(*obj);
return obj->defineProperty(cx, INT_TO_JSID(0), StringValue(fm.pattern())) &&
return obj->defineElement(cx, 0, StringValue(fm.pattern())) &&
obj->defineProperty(cx, ATOM_TO_JSID(cx->runtime->atomState.indexAtom),
Int32Value(fm.match())) &&
obj->defineProperty(cx, ATOM_TO_JSID(cx->runtime->atomState.inputAtom),
@ -1536,8 +1536,7 @@ MatchCallback(JSContext *cx, RegExpStatics *res, size_t count, void *p)
}
Value v;
return res->createLastMatch(cx, &v) &&
arrayobj->defineProperty(cx, INT_TO_JSID(count), v);
return res->createLastMatch(cx, &v) && arrayobj->defineElement(cx, count, v);
}
static JSBool

View File

@ -1566,7 +1566,7 @@ class TypedArrayTemplate
Value v;
for (uintN i = 0; i < len; ++i) {
if (!ar->getProperty(cx, ::INT_TO_JSID(i), &v))
if (!ar->getElement(cx, i, &v))
return false;
*dest++ = nativeFromValue(cx, v);
}