Bug 579471 - fast constructors (r=dmandelin,lw)

This commit is contained in:
Brian Hackett
2010-08-10 16:38:08 -07:00
parent b392cd8c8e
commit 9fdac17d65
13 changed files with 150 additions and 88 deletions

View File

@@ -1007,7 +1007,8 @@ Class js_ArrayClass = {
"Array",
Class::NON_NATIVE |
JSCLASS_HAS_RESERVED_SLOTS(JSObject::DENSE_ARRAY_FIXED_RESERVED_SLOTS) |
JSCLASS_HAS_CACHED_PROTO(JSProto_Array),
JSCLASS_HAS_CACHED_PROTO(JSProto_Array) |
JSCLASS_FAST_CONSTRUCTOR,
PropertyStub, /* addProperty */
PropertyStub, /* delProperty */
PropertyStub, /* getProperty */
@@ -1042,7 +1043,9 @@ Class js_ArrayClass = {
Class js_SlowArrayClass = {
"Array",
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_CACHED_PROTO(JSProto_Array),
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_CACHED_PROTO(JSProto_Array) |
JSCLASS_FAST_CONSTRUCTOR,
slowarray_addProperty,
PropertyStub, /* delProperty */
PropertyStub, /* getProperty */
@@ -2953,31 +2956,29 @@ NewDenseArrayObject(JSContext *cx)
}
JSBool
js_Array(JSContext *cx, JSObject *obj, uintN argc, Value *argv, Value *rval)
js_Array(JSContext *cx, uintN argc, Value *vp)
{
jsuint length;
const Value *vector;
/* If called without new, replace obj with a new Array object. */
if (!JS_IsConstructing(cx)) {
obj = NewDenseArrayObject(cx);
if (!obj)
return JS_FALSE;
rval->setObject(*obj);
}
/* Whether called with 'new' or not, use a new Array object. */
JSObject *obj = NewDenseArrayObject(cx);
if (!obj)
return JS_FALSE;
vp->setObject(*obj);
if (argc == 0) {
length = 0;
vector = NULL;
} else if (argc > 1) {
length = (jsuint) argc;
vector = argv;
} else if (!argv[0].isNumber()) {
vector = vp + 2;
} else if (!vp[2].isNumber()) {
length = 1;
vector = argv;
vector = vp + 2;
} else {
length = ValueIsLength(cx, &argv[0]);
if (argv[0].isNull())
length = ValueIsLength(cx, vp + 2);
if (vp[2].isNull())
return JS_FALSE;
vector = NULL;
}
@@ -3027,7 +3028,7 @@ JS_DEFINE_CALLINFO_3(extern, OBJECT, js_NewPreallocatedArray, CONTEXT, OBJECT, I
JSObject *
js_InitArrayClass(JSContext *cx, JSObject *obj)
{
JSObject *proto = js_InitClass(cx, obj, NULL, &js_ArrayClass, js_Array, 1,
JSObject *proto = js_InitClass(cx, obj, NULL, &js_ArrayClass, (Native) js_Array, 1,
NULL, array_methods, NULL, array_static_methods);
if (!proto)
return NULL;