Closed Bug 1257308 Opened 7 years ago Closed 7 years ago

Too much recursion 64 bit Windows, 64 bit Firefox 45

Categories

(Core :: JavaScript Engine, defect)

45 Branch
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: narayanan.vinod, Unassigned)

References

Details

User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36

Steps to reproduce:

Ran the codebase on firefox 64 bit (version 45)


Actual results:

Too much recursion error shows up


Expected results:

Code should have run fine like in 32 bit. It runs fine on firefox 45...32 bit version today.
What is the codebase?
Can you post some standalone testcase?
Flags: needinfo?(narayanan.vinod)
The codebase uses sencha extjs 3.4. Basically opening a dialog with a lot of items (panels) in it causes the issue. Unfortunately i don't think it is easy to create standalone code out of this.
Flags: needinfo?(narayanan.vinod)
Is there any public page that can reproduce the issue?
Flags: needinfo?(narayanan.vinod)
(In reply to Tooru Fujisawa [:arai] from comment #3)
> Is there any public page that can reproduce the issue?

Unfortunately not. I would have to create something heavy and expose it on fiddle to reproduce the bug and not sure if I'll be successful. Is there some stack or troubleshooting information from firefox exported out that would help?
Flags: needinfo?(narayanan.vinod)
Vinod, is it using a recursive algorithm? If it fails, is it possible there are more than, say, 1000 JS frames on the stack?

Earlier today I landed a patch to bump the stack limit on Windows a bit (bug 1256306). Does it still reproduce with the build below?

https://archive.mozilla.org/pub/firefox/tinderbox-builds/mozilla-inbound-win64-pgo/1458149515/firefox-48.0a1.en-US.win64.zip
Blocks: 1257234
Flags: needinfo?(narayanan.vinod)
(In reply to Jan de Mooij [:jandem] from comment #5)
> Vinod, is it using a recursive algorithm? If it fails, is it possible there
> are more than, say, 1000 JS frames on the stack?
> 
> Earlier today I landed a patch to bump the stack limit on Windows a bit (bug
> 1256306). Does it still reproduce with the build below?
> 
> https://archive.mozilla.org/pub/firefox/tinderbox-builds/mozilla-inbound-
> win64-pgo/1458149515/firefox-48.0a1.en-US.win64.zip

The issue still happens when I tried the linked build.

This is the stack I see on the js console when I hit the error...and the error text is "too much recursion".

EXTUTIL.Event.prototype.isListening()
Observable.js:460
EXTUTIL.Event.prototype.addListener()
Observable.js:410
EXTUTIL.Observable.prototype.addListener()
Observable.js:244
EXTUTIL.Observable.prototype.addListener()
Observable.js:235
EXTUTIL.Observable()
Observable.js:113
Ext.Component()
Component.js:275
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
Ext.extend</</sb<()
extoverride.js:19
Ext.extend</</sb<()
extoverride.js:19
Pan.appframework.modelview.PanRecordFormViewer<.constructor()
PanRecordFormViewer.js:18
Ext.extend</</sb<()
extoverride.js:19
Pan.monitor.log.CommonDetailedLogPropertyWidget<.constructor()
LogDetailWidget.js:50
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Pan.appframework.modelview.PanCompositeViewer<.recreatePortal()
PanCompositeViewer.js:98
Pan.appframework.modelview.PanCompositeViewer<.initComponent()
PanCompositeViewer.js:21
Pan.monitor.log.CommonDetailedLogCompositeViewer<.initComponent()
LogDetailComposite.js:30
Ext.Component()
Component.js:281
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
Pan.base.container.Container<.constructor()
Container.js:14
Ext.extend</</sb<()
extoverride.js:19
Ext.extend</</sb<()
extoverride.js:19
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Ext.Container<.createComponent()
Container.js:764
Ext.Container<.lookupComponent()
Container.js:752
Ext.Container<.add()
Container.js:565
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.add/<()
Container.js:561
.each()
ext-base-debug.js:445
Ext.Container<.add()
Container.js:560
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.initComponent()
Container.js:451
Ext.Container.prototype.initComponent<()
GridRecordField.js:221
util.createExtension/rv()
util.js:196
Ext.Component()
Component.js:281
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
Pan.base.container.Container<.constructor()
Container.js:14
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Ext.Container<.createComponent()
Container.js:764
Ext.Container<.lookupComponent()
Container.js:752
Ext.Container<.add()
Container.js:565
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.add/<()
Container.js:561
.each()
ext-base-debug.js:445
Ext.Container<.add()
Container.js:560
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.initComponent()
Container.js:451
Ext.Container.prototype.initComponent<()
GridRecordField.js:221
util.createExtension/rv()
util.js:196
Ext.Panel<.initComponent()
Panel.js:688
Ext.TabPanel<.initComponent()
TabPanel.js:259
Pan.base.container.TabPanel<.initComponent()
TabPanel.js:78
Ext.Component()
Component.js:281
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
util.cextend</</ctor()
util.js:275
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Ext.Container<.createComponent()
Container.js:764
Ext.Container<.lookupComponent()
Container.js:752
Ext.Container<.add()
Container.js:565
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.add/<()
Container.js:561
.each()
ext-base-debug.js:445
Ext.Container<.add()
Container.js:560
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.initComponent()
Container.js:451
Ext.Container.prototype.initComponent<()
GridRecordField.js:221
util.createExtension/rv()
util.js:196
Pan.monitor.log.DetailViewer<.initComponent()
LogDetailViewer.js:90
Ext.Component()
Component.js:281
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
Pan.base.container.Container<.constructor()
Container.js:14
Pan.monitor.log.DetailViewer<.constructor()
LogDetailViewer.js:87
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Ext.Container<.createComponent()
Container.js:764
Ext.Container<.lookupComponent()
Container.js:752
Ext.Container<.add()
Container.js:565
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.add/<()
Container.js:561
.each()
ext-base-debug.js:445
Ext.Container<.add()
Container.js:560
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.initComponent()
Container.js:451
Ext.Container.prototype.initComponent<()
GridRecordField.js:221
util.createExtension/rv()
util.js:196
Ext.Component()
Component.js:281
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
Pan.base.container.Container<.constructor()
Container.js:14
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Ext.Container<.createComponent()
Container.js:764
Ext.Container<.lookupComponent()
Container.js:752
Ext.Container<.add()
Container.js:565
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.add/<()
Container.js:561
.each()
ext-base-debug.js:445
Ext.Container<.add()
Container.js:560
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Ext.Container<.initComponent()
Container.js:451
Ext.Container.prototype.initComponent<()
GridRecordField.js:221
util.createExtension/rv()
util.js:196
Ext.Component()
Component.js:281
.extend</</sb<()
ext-base-debug.js:233
.extend</</sb<()
ext-base-debug.js:233
Pan.base.container.Container<.constructor()
Container.js:14
Ext.ComponentMgr</<.create()
ComponentMgr.js:131
Ext.Container<.createComponent()
Container.js:764
Ext.Container<.lookupComponent()
Container.js:752
Ext.Container<.add()
Container.js:565
Ext.Container.prototype.add<()
GridRecordField.js:237
util.createExtension/rv()
util.js:196
Flags: needinfo?(narayanan.vinod)
Also what is the recursion limit in 32 bit and 64 bit firefox? Just trying to get a sense of how drastically different it is. 

Also, this is happening not just in 1 page, but many pages in our UI (usually the more complex UIs where the stack could be longer than usual). The simple ones show up fine. On 32 bit no problem whatsoever. Thanks!
(In reply to Vinod Narayanan from comment #7)
> Also what is the recursion limit in 32 bit and 64 bit firefox? Just trying
> to get a sense of how drastically different it is. 

On Windows we get a 1 MB stack for both 32-bit and 64-bit builds, but 64-bit builds use more stack space (pointers are 8 bytes instead of 4, more volatile registers to save, etc.). 

I want to see if we can use a larger stack, like 4 MB, that's bug 1257234.
No longer blocks: 1257234
Depends on: 1257234
Would you mind trying the build below?

https://archive.mozilla.org/pub/firefox/tinderbox-builds/mozilla-central-win64-pgo/1458408680/firefox-48.0a1.en-US.win64.zip

That should have the patch for bug 1257234, to use a 2 MB stack limit instead of 1 MB.
Flags: needinfo?(narayanan.vinod)
(In reply to Jan de Mooij [:jandem] from comment #9)
> Would you mind trying the build below?
> 
> https://archive.mozilla.org/pub/firefox/tinderbox-builds/mozilla-central-
> win64-pgo/1458408680/firefox-48.0a1.en-US.win64.zip
> 
> That should have the patch for bug 1257234, to use a 2 MB stack limit
> instead of 1 MB.

Thanks guys. It seems to work fine with the build in the link. Could I know which official build this fix would go in.
Flags: needinfo?(narayanan.vinod)
(In reply to Vinod Narayanan from comment #10)
> Thanks guys. It seems to work fine with the build in the link. Could I know
> which official build this fix would go in.

The fix is currently in Firefox 48. I want to get it in Firefox 46 (beta) and 47 (aurora) too, but that decision is up to our release managers. See bug 1257234.
Status: UNCONFIRMED → RESOLVED
Closed: 7 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.