diff --git a/src/vs/base/common/eventEmitter.ts b/src/vs/base/common/eventEmitter.ts index e81fdafdcf03..6244c03be62f 100644 --- a/src/vs/base/common/eventEmitter.ts +++ b/src/vs/base/common/eventEmitter.ts @@ -237,11 +237,7 @@ export class EventEmitter implements IEventEmitter { if (this._listeners.hasOwnProperty(eventType)) { var listeners = this._listeners[eventType].slice(0); for (var i = 0, len = listeners.length; i < len; i++) { - try { - listeners[i](data); - } catch(e) { - Errors.onUnexpectedError(e); - } + safeInvoke1Arg(listeners[i], data); } } } @@ -249,11 +245,7 @@ export class EventEmitter implements IEventEmitter { protected _emitToBulkListeners(events:EmitterEvent[]): void { var bulkListeners = this._bulkListeners.slice(0); for (var i = 0, len = bulkListeners.length; i < len; i++) { - try { - bulkListeners[i](events); - } catch(e) { - Errors.onUnexpectedError(e); - } + safeInvoke1Arg(bulkListeners[i], events); } } @@ -291,12 +283,7 @@ export class EventEmitter implements IEventEmitter { public deferredEmit(callback:()=>any):any { this._deferredCnt = this._deferredCnt + 1; - var result: any = null; - try { - result = callback(); - } catch (e) { - Errors.onUnexpectedError(e); - } + var result: any = safeInvokeNoArg(callback); this._deferredCnt = this._deferredCnt - 1; if (this._deferredCnt === 0) { @@ -359,11 +346,23 @@ export class OrderGuaranteeEventEmitter extends EventEmitter { while (this._emitQueue.length > 0) { let queueElement = this._emitQueue.shift(); - try { - queueElement.target(queueElement.arg); - } catch(e) { - Errors.onUnexpectedError(e); - } + safeInvoke1Arg(queueElement.target, queueElement.arg); } } } + +function safeInvokeNoArg(func:Function): any { + try { + return func(); + } catch(e) { + Errors.onUnexpectedError(e); + } +} + +function safeInvoke1Arg(func:Function, arg1:any): any { + try { + return func(arg1); + } catch(e) { + Errors.onUnexpectedError(e); + } +} diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index da98c6963513..7cb2c456698a 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -683,12 +683,7 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp } }; - var r: any = null; - try { - r = callback(changeAccessor); - } catch (e) { - onUnexpectedError(e); - } + var r: any = safeInvoke1Arg(callback, changeAccessor); // Invalidate changeAccessor changeAccessor.addZone = null; @@ -799,12 +794,8 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp throw new Error('ViewImpl._renderOnce: View is disposed'); } return this.outgoingEventBus.deferredEmit(() => { - try { - var r = callback ? callback() : null; - } finally { - this._scheduleRender(); - } - + let r = safeInvokeNoArg(callback); + this._scheduleRender(); return r; }); } @@ -824,10 +815,7 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp } private _renderNow(): void { - if (this._isDisposed) { - throw new Error('ViewImpl._renderNow: View is disposed'); - } - this.actualRender(); + safeInvokeNoArg(() => this._actualRender()); } private createRenderingContext(linesViewportData:editorCommon.ViewLinesViewportData): editorBrowser.IRenderingContext { @@ -880,45 +868,45 @@ export class View extends ViewEventHandler implements editorBrowser.IView, IDisp return r; } - private actualRender(): void { - if (this._isDisposed) { - throw new Error('ViewImpl.actualRender: View is disposed'); - } + private _actualRender(): void { if (!dom.isInDOM(this.domNode)) { return; } + let t = timer.start(timer.Topic.EDITOR, 'View.render'); - var t = timer.start(timer.Topic.EDITOR, 'View.render'); - - let viewPartsToRender = this.viewParts.filter((vp) => vp.shouldRender()); - var i:number, - len:number; - - try { - - var linesViewportData = this.layoutProvider.getLinesViewportData(); - - if (this.viewLines.shouldRender()) { - this.viewLines.renderText(linesViewportData); - this.viewLines.onDidRender(); + let viewPartsToRender:ViewPart[] = []; + for (let i = 0, len = this.viewParts.length; i < len; i++) { + let viewPart = this.viewParts[i]; + if (viewPart.shouldRender()) { + viewPartsToRender.push(viewPart); } + } - var renderingContext = this.createRenderingContext(linesViewportData); - // Render the rest of the parts - for (i = 0, len = viewPartsToRender.length; i < len; i++) { - viewPartsToRender[i].prepareRender(renderingContext); - } + if (!this.viewLines.shouldRender() && viewPartsToRender.length === 0) { + // Nothing to render + t.stop(); + return; + } - for (i = 0, len = viewPartsToRender.length; i < len; i++) { - viewPartsToRender[i].render(renderingContext); - } + let linesViewportData = this.layoutProvider.getLinesViewportData(); - for (i = 0, len = viewPartsToRender.length; i < len; i++) { - viewPartsToRender[i].onDidRender(); - } + if (this.viewLines.shouldRender()) { + this.viewLines.renderText(linesViewportData); + this.viewLines.onDidRender(); + } - } catch (err) { - onUnexpectedError(err); + let renderingContext = this.createRenderingContext(linesViewportData); + + // Render the rest of the parts + for (let i = 0, len = viewPartsToRender.length; i < len; i++) { + let viewPart = viewPartsToRender[i]; + viewPart.prepareRender(renderingContext); + } + + for (let i = 0, len = viewPartsToRender.length; i < len; i++) { + let viewPart = viewPartsToRender[i]; + viewPart.render(renderingContext); + viewPart.onDidRender(); } t.stop(); @@ -957,4 +945,20 @@ class ViewContext implements editorBrowser.IViewContext { this.addEventHandler = addEventHandler; this.removeEventHandler = removeEventHandler; } -} \ No newline at end of file +} + +function safeInvokeNoArg(func:Function): any { + try { + return func(); + } catch(e) { + onUnexpectedError(e); + } +} + +function safeInvoke1Arg(func:Function, arg1:any): any { + try { + return func(arg1); + } catch(e) { + onUnexpectedError(e); + } +}