Closed Bug 492840 Opened 15 years ago Closed 15 years ago

ES5: Implement Object.create


(Core :: JavaScript Engine, defect)

Not set





(Reporter: jimb, Assigned: Waldo)



(Keywords: dev-doc-complete, Whiteboard: fixed-in-tracemonkey)


(2 files, 2 obsolete files)

Object.create is specified by in the ES5 draft:
Blocks: 430133
No longer depends on: 430133
Assignee: general → jwalden+bmo
Attached patch Patch atop latest in bug 430133 (obsolete) — Splinter Review
This doesn't provide any new functionality, but newborn-proto-setting capability is an important step toward removing __proto__ support at some (likely distant) time in the future.
Attachment #402512 - Flags: review?(jorendorff)
Attachment #402512 - Attachment is obsolete: true
Attachment #402921 - Flags: review?(jorendorff)
Attachment #402512 - Flags: review?(jorendorff)
Attachment #402921 - Attachment is obsolete: true
Attachment #402997 - Flags: review?(mrbkap)
Attachment #402921 - Flags: review?(jorendorff)
Waldo, please fix the test to call reportCompare() and update ecma_5/Object/jstests.list to remove the skip. Thanks.
Comment on attachment 402997 [details] [diff] [review]
Updated atop latest patch in bug 430133, add another test or two

>+MSG_DEF(JSMSG_NOT_OBJECT_OR_NULL,     244, 0, JSEXN_TYPEERR, "value is not null or an object")

You can use JSMSG_UNEXPECTED_TYPE with type being "null or an object" instead of adding a new message here.

>diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp
>--- a/js/src/jsobj.cpp
>+++ b/js/src/jsobj.cpp
>@@ -2673,16 +2673,80 @@ obj_defineProperties(JSContext* cx, uint
>     for (size_t i = 0; i < len; i++) {
>         if (!DefineProperty(cx, obj, (*descs)[i], true, dummy))
>             return JS_FALSE;
>     }
>     return JS_TRUE;
> }
>+/* ES5 Object.create(O [, Properties]) */
>+static JSBool
>+obj_create(JSContext *cx, uintN argc, jsval *vp)
>+    jsval v = argc == 0 ? JSVAL_VOID : vp[2];

Nit: parentheses around argc == 0.

>+    if (argc < 1 || !JSVAL_IS_OBJECT(v)) {

The argc < 1 in this check is redundant with the above assignment (especially since we assign a non-object to v if argc is less than 1). I guess it's a little tricky, but I'd say to remove the redundant test.

>+    /*
>+     * Notwithstanding that Object.create seems more likely to be in run-once
>+     * code than performance-critical code, JS_GetScopeChain(cx) is going to
>+     * throw us off trace -- is there an alternative?

Hmm, so js_NewObjectWithGivenProto will use the parent of the prototype (if it's not null) if parent is null. You could use that if the given prototype is non-null. I don't know what we want the lexical scope of these objects to be. Parented to the prototype object's parent (which may be a different lexical scope)? Always parented to the static scope of Object.create? I assume the spec is silent on this issue because it doesn't address the possibility of multiple global objects...
Attachment #402997 - Flags: review?(mrbkap) → review+
(reversing dependency on Object.defineProperty, whose patch this patch depends on)
No longer blocks: 430133
Depends on: 430133
Blocks: es5
Whiteboard: fixed-in-tracemonkey
Target Milestone: --- → mozilla1.9.3a1
I wrote up a little bit here, but we certainly need to make the information more visible than simply buried in the JS reference:
Keywords: dev-doc-needed
Closed: 15 years ago
Resolution: --- → FIXED
Depends on: 573651
No longer depends on: 573651
You need to log in before you can comment on or make changes to this bug.