Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 258114 - NPE in TextLayout
Summary: NPE in TextLayout
Status: RESOLVED FIXED
Alias: None
Product: Platform
Classification: Eclipse Project
Component: Compare (show other bugs)
Version: 3.5   Edit
Hardware: PC Mac OS X
: P3 normal (vote)
Target Milestone: 3.5 M4   Edit
Assignee: Platform-Compare-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-12-09 11:18 EST by Kevin Barnes CLA
Modified: 2008-12-10 12:44 EST (History)
6 users (show)

See Also:


Attachments
patch (1.33 KB, patch)
2008-12-10 12:40 EST, Boris Bokowski CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Kevin Barnes CLA 2008-12-09 11:18:28 EST
From my error log. Don't know how to reproduce.



java.lang.NullPointerException
	at org.eclipse.swt.graphics.TextLayout.computeRuns(TextLayout.java:202)
	at org.eclipse.swt.graphics.TextLayout.getLineCount(TextLayout.java:916)
	at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:947)
	at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:702)
	at org.eclipse.swt.custom.StyledText.getPointAtOffset(StyledText.java:5210)
	at org.eclipse.swt.custom.StyledText.getLocationAtOffset(StyledText.java:4171)
	at org.eclipse.jface.text.CursorLinePainter.drawHighlightLine(CursorLinePainter.java:177)
	at org.eclipse.jface.text.CursorLinePainter.deactivate(CursorLinePainter.java:195)
	at org.eclipse.jface.text.PaintManager.removePainter(PaintManager.java:214)
	at org.eclipse.jface.text.TextViewer.removePainter(TextViewer.java:4902)
	at org.eclipse.ui.texteditor.SourceViewerDecorationSupport.hideCursorLine(SourceViewerDecorationSupport.java:710)
	at org.eclipse.ui.texteditor.SourceViewerDecorationSupport.updateTextDecorations(SourceViewerDecorationSupport.java:306)
	at org.eclipse.ui.texteditor.SourceViewerDecorationSupport.dispose(SourceViewerDecorationSupport.java:387)
	at org.eclipse.compare.contentmergeviewer.TextMergeViewer.handleDispose(TextMergeViewer.java:1746)
	at org.eclipse.jdt.internal.ui.compare.JavaMergeViewer.handleDispose(JavaMergeViewer.java:81)
	at org.eclipse.jface.viewers.ContentViewer$2.widgetDisposed(ContentViewer.java:214)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:117)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1119)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1143)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1124)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:984)
	at org.eclipse.swt.widgets.Control.release(Control.java:2059)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:729)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:987)
	at org.eclipse.swt.widgets.Control.release(Control.java:2059)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:729)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:987)
	at org.eclipse.swt.widgets.Control.release(Control.java:2059)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:729)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:987)
	at org.eclipse.swt.widgets.Control.release(Control.java:2059)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:729)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:987)
	at org.eclipse.swt.widgets.Control.release(Control.java:2059)
	at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:729)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:987)
	at org.eclipse.swt.widgets.Control.release(Control.java:2059)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:490)
	at org.eclipse.ui.internal.PartPane.dispose(PartPane.java:180)
	at org.eclipse.ui.internal.WorkbenchPartReference.dispose(WorkbenchPartReference.java:681)
	at org.eclipse.ui.internal.WorkbenchPage.disposePart(WorkbenchPage.java:1683)
	at org.eclipse.ui.internal.WorkbenchPage.handleDeferredEvents(WorkbenchPage.java:1390)
	at org.eclipse.ui.internal.WorkbenchPage.deferUpdates(WorkbenchPage.java:1374)
	at org.eclipse.ui.internal.WorkbenchPage.closeEditors(WorkbenchPage.java:1348)
	at org.eclipse.ui.internal.WorkbenchPage.closeEditor(WorkbenchPage.java:1403)
	at org.eclipse.ui.internal.EditorPane.doHide(EditorPane.java:61)
	at org.eclipse.ui.internal.PartStack.close(PartStack.java:543)
	at org.eclipse.ui.internal.EditorStack.close(EditorStack.java:206)
	at org.eclipse.ui.internal.PartStack$1.close(PartStack.java:122)
	at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:83)
	at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:267)
	at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:276)
	at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1)
	at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$1.closeButtonPressed(DefaultTabFolder.java:70)
	at org.eclipse.ui.internal.presentations.PaneFolder.notifyCloseListeners(PaneFolder.java:626)
	at org.eclipse.ui.internal.presentations.PaneFolder$3.close(PaneFolder.java:206)
	at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:2188)
	at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:328)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1119)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1143)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1128)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:955)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2937)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2672)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2384)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2348)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:495)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:333)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:490)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:366)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
	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:585)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:550)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:505)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1237)
Comment 1 Grant Gayed CLA 2008-12-09 11:24:04 EST
I think this is the one I saw yesterday, if so then I have a case that's currently reproducable.
Comment 2 Felipe Heidrich CLA 2008-12-09 12:44:52 EST
201:if (background != null) {
202:	NSColor color = NSColor.colorWithDeviceRed(background.handle[0], background.handle[1], background.handle[2], 1);
203:	attrStr.addAttribute(OS.NSBackgroundColorAttributeName, color, range);
2:04}


Interesting, only background can be null in line 202, but in line 201 it checks background != null. So, or I have the wrong source, or a bug in the VM, or I'm missing something very simple...

Comment 3 Grant Gayed CLA 2008-12-09 12:49:37 EST
Could background.handle be the guy that's null?
Comment 4 Felipe Heidrich CLA 2008-12-09 12:55:15 EST
(In reply to comment #3)
> Could background.handle be the guy that's null?

Hmmm, yes. It means the color is disposed. Thus, this is a bug in the application code. If that is case we should see this problem in all platforms.
Comment 5 Felipe Heidrich CLA 2008-12-09 16:09:58 EST
in
JavaMergeViewer(TextMergeViewer).handleDispose(DisposeEvent) line: 1725
the color (RGB=216;216;216) gets disposed
and here it gets used again:

TextLayout.computeRuns() line: 203	
TextLayout.getLineCount() line: 920	
StyledTextRenderer.getTextLayout(int, int, int, int) line: 947	
StyledTextRenderer.getTextLayout(int) line: 702	
StyledText.getPointAtOffset(int) line: 5206	
StyledText.getLocationAtOffset(int) line: 4167	
CursorLinePainter.drawHighlightLine(Position) line: 177	
CursorLinePainter.deactivate(boolean) line: 195	
PaintManager.removePainter(IPainter) line: 214	
MergeSourceViewer(TextViewer).removePainter(IPainter) line: 4902
SourceViewerDecorationSupport.hideCursorLine() line: 710	
SourceViewerDecorationSupport.updateTextDecorations() line: 306
SourceViewerDecorationSupport.dispose() line: 387	
JavaMergeViewer(TextMergeViewer).handleDispose(DisposeEvent) line: 1746
Comment 6 Scott Kovatch CLA 2008-12-09 16:12:03 EST
Not 64-bit related. I see this as well on 32-bit when moving from file to file in the Team Synchronize perspective.
Comment 7 Felipe Heidrich CLA 2008-12-09 16:12:15 EST
As a fix, in TextMergeViewer.handleDispose(), can the loop that disposes the colors be done last ?
Comment 8 Szymon Brandys CLA 2008-12-10 07:50:32 EST
(In reply to comment #1)
> I think this is the one I saw yesterday, if so then I have a case that's
> currently reproducable.

Grant, what are the steps?

(In reply to comment #7)
> As a fix, in TextMergeViewer.handleDispose(), can the loop that disposes the
> colors be done last ?

Sure we can try that, however I would like to see the steps to test this fix.

Comment 9 Grant Gayed CLA 2008-12-10 10:48:34 EST
The exact steps I see this with are:

- retrieve the org.eclipse.swt project into your workspace as described in http://www.eclipse.org/swt/cvs.php (it's not necessary to do the renaming of .classpath_* step)
- apply the following patch to the project: https://bugs.eclipse.org/bugs/attachment.cgi?id=119740
- select the project, right-click, Team > Synchronize with Repository
- in the resulting Team Synchronizing perspective:
  -> select the Outgoing Mode tool item
  -> select the project, right-click, Expand All (reveals 4 classes)
  -> double-click to view the classes in the following order:
     - NSWindow.java
     - OS.java
     - Button.java
     - Widget.java <-- causes NPE
Comment 10 Felipe Heidrich CLA 2008-12-10 11:15:54 EST
Note that in windows you won't see this bug (disposed colors on windows don't have null fields). you'll need mac.
Comment 11 Felipe Heidrich CLA 2008-12-10 12:00:32 EST
We believe this should be fixed for 3.5 M4.  Let me know if you need help testing the code (in case you don't have a mac).
Comment 12 Boris Bokowski CLA 2008-12-10 12:40:32 EST
Created attachment 120083 [details]
patch
Comment 13 Boris Bokowski CLA 2008-12-10 12:41:22 EST
This patch solves the problem. Tested on a Mac using Cocoa.
Comment 14 Tomasz Zarna CLA 2008-12-10 12:44:12 EST
Released to HEAD. Thanks guys!