Closed
Bug 1031632
Opened 11 years ago
Closed 11 years ago
Map.prototype.set, WeakMap.prototype.set and Set.prototype.add should be chainable
Categories
(Core :: JavaScript: Standard Library, defect)
Core
JavaScript: Standard Library
Tracking
()
RESOLVED
FIXED
mozilla33
People
(Reporter: caitpotter88, Assigned: spacetime, Mentored)
Details
(Keywords: dev-doc-complete, Whiteboard: [good first bug][lang=c++][DocArea=JS])
Attachments
(1 file, 3 obsolete files)
9.93 KB,
patch
|
till
:
review+
|
Details | Diff | Splinter Review |
User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Steps to reproduce:
Trivial example: http://jsfiddle.net/n4p9s/
Just run the example!
Actual results:
We get a TypeError because the value returned from `(new Map()).set('foo', 'BAR')` is undefined.
Expected results:
Per https://people.mozilla.org/~jorendorff/es6-draft.html#sec-map.prototype.set, the 'set' should return `M` (this), and be chainable. So, the chained '.set()' call should return the Map object.
It's a minor inconvenience, not a huge deal, but you know.
Reporter | ||
Comment 1•11 years ago
|
||
Updated test case: http://jsfiddle.net/e8mL2/
Also includes broken Set.prototype.add test, which should chain (per https://people.mozilla.org/~jorendorff/es6-draft.html#sec-set.prototype.entries)
This is also an issue in v8 (https://code.google.com/p/v8/issues/detail?id=3410)
Reporter | ||
Updated•11 years ago
|
Summary: Map.prototype.set ( key , value ) should be chainable → Map.prototype.set ( key , value ) and Set.prototype.add should be chainable
Reporter | ||
Comment 2•11 years ago
|
||
Comment 3•11 years ago
|
||
Yes, needs a sprinkling of args.rval.set(args.thisv())
Status: UNCONFIRMED → NEW
Component: General → JavaScript: Standard Library
Ever confirmed: true
Comment 4•11 years ago
|
||
Pretty straight-forward to do. Good first bug because working on this means doing some very light C++ coding and adding some small JS tests, making for a nice first dive into SpiderMonkey.
Mentor: till
OS: Mac OS X → All
Hardware: x86 → All
Whiteboard: [good first bug][c++]
Updated•11 years ago
|
Whiteboard: [good first bug][c++] → [good first bug][lang=c++]
Comment 7•11 years ago
|
||
Great! Do you need anything further, or are you good to go and create a patch?
Assignee | ||
Comment 8•11 years ago
|
||
I'm going through the documentation. Just to confirm, my first steps would be to go set up everything using https://wiki.mozilla.org/JavaScript:New_to_SpiderMonkey and write a test?
Comment 9•11 years ago
|
||
Correct, that is a pretty good starting point.
If you haven't set up your environment at all, you have to check out the source as the very first step. Then, run `./mach mercurial-setup` from the checkout's root directory to set everything up in such a way that you can produce useful patches.
Feel free to ask as many questions as you need here or in the #jsapi channel on irc.mozilla.org.
Assignee | ||
Comment 10•11 years ago
|
||
Some of the older tests failed since they asserted 'set' and 'add' return undefined. Removed assertions. Is there a better way? Also, could you help find a better fix for testCrossCompartmentTransparency.js?
Attachment #8449448 -
Flags: review?(till)
Comment 11•11 years ago
|
||
Comment on attachment 8449448 [details] [diff] [review]
Return object for Map.set and Set.add; Added test; Fixed old tests
Review of attachment 8449448 [details] [diff] [review]:
-----------------------------------------------------------------
::: js/src/jit-test/tests/collections/Map-delete.js
@@ +7,5 @@
> assertEq(m.delete(key), false);
> assertEq(m.has(key), false);
>
> // when the key is present
> +m.set(key, 'x');
Why not do a somthing like:
assertEq(m.set(key, 'x'), m);
That would test if we are returning the right value or not. Similarly for the other cases in rest of the files.
Assignee | ||
Comment 12•11 years ago
|
||
Makes sense. Fixed in this patch.
Attachment #8449448 -
Attachment is obsolete: true
Attachment #8449448 -
Flags: review?(till)
Attachment #8449469 -
Flags: review?(till)
Attachment #8449469 -
Flags: feedback?(sankha93)
Updated•11 years ago
|
Assignee: nobody → ra.rishab
Comment 13•11 years ago
|
||
Comment on attachment 8449469 [details] [diff] [review]
1031632.patch
Review of attachment 8449469 [details] [diff] [review]:
-----------------------------------------------------------------
Yup, this is fine. I'm clearing the review flag instead of granting the review because I just realized that the same change should be done for WeakMap. Can you do that and add a test for it, too?
::: js/src/jit-test/tests/collections/bug-1031632.js
@@ +1,1 @@
> +// Bug 1031632 - Map.prototype.set ( key , value ) and Set.prototype.add
Please split this file into tow, Map-set-returns-this.js and Set-add-returns-this.js - it's nice to be able to roughly understand what a test does by just reading the filename. Keep the comment in both files, though.
@@ +1,4 @@
> +// Bug 1031632 - Map.prototype.set ( key , value ) and Set.prototype.add
> +// should be chainable
> +
> +load(libdir + "asserts.js");
You shouldn't need to load this - jit-tests only run in the shell, and that has assertEq built-in.
@@ +2,5 @@
> +// should be chainable
> +
> +load(libdir + "asserts.js");
> +
> +var a = (new Map()).set('foo', 'BAR').get('foo');
I know that more checks are contained in other test files, but please add basic tests for the return value:
var m = new Map();
assertEq(m.set('foo', 'BAR'), m);
and the same for Set (and WeakMap).
Attachment #8449469 -
Flags: review?(till)
Assignee | ||
Comment 14•11 years ago
|
||
Attachment #8449469 -
Attachment is obsolete: true
Attachment #8449469 -
Flags: feedback?(sankha93)
Attachment #8450270 -
Flags: review?(till)
Comment 15•11 years ago
|
||
Comment on attachment 8450270 [details] [diff] [review]
Return object for Map.set, WeakMap.set and Set.add
Review of attachment 8450270 [details] [diff] [review]:
-----------------------------------------------------------------
Looks great. I commented on one issue that I fixed locally.
I also changed the commit message: it should contain the bug number and a description of what the patch does, not *why* it does it.
Pushed to try and will land it on inbound if everything is green:
https://tbpl.mozilla.org/?tree=Try&rev=de17213e5013
::: js/src/jsweakmap.cpp
@@ +419,5 @@
> RootedValue value(cx, (args.length() > 1) ? args[1] : UndefinedValue());
> Rooted<JSObject*> thisObj(cx, &args.thisv().toObject());
> Rooted<WeakMapObject*> map(cx, &thisObj->as<WeakMapObject>());
>
> + args.rval().set(args.thisv());
This needs to be the last statement in the function, because otherwise you'll set the return value even if the call to SetWeakMapEntryInternal fails. It should be something like this:
if (!SetWeakMapEntryInternal(cx, map, key, value))
return false;
args.rval().set(args.thisv());
return true;
I'll make that change locally, though, so no need to attach a new version.
Attachment #8450270 -
Flags: review?(till) → review+
Assignee | ||
Comment 16•11 years ago
|
||
I've incorporated the feedback from your last comment and removed an old regression test from Bug 697515 (https://bugzil.la/697515)
I also took the liberty to push it to try:
https://tbpl.mozilla.org/?tree=Try&rev=3ea713e6f6ac
Attachment #8450270 -
Attachment is obsolete: true
Attachment #8450377 -
Flags: review?(till)
Comment 17•11 years ago
|
||
Comment on attachment 8450377 [details] [diff] [review]
Return object for Map.set, WeakMap.set and Set.add; Removed old regression test
Review of attachment 8450377 [details] [diff] [review]:
-----------------------------------------------------------------
Yup, still fine. :)
Just for next time: an r+ means that you don't have to ask for a review again. Also, with a fix this small, a second try run isn't required. It doesn't hurt, but then again our infrastructure isn't exactly under-utilized ;)
Will land once the try run has finished.
Attachment #8450377 -
Flags: review?(till) → review+
Assignee | ||
Comment 18•11 years ago
|
||
(In reply to Till Schneidereit [:till] from comment #17)
> Comment on attachment 8450377 [details] [diff] [review]
> Return object for Map.set, WeakMap.set and Set.add; Removed old regression
> test
>
> Review of attachment 8450377 [details] [diff] [review]:
> -----------------------------------------------------------------
>
> Yup, still fine. :)
>
> Just for next time: an r+ means that you don't have to ask for a review
> again. Also, with a fix this small, a second try run isn't required. It
> doesn't hurt, but then again our infrastructure isn't exactly under-utilized
> ;)
>
> Will land once the try run has finished.
Got it :) Thanks!
Reporter | ||
Comment 19•11 years ago
|
||
☆.。.:・゜☆ Good job :spacetime! ☆.。.:・゜☆
Comment 20•11 years ago
|
||
remote: https://hg.mozilla.org/integration/mozilla-inbound/rev/aabe2de625c6
Congratulations, Rishab!
Do you know what you'd like to look into next? Ping me on IRC if you want suggestions or feedback.
Status: NEW → ASSIGNED
Summary: Map.prototype.set ( key , value ) and Set.prototype.add should be chainable → Map.prototype.set, WeakMap.prototype.set and Set.prototype.add should be chainable
Assignee | ||
Comment 21•11 years ago
|
||
Thank you, Caitlin!
Thank you, Till! I'll ping you on IRC.
Comment 22•11 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 11 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla33
Updated•11 years ago
|
Keywords: dev-doc-needed
Whiteboard: [good first bug][lang=c++] → [good first bug][lang=c++][DocArea=JS]
Comment 23•11 years ago
|
||
https://developer.mozilla.org/en-US/Firefox/Releases/33#JavaScript
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/set
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/add
Keywords: dev-doc-needed → dev-doc-complete
You need to log in
before you can comment on or make changes to this bug.
Description
•