Bug 753203 (ExactRooting)

[meta] GC: Exact Stack Rooting

RESOLVED FIXED in Firefox OS v2.0

Status

()

Core
JavaScript Engine
RESOLVED FIXED
5 years ago
2 years ago

People

(Reporter: terrence, Assigned: terrence)

Tracking

Firefox Tracking Flags

(b2g-v2.0 fixed, b2g-v2.1 fixed)

Details

Attachments

(2 attachments, 7 obsolete attachments)

(Assignee)

Description

5 years ago
This is a meta bug that links to all of the on-going rooting work that is blocking further work on the GC.
Whiteboard: [js:t]
(Assignee)

Updated

5 years ago
Depends on: 761391
(Assignee)

Updated

5 years ago
Depends on: 763096
(Assignee)

Updated

5 years ago
Depends on: 764440
(Assignee)

Updated

5 years ago
Depends on: 762678
(Assignee)

Updated

5 years ago
Depends on: 759895
(Assignee)

Updated

5 years ago
Depends on: 763110
(Assignee)

Updated

5 years ago
Depends on: 761712
(Assignee)

Updated

5 years ago
Depends on: 753609
(Assignee)

Updated

5 years ago
Depends on: 750733
(Assignee)

Updated

5 years ago
Blocks: 745742
(Assignee)

Updated

5 years ago
No longer blocks: 745742
Depends on: 745742
(Assignee)

Updated

5 years ago
Depends on: 753542
(Assignee)

Comment 1

5 years ago
Created attachment 635918 [details] [diff] [review]
Experiment: root everything and let C++ sort it out.

We have wondered for awhile how much difference it will make to just Root everything on the stack always.  The worry here is that this will be slow compared to rooting a minimalish set of what we need, but much, much easier to use and maintain.

Dave had an excellent idea yesterday for how to test this: fake "link" everything coming out of (Try)NewGCThing into a list.  This will give us the performance equivalent to putting every new thing into a Rooted immediately.  Caveat: this misses the cost of re-rooting returned values and doesn't address the double indirection through handles.

Both were builds were with:  --target=i686-pc-linux --enable-tests --enable-valgrind --disable-debug --enable-optimize

Inbound tip (97329:bfa21a56f646) before the patch:
       crypto: 0.04 sys 1.81 user 0:02.02 wall 213728 kb
    deltablue: 0.06 sys 1.96 user 0:02.01 wall 446336 kb
 earley-boyer: 0.06 sys 7.46 user 0:07.54 wall 409408 kb
     raytrace: 0.01 sys 4.17 user 0:04.17 wall 407872 kb
       regexp: 0.05 sys 2.01 user 0:02.05 wall 199248 kb
     richards: 0.01 sys 1.51 user 0:01.54 wall 54880 kb
        splay: 0.05 sys 0.58 user 0:00.63 wall 1008160 kb

With the attached patch:
       crypto: 0.03 sys 1.81 user 0:01.84 wall 213664 kb
    deltablue: 0.02 sys 2.00 user 0:02.01 wall 446320 kb
 earley-boyer: 0.04 sys 7.50 user 0:07.54 wall 409536 kb
     raytrace: 0.03 sys 4.08 user 0:04.10 wall 407760 kb
       regexp: 0.02 sys 2.05 user 0:02.06 wall 199264 kb
     richards: 0.00 sys 1.52 user 0:01.51 wall 54848 kb
        splay: 0.07 sys 0.57 user 0:00.63 wall 1008144 kb

The cost is not zero, but it's pretty close.
Seems promising! Are you unlinking as well?

Thinking about how this compares to hypothetical reality, this will root some things we wouldn't root (and so is pessimistic), but only roots things once (and so is optimistic.)

We could get an estimate for the cost of the narrowest possible rooting, by doing a stack scan at every NewGCThing and gathering together the set of gcthings on the stack into a vector. Then on the next stack scan, you find the longest common prefix and assume that you wouldn't have to re-root those. The sum of all the suffix lengths is the total number of things you would root. But to estimate the cost, you'd probably want to just store a vector of the suffix lengths, and "fake-root" that many objects on each call (assuming a deterministic replay). The overhead of that is a fairer baseline to compare your naive "root 'em all and let God sort 'em out" strategy, though I wish there were a simple way of coming up with a more accurate estimate of a maximal rooting strategy. Or rather, a sufficiently pessimistic one. Anybody?

I wonder how much the "root everything" resolves? It certainly removes the guesswork about what can potentially trigger GC. But there are still quite a few messy cases where you have arrays and structures of rootables, especially ones that are sometimes stored on the heap.
(Assignee)

Comment 3

5 years ago
Thanks for pushing me to get some real stats.  This is mean + (stdev) for 6 runs from before and after.

Before:
      crypto 11.667ms (11.690) sys 1828.333ms (11.690) user 1830.000ms (0.000) wall
   deltablue 55.000ms (23.452) sys 1965.000ms (23.452) user 2010.000ms (0.000) wall
earley-boyer 43.333ms (13.663) sys 7476.667ms (13.663) user 7510.000ms (0.000) wall
    raytrace 45.000ms (17.607) sys 4115.000ms (17.607) user 4150.000ms (0.000) wall
      regexp 30.000ms (15.492) sys 2036.667ms (18.619) user 2060.000ms (6.325) wall
    richards 5.000ms (8.367) sys 1505.000ms (13.784) user 1500.000ms (6.325) wall
       splay 73.333ms (8.165) sys 556.667ms (8.165) user 623.333ms (5.164) wall

After:
      crypto 15.000ms (13.784) sys 1825.000ms (13.784) user 1840.000ms (0.000) wall
   deltablue 41.667ms (11.690) sys 1978.333ms (11.690) user 2010.000ms (0.000) wall
earley-boyer 33.333ms (10.328) sys 7506.667ms (10.328) user 7538.333ms (4.082) wall
    raytrace 33.333ms (20.656) sys 4066.667ms (20.656) user 4090.000ms (0.000) wall
      regexp 30.000ms (8.944) sys 2048.333ms (13.292) user 2068.333ms (7.528) wall
    richards 11.667ms (9.832) sys 1508.333ms (9.832) user 1510.000ms (0.000) wall
       splay 85.000ms (5.477) sys 555.000ms (5.477) user 630.000ms (0.000) wall
In my experience, V8 is quite non-deterministic, even at the instruction level (e.g. measuring instruction counts with Cachegrind).

With that in mind, to me these results say "the cost is zero, as closely as we can tell".
(In reply to Terrence Cole [:terrence] from comment #1)
> Dave had an excellent idea yesterday for how to test this: fake "link"
> everything coming out of (Try)NewGCThing into a list.  This will give us the
> performance equivalent to putting every new thing into a Rooted immediately.
> Caveat: this misses the cost of re-rooting returned values and doesn't
> address the double indirection through handles.

I don't think this experiment is a good approximation of rooting costs.  The number of times a value is explicitly rooted (zero to many) is independent from the number of times it is allocated (once).  Moreover, most GC things in these benchmarks are being allocated in JIT code and won't hit NewGCThing or TryNewGCThing.
(Assignee)

Comment 6

5 years ago
(In reply to Brian Hackett (:bhackett) from comment #5)
> I don't think this experiment is a good approximation of rooting costs.  The
> number of times a value is explicitly rooted (zero to many) is independent
> from the number of times it is allocated (once).  Moreover, most GC things
> in these benchmarks are being allocated in JIT code and won't hit NewGCThing
> or TryNewGCThing.

You're right, I totally forgot about that.  Given that this is a gross underestimate of the cost and that there is a visible impact even so, it looks like we are going to have to do things the hard way.  Oh well.
> Given that this is a gross
> underestimate of the cost and that there is a visible impact even so

I can believe the "gross underestimate", but like I said in comment 4, I disagree about the "visible impact".  In other words, I wouldn't abandon this approach yet.
Depends on: 647405
No longer depends on: 647405
(Assignee)

Updated

5 years ago
Depends on: 777219
(Assignee)

Updated

5 years ago
Depends on: 780309
(Assignee)

Updated

5 years ago
Depends on: 780765

Updated

5 years ago
Depends on: 782802
(Assignee)

Updated

5 years ago
Depends on: 786136
(Assignee)

Updated

5 years ago
Depends on: 788904
(Assignee)

Updated

5 years ago
Blocks: 788905
Depends on: 789551
(Assignee)

Updated

5 years ago
Depends on: 790108
(Assignee)

Updated

5 years ago
Depends on: 790836
(Assignee)

Updated

5 years ago
Depends on: 791022
Alias: ExactRooting
Depends on: 791611
(Assignee)

Updated

5 years ago
Depends on: 792218
Depends on: 793076
Depends on: 793086
Depends on: 793577
Depends on: 793588
(Assignee)

Updated

5 years ago
Depends on: 793823
(Assignee)

Updated

5 years ago
Blocks: 795030
(Assignee)

Updated

5 years ago
Depends on: 795743
Depends on: 796760
(Assignee)

Updated

5 years ago
Depends on: 798638
(Assignee)

Updated

5 years ago
Depends on: 800631
(Assignee)

Updated

5 years ago
Depends on: 802319
(Assignee)

Updated

5 years ago
Depends on: 807027
(Assignee)

Updated

5 years ago
Depends on: 810102
(Assignee)

Updated

5 years ago
Depends on: 813244
(Assignee)

Updated

5 years ago
Depends on: 813252
(Assignee)

Updated

5 years ago
Depends on: 811168
(Assignee)

Updated

5 years ago
Depends on: 773686
(Assignee)

Updated

5 years ago
Depends on: 816770
(Assignee)

Updated

5 years ago
Depends on: 817091
(Assignee)

Updated

5 years ago
Depends on: 817164
(Assignee)

Updated

5 years ago
Depends on: 772820
(Assignee)

Updated

5 years ago
Depends on: 826435
(Assignee)

Updated

5 years ago
Depends on: 826879
Depends on: 828020
Depends on: 828462
Depends on: 828248

Updated

5 years ago
Depends on: 828293, 828244, 828494, 828567
(Assignee)

Updated

5 years ago
Depends on: 828690
(Assignee)

Updated

5 years ago
Depends on: 828696
Depends on: 828977
Depends on: 829087
Depends on: 828753
Depends on: 829230

Updated

5 years ago
Depends on: 829205
Depends on: 829243
Depends on: 829294
(Assignee)

Updated

5 years ago
Depends on: 829372
(Assignee)

Updated

5 years ago
Depends on: 829830

Updated

5 years ago
Depends on: 829898

Updated

5 years ago
Depends on: 829997

Updated

5 years ago
Depends on: 830783

Updated

5 years ago
Depends on: 830846
(Assignee)

Updated

5 years ago
Depends on: 831370
(Assignee)

Updated

5 years ago
Depends on: 831376
Depends on: 831409
(Assignee)

Updated

5 years ago
Depends on: 831580
Depends on: 838955
Depends on: 839376
(Assignee)

Updated

5 years ago
Depends on: 841054
(Assignee)

Updated

5 years ago
Depends on: 841558
(Assignee)

Updated

5 years ago
Depends on: 845519
(Assignee)

Updated

5 years ago
Depends on: 847728
(Assignee)

Updated

5 years ago
Depends on: 850074
(Assignee)

Updated

5 years ago
Depends on: 850293

Updated

5 years ago
Depends on: 852602
Depends on: 831379

Updated

4 years ago
Depends on: 858619
(Assignee)

Updated

4 years ago
Depends on: 860050
(Assignee)

Updated

4 years ago
Depends on: 862115
Depends on: 864848

Updated

4 years ago
Depends on: 866112

Updated

4 years ago
Depends on: 866134

Updated

4 years ago
Depends on: 866775

Updated

4 years ago
Depends on: 866778

Updated

4 years ago
Depends on: 866789
(Assignee)

Updated

4 years ago
Depends on: 867295
(Assignee)

Updated

4 years ago
Depends on: 867426

Updated

4 years ago
Depends on: 868037
Depends on: 868483

Updated

4 years ago
Depends on: 869469

Updated

4 years ago
Depends on: 869479

Updated

4 years ago
Depends on: 870442

Updated

4 years ago
Depends on: 872185
Depends on: 872638
(Assignee)

Updated

4 years ago
Depends on: 875939
Depends on: 879046
(Assignee)

Updated

4 years ago
Depends on: 879079
(Assignee)

Updated

4 years ago
No longer depends on: 817164
(Assignee)

Updated

4 years ago
No longer depends on: 862115
(Assignee)

Updated

4 years ago
Depends on: 834909
(Assignee)

Updated

4 years ago
Depends on: 880392
(Assignee)

Updated

4 years ago
Depends on: 883383
(Assignee)

Updated

4 years ago
Depends on: 884065
(Assignee)

Updated

4 years ago
Depends on: 868302
(Assignee)

Updated

4 years ago
Depends on: 884562
(Assignee)

Updated

4 years ago
Depends on: 884617
(Assignee)

Updated

4 years ago
Depends on: 884956
(Assignee)

Updated

4 years ago
Depends on: 848592
(Assignee)

Updated

4 years ago
No longer blocks: 788905
(Assignee)

Updated

4 years ago
No longer depends on: 813252

Updated

4 years ago
Depends on: 887009
(Assignee)

Updated

4 years ago
Depends on: 887039
(Assignee)

Updated

4 years ago
Depends on: 895220

Updated

4 years ago
Depends on: 896280
Depends on: 898220
(Assignee)

Updated

4 years ago
Depends on: 898494
(Assignee)

Updated

4 years ago
Depends on: 898606
(Assignee)

Updated

4 years ago
Depends on: 898608
No longer depends on: 829243
No longer depends on: 834909
No longer depends on: 831409
No longer depends on: 898494
No longer depends on: 868483
No longer depends on: 879079
(Assignee)

Updated

4 years ago
Depends on: 898964
No longer depends on: 898964
No longer depends on: 887039
No longer depends on: 791022
No longer depends on: 789551
(Assignee)

Updated

4 years ago
Blocks: 902913
(Assignee)

Updated

4 years ago
Depends on: 916338
(Assignee)

Updated

4 years ago
Depends on: 915735
Depends on: 926778
Depends on: 930378
Depends on: 930677
Depends on: 941796
(Assignee)

Updated

4 years ago
Attachment #635918 - Attachment is obsolete: true
(Assignee)

Comment 8

4 years ago
Created attachment 8337011 [details] [diff] [review]
enable_exr-v0.diff
Assignee: general → terrence
Status: NEW → ASSIGNED
Attachment #8337011 - Flags: review?(sphink)
Attachment #8337011 - Flags: review?(jcoppeard)

Updated

4 years ago
Attachment #8337011 - Flags: review?(jcoppeard) → review-
Comment on attachment 8337011 [details] [diff] [review]
enable_exr-v0.diff

Review of attachment 8337011 [details] [diff] [review]:
-----------------------------------------------------------------

Lunch discussion - we want to enable this a platform at a time.
Attachment #8337011 - Flags: review?(sphink) → review-
(Assignee)

Comment 10

4 years ago
Created attachment 8337104 [details] [diff] [review]
enable_exr_on_linux-v0.diff

Enable exact rooting on linux64. This is a bit challenging because there is no common configuration for only linux64.

https://tbpl.mozilla.org/?tree=Try&rev=09f9ddd79b16
Attachment #8337011 - Attachment is obsolete: true
Attachment #8337104 - Flags: review?(sphink)
Attachment #8337104 - Flags: review?(jcoppeard)
(Assignee)

Comment 11

4 years ago
Comment on attachment 8337104 [details] [diff] [review]
enable_exr_on_linux-v0.diff

Steve is still insisting that he isn't a build peer, so adding one.
Attachment #8337104 - Flags: review?(ted)
(In reply to Terrence Cole [:terrence] from comment #10)
> Created attachment 8337104 [details] [diff] [review]
> enable_exr_on_linux-v0.diff
> 
> Enable exact rooting on linux64. This is a bit challenging because there is
> no common configuration for only linux64.
> 
> https://tbpl.mozilla.org/?tree=Try&rev=09f9ddd79b16

This is not a good way to do it. People's local builds won't pick up the change, which will cause a lot of confusion. If you want to make the change be platform-specific, I think you're going to have to modify configure.in :-(.
Comment on attachment 8337104 [details] [diff] [review]
enable_exr_on_linux-v0.diff

Review of attachment 8337104 [details] [diff] [review]:
-----------------------------------------------------------------

lgtm
Attachment #8337104 - Flags: review?(sphink) → review+
(Assignee)

Updated

4 years ago
See Also: → bug 790092
(Assignee)

Comment 14

4 years ago
Comment on attachment 8337104 [details] [diff] [review]
enable_exr_on_linux-v0.diff

We need to use configure.in.
Attachment #8337104 - Flags: review?(ted)
Attachment #8337104 - Flags: review?(jcoppeard)
Attachment #8337104 - Flags: review+
(Assignee)

Comment 15

4 years ago
Created attachment 8345436 [details] [diff] [review]
enable_exr_all_but_b2g_fennec-v3.diff

I'm not sure I like this approach as it seems like it would make it harder to test and enable exact rooting on mobile and b2g. What do you think Steve?
Attachment #8337104 - Attachment is obsolete: true
Attachment #8345436 - Flags: feedback?(sphink)
Comment on attachment 8345436 [details] [diff] [review]
enable_exr_all_but_b2g_fennec-v3.diff

Review of attachment 8345436 [details] [diff] [review]:
-----------------------------------------------------------------

We discussed over irc, and decided to (1) default the setting based on app name, and (2) whitelist apps instead of blacklisting b2g.
Attachment #8345436 - Flags: feedback?(sphink) → feedback+
(Assignee)

Comment 17

4 years ago
Created attachment 8346657 [details] [diff] [review]
enable_exr_all_but_b2g_fennec-v4.diff

Updated the patch with what Steve and I discussed.
Attachment #8345436 - Attachment is obsolete: true
Attachment #8346657 - Flags: review?(ted)
Attachment #8346657 - Flags: feedback+
Attachment #8346657 - Flags: review?(ted) → review+
Blocks: 933467
(Assignee)

Comment 18

4 years ago
Created attachment 8357461 [details] [diff] [review]
enable_exr_all_but_b2g-v5.diff

I did not know that we need to manually dup everything we want in configure.in manually over from js/src/configure.in, so this patch adds that. Additionally, we need the new option to come after the default app-name computation, so I moved that up. I also noticed that JSGC_INCREMENTAL is set twice so I removed one of them. And the JS options were spread out in two spots in the file, so I moved them all to one location.

https://tbpl.mozilla.org/?tree=Try&rev=9e6c71cf58f5
Attachment #8346657 - Attachment is obsolete: true
Attachment #8357461 - Flags: review?(ted)
The patch is empty.
(Assignee)

Comment 20

4 years ago
Created attachment 8357467 [details] [diff] [review]
enable_exr_all_but_b2g-v5.diff

Gah! Thanks, Bill!
Attachment #8357461 - Attachment is obsolete: true
Attachment #8357461 - Flags: review?(ted)
Attachment #8357467 - Flags: review?(ted)
https://tbpl.mozilla.org/php/getParsedLog.php?id=32725838&tree=Try looks like it might be real.
(Assignee)

Updated

4 years ago
Depends on: 834909
(Assignee)

Updated

4 years ago
Depends on: 951743
Comment on attachment 8357467 [details] [diff] [review]
enable_exr_all_but_b2g-v5.diff

Review of attachment 8357467 [details] [diff] [review]:
-----------------------------------------------------------------

r=me with one change.

::: configure.in
@@ +7061,5 @@
> +dnl = Use exact stack rooting for GC
> +dnl ========================================================
> +dnl Only enable exact rooting specifically on platforms with analysis coverage.
> +JSGC_USE_EXACT_ROOTING=
> +if test "$MOZ_APP_NAME" = firefox -o "$MOZ_APP_NAME" = mobile/android ; then

These want to go in confvars.sh:
http://mxr.mozilla.org/mozilla-central/source/browser/confvars.sh
http://mxr.mozilla.org/mozilla-central/source/mobile/android/confvars.sh

::: js/src/configure.in
@@ +3372,5 @@
>  dnl = Use exact stack rooting for GC
>  dnl ========================================================
> +dnl Only enable exact rooting specifically on platforms with analysis coverage.
> +JSGC_USE_EXACT_ROOTING=
> +if test "$MOZ_APP_NAME" = firefox -o "$MOZ_APP_NAME" = mobile/android ; then

Same as the other one.
Attachment #8357467 - Flags: review?(ted) → review+

Updated

4 years ago
Depends on: 959683

Updated

4 years ago
Depends on: 960028
(Assignee)

Comment 23

4 years ago
Created attachment 8361795 [details] [diff] [review]
enable_exr_on_desktop-v6.diff

I changed the patch a bit so that instead of relying on APP_NAME to propagate to SM's configury, we just set --enable-exact-rooting directly from the toplevel configure. This will keep it from referring to undefined variables in shell builds and make the mechanism of how the flag gets sent to our build during browser builds clearer.
Attachment #8357467 - Attachment is obsolete: true
Attachment #8361795 - Flags: review+
(Assignee)

Comment 24

4 years ago
Note: a try run ensuring this all works as expected is here: https://tbpl.mozilla.org/?tree=Try&rev=c69f8a9e520a

I inserted a #error #ifdef JSGC_USE_EXACT_ROOTING, so the red builds are the ones with it enabled and the green builds are not impacted behaviorally by the change. This looks like the right set.
(Assignee)

Comment 25

4 years ago
https://hg.mozilla.org/integration/mozilla-inbound/rev/6f7227918e79

green try run:
https://tbpl.mozilla.org/?tree=Try&rev=eb22234a8b36
(Assignee)

Updated

4 years ago
Whiteboard: [js:t] → [js:t] [leave open
https://hg.mozilla.org/mozilla-central/rev/6f7227918e79
Whiteboard: [js:t] [leave open → [js:t] [leave open]
This seems to have caused 3-4% dromaeo-css regressions across platforms...
Flags: needinfo?(terrence)
In particular 6% or more regressions on the mootools tests, and slightly smaller on the others....
http://perf.snarkfest.net/compare-talos/index.html?oldRevs=b3c08e6fa790&newRev=61fd0f987cf2&submit=true has some links to data.
(Assignee)

Comment 30

4 years ago
And a 5% increase on v8, which I did not expect. V8 is going to stay mostly in ion, so there should be few roots either way; I expect not traversing the stack is strictly less work there. On the other hand, DOM <-> Layout <-> XPCOM <-> JSAPI layer probably involves a lot of re-rooting. In particular the Define* API's are still re-rooting. I'd like to get to those today and see if it helps.
Flags: needinfo?(terrence)
It's also worth just profiling some of those tests.  10+% regressions (possibly more on some of the subtests?) should be pretty easy to pick up.
(Assignee)

Updated

4 years ago
Depends on: 962256

Updated

4 years ago
Depends on: 963918
(Assignee)

Updated

4 years ago
Depends on: 960342
Depends on: 969989
Depends on: 973584
(In reply to Phil Ringnalda (:philor) from comment #26)
> https://hg.mozilla.org/mozilla-central/rev/6f7227918e79

Setting flag so it is easy to see exact rooting was enabled in FF28.
Target Milestone: --- → mozilla28
(Assignee)

Updated

3 years ago
Duplicate of this bug: 902913
Depends on: 1009675
(Assignee)

Comment 34

3 years ago
Created attachment 8458317 [details] [diff] [review]
enable_exact_rooting_everywhere-v0.diff

We still don't have a hazard analysis on mobile, but we don't have any implicated code there either, it seems. I think we should go ahead and land this and get ready to remove the conservative scanner with the next ESR.
Attachment #8458317 - Flags: review?(sphink)
Comment on attachment 8458317 [details] [diff] [review]
enable_exact_rooting_everywhere-v0.diff

Review of attachment 8458317 [details] [diff] [review]:
-----------------------------------------------------------------

I agree.
Attachment #8458317 - Flags: review?(sphink) → review+
(Assignee)

Comment 36

3 years ago
https://tbpl.mozilla.org/?tree=Try&rev=3252553ea95f
(Assignee)

Comment 37

3 years ago
https://tbpl.mozilla.org/?tree=Try&rev=3252553ea95f
https://hg.mozilla.org/integration/mozilla-inbound/rev/af0d4e4d2779
Comment hidden (obsolete)
(In reply to Chris Peterson (:cpeterson) from comment #38)
> Firefox OS 2.1 is based on Gecko 34, so it be the first version of Firefox
> OS with exact rooting.

Exact rooting for B2G was enabled in bug 941796 during the Gecko 32 cycle, i.e. v2.0.
status-b2g-v2.0: wontfix → fixed
https://hg.mozilla.org/mozilla-central/rev/af0d4e4d2779

Updated

3 years ago
Depends on: 1061214
(Assignee)

Updated

2 years ago
No longer depends on: 898608
(Assignee)

Comment 41

2 years ago
This is /so/ done.
Status: ASSIGNED → RESOLVED
Last Resolved: 2 years ago
Resolution: --- → FIXED
Whiteboard: [js:t] [leave open]
You need to log in before you can comment on or make changes to this bug.