Community
Participate
Working Groups
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)
I think this is the one I saw yesterday, if so then I have a case that's currently reproducable.
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...
Could background.handle be the guy that's null?
(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.
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
Not 64-bit related. I see this as well on 32-bit when moving from file to file in the Team Synchronize perspective.
As a fix, in TextMergeViewer.handleDispose(), can the loop that disposes the colors be done last ?
(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.
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
Note that in windows you won't see this bug (disposed colors on windows don't have null fields). you'll need mac.
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).
Created attachment 120083 [details] patch
This patch solves the problem. Tested on a Mac using Cocoa.
Released to HEAD. Thanks guys!