Bug 209222 - Stack overflow in TypeHierarchyPerfTest
Summary: Stack overflow in TypeHierarchyPerfTest
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.3   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.4 M4   Edit
Assignee: Jerome Lanneluc CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-11-08 12:39 EST by Benno Baumgartner CLA
Modified: 2008-05-29 06:29 EDT (History)
5 users (show)

See Also:


Attachments
Naive patch (1.02 KB, patch)
2007-11-13 04:14 EST, Frederic Fusier CLA
no flags Details | Diff
Proposed fix and regression test (2.96 KB, patch)
2007-11-15 04:37 EST, Jerome Lanneluc CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Benno Baumgartner CLA 2007-11-08 12:39:20 EST
I20071107-1300

Run org.eclipse.jdt.ui.tests.performance.views.TypeHierarchyPerfTest with -consolelog. Also an error dialog opens and the test DNF.

Is:
java.lang.reflect.InvocationTargetException
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:350)
	at org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:758)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
	at org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:755)
	at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2451)
	at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.ensureRefreshedTypeHierarchy(TypeHierarchyLifeCycle.java:107)
	at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyViewPart.updateInput(TypeHierarchyViewPart.java:520)
	at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyViewPart.setInputElement(TypeHierarchyViewPart.java:483)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.openInViewPart(OpenTypeHierarchyUtil.java:96)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.open(OpenTypeHierarchyUtil.java:73)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.open(OpenTypeHierarchyUtil.java:50)
	at org.eclipse.jdt.ui.tests.performance.views.TypeHierarchyPerfTest.measureOpenHierarchy(TypeHierarchyPerfTest.java:88)
	at org.eclipse.jdt.ui.tests.performance.views.TypeHierarchyPerfTest.testOpenObjectHierarchy(TypeHierarchyPerfTest.java:69)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at junit.framework.TestCase.runTest(TestCase.java:164)
	at junit.framework.TestCase.runBare(TestCase.java:130)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
	at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.extensions.TestSetup.run(TestSetup.java:25)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:58)
	at org.eclipse.pde.internal.junit.runtime.UITestApplication$1.run(UITestApplication.java:122)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:130)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3721)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3358)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2395)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2359)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2225)
	at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:468)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:463)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106)
	at org.eclipse.pde.internal.junit.runtime.UITestApplication.start(UITestApplication.java:52)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:362)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:175)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:515)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:455)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1193)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1169)
Caused by: java.lang.StackOverflowError
Root exception:
java.lang.StackOverflowError
Comment 1 Martin Aeschlimann CLA 2007-11-12 12:33:37 EST
The rest of the stacktrace is:

Caused by: java.lang.StackOverflowError
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1069)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1069)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1069)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1069)
	at 
....

	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1069)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1069)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectSuperclass(ClassScope.java:840)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectTypeHierarchyWithoutMembers(ClassScope.java:1005)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1111)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1025)
	at org.eclipse.jdt.internal.compiler.ast.SingleTypeReference.getTypeBinding(SingleTypeReference.java:47)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:163)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveSuperType(TypeReference.java:114)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.findSupertype(ClassScope.java:1125)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectSuperclass(ClassScope.java:843)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectTypeHierarchyWithoutMembers(ClassScope.java:1005)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1111)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.detectHierarchyCycle(ClassScope.java:1025)
	at org.eclipse.jdt.internal.compiler.ast.SingleTypeReference.getTypeBinding(SingleTypeReference.java:47)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:163)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveSuperType(TypeReference.java:114)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.findSupertype(ClassScope.java:1125)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectSuperclass(ClassScope.java:843)
	at org.eclipse.jdt.internal.compiler.lookup.ClassScope.connectTypeHierarchy(ClassScope.java:968)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.connectTypeHierarchy(CompilationUnitScope.java:290)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.completeTypeBindings(LookupEnvironment.java:276)
	at org.eclipse.jdt.internal.core.hierarchy.HierarchyResolver.resolve(HierarchyResolver.java:718)
	at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.buildForProject(IndexBasedHierarchyBuilder.java:226)
	at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.buildFromPotentialSubtypes(IndexBasedHierarchyBuilder.java:328)
	at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.build(IndexBasedHierarchyBuilder.java:131)
	at org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.compute(TypeHierarchy.java:300)
	at org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.refresh(TypeHierarchy.java:1241)
	at org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation.executeOperation(CreateTypeHierarchyOperation.java:90)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:780)
	at org.eclipse.jdt.internal.core.BinaryType.newTypeHierarchy(BinaryType.java:863)
	at org.eclipse.jdt.internal.core.BinaryType.newTypeHierarchy(BinaryType.java:882)
	at org.eclipse.jdt.internal.core.BinaryType.newTypeHierarchy(BinaryType.java:852)
	at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.createTypeHierarchy(TypeHierarchyLifeCycle.java:118)
Comment 2 Frederic Fusier CLA 2007-11-13 04:14:58 EST
Created attachment 82739 [details]
Naive patch

It seems that HierarchyBinaryType superclass should be null for 'java.lang.Object' as already done for bindings and dom. Fixing this makes the StackOverflow vanishing but not sure it will be the real solution for this issue.

Unfortunately I was unable to reproduce the StackOverflow exception in a real workspace and so had no chance to find the exact reason why this happens for the JDT/UI JUnit perf test... It explains why I didn't have any specific test case for this fix and make me doubt about it!
Comment 3 Benno Baumgartner CLA 2007-11-13 05:52:05 EST
(In reply to comment #2)
> Unfortunately I was unable to reproduce the StackOverflow exception in a real
> workspace

Neither am I able to reproduce it in a real workspace.
Comment 4 Jerome Lanneluc CLA 2007-11-15 04:37:20 EST
Created attachment 82950 [details]
Proposed fix and regression test

Problem can be reproduced only if javaProject.findType("java.lang.Object") is called before creating the hierarchy (which doesn't happen if using the UI only). In this case, the internal jar type cache is filled but the corresponding IClassFile is not opened. As a consequence we use a HierarchyBinaryType for Object which causes the infinite recursion.
Fix consists in using the ClassFileReader cached in the jar type cache. HierarchyBinaryType still has a potential problem but it will never be used for Object.
Comment 5 Jerome Lanneluc CLA 2007-11-15 10:29:47 EST
Fix and test released for 3.4M4
Comment 6 Maxime Daniel CLA 2007-12-12 03:37:53 EST
testFindObject does not fail for I20071211-0010 (expected), but it does not fail either for I20071107-1300 (unexpected). Jérôme, any comments?
Comment 7 Jerome Lanneluc CLA 2007-12-12 05:44:10 EST
Released a new version of the test that fails in all conditions without the fix.
Comment 8 Maxime Daniel CLA 2007-12-12 08:49:46 EST
Verified for 3.4 M4 using build I20071211-0010.
(We now have a test that fails with I20071107-1300 and succeeds with I20071211-0010, which failure is convincingly close enough to the reported one, hence I assume everything is now OK.)