@@ -58,7 +58,7 @@ function addErrorStack(lines: string[], error: Error): void {
58
58
}
59
59
60
60
function renderLongStackTrace ( frames : LongStackTrace [ ] , stack : string ) : string {
61
- const longTrace : string [ ] = [ stack . trim ( ) ] ;
61
+ const longTrace : string [ ] = [ stack ? stack . trim ( ) : '' ] ;
62
62
63
63
if ( frames ) {
64
64
let timestamp = new Date ( ) . getTime ( ) ;
@@ -97,26 +97,38 @@ function renderLongStackTrace(frames: LongStackTrace[], stack: string): string {
97
97
98
98
onScheduleTask : function (
99
99
parentZoneDelegate : ZoneDelegate , currentZone : Zone , targetZone : Zone , task : Task ) : any {
100
- const currentTask = Zone . currentTask ;
101
- let trace = currentTask && currentTask . data && ( currentTask . data as any ) [ creationTrace ] || [ ] ;
102
- trace = [ new LongStackTrace ( ) ] . concat ( trace ) ;
103
- if ( trace . length > this . longStackTraceLimit ) {
104
- trace . length = this . longStackTraceLimit ;
100
+ if ( Error . stackTraceLimit > 0 ) {
101
+ // if Error.stackTraceLimit is 0, means stack trace
102
+ // is disabled, so we don't need to generate long stack trace
103
+ // this will improve performance in some test(some test will
104
+ // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
105
+ const currentTask = Zone . currentTask ;
106
+ let trace = currentTask && currentTask . data && ( currentTask . data as any ) [ creationTrace ] || [ ] ;
107
+ trace = [ new LongStackTrace ( ) ] . concat ( trace ) ;
108
+ if ( trace . length > this . longStackTraceLimit ) {
109
+ trace . length = this . longStackTraceLimit ;
110
+ }
111
+ if ( ! task . data ) task . data = { } ;
112
+ ( task . data as any ) [ creationTrace ] = trace ;
105
113
}
106
- if ( ! task . data ) task . data = { } ;
107
- ( task . data as any ) [ creationTrace ] = trace ;
108
114
return parentZoneDelegate . scheduleTask ( targetZone , task ) ;
109
115
} ,
110
116
111
117
onHandleError : function (
112
118
parentZoneDelegate : ZoneDelegate , currentZone : Zone , targetZone : Zone , error : any ) : boolean {
113
- const parentTask = Zone . currentTask || error . task ;
114
- if ( error instanceof Error && parentTask ) {
115
- const longStack =
116
- renderLongStackTrace ( parentTask . data && parentTask . data [ creationTrace ] , error . stack ) ;
117
- try {
118
- error . stack = ( error as any ) . longStack = longStack ;
119
- } catch ( err ) {
119
+ if ( Error . stackTraceLimit > 0 ) {
120
+ // if Error.stackTraceLimit is 0, means stack trace
121
+ // is disabled, so we don't need to generate long stack trace
122
+ // this will improve performance in some test(some test will
123
+ // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
124
+ const parentTask = Zone . currentTask || error . task ;
125
+ if ( error instanceof Error && parentTask ) {
126
+ const longStack =
127
+ renderLongStackTrace ( parentTask . data && parentTask . data [ creationTrace ] , error . stack ) ;
128
+ try {
129
+ error . stack = ( error as any ) . longStack = longStack ;
130
+ } catch ( err ) {
131
+ }
120
132
}
121
133
}
122
134
return parentZoneDelegate . handleError ( targetZone , error ) ;
@@ -131,6 +143,9 @@ function captureStackTraces(stackTraces: string[][], count: number): void {
131
143
}
132
144
133
145
function computeIgnoreFrames ( ) {
146
+ if ( Error . stackTraceLimit <= 0 ) {
147
+ return ;
148
+ }
134
149
const frames : string [ ] [ ] = [ ] ;
135
150
captureStackTraces ( frames , 2 ) ;
136
151
const frames1 = frames [ 0 ] ;
0 commit comments