@@ -65,12 +65,15 @@ abstract class ErrorHandler {
65
65
const mainThreadErrors = rpcService . getProxy ( MainContext . MainThreadErrors ) ;
66
66
67
67
const map = await extensionService . getExtensionPathIndex ( ) ;
68
- const extensionErrors = new WeakMap < Error , ExtensionIdentifier | undefined > ( ) ;
68
+ const extensionErrors = new WeakMap < Error , { extensionIdentifier : ExtensionIdentifier | undefined ; stack : string } > ( ) ;
69
69
70
70
// PART 1
71
71
// set the prepareStackTrace-handle and use it as a side-effect to associate errors
72
72
// with extensions - this works by looking up callsites in the extension path index
73
73
function prepareStackTraceAndFindExtension ( error : Error , stackTrace : errors . V8CallSite [ ] ) {
74
+ if ( extensionErrors . has ( error ) ) {
75
+ return extensionErrors . get ( error ) ! . stack ;
76
+ }
74
77
let stackTraceMessage = '' ;
75
78
let extension : IExtensionDescription | undefined ;
76
79
let fileName : string | null ;
@@ -81,20 +84,21 @@ abstract class ErrorHandler {
81
84
extension = map . findSubstr ( URI . file ( fileName ) ) ;
82
85
}
83
86
}
84
- extensionErrors . set ( error , extension ?. identifier ) ;
85
- return `${ error . name || 'Error' } : ${ error . message || '' } ${ stackTraceMessage } ` ;
87
+ const result = `${ error . name || 'Error' } : ${ error . message || '' } ${ stackTraceMessage } ` ;
88
+ extensionErrors . set ( error , { extensionIdentifier : extension ?. identifier , stack : result } ) ;
89
+ return result ;
86
90
}
87
91
88
- const _wasWrapped = Symbol ( 'prepareStackTrace wrapped' ) ;
89
92
let _prepareStackTrace = prepareStackTraceAndFindExtension ;
90
- Object . assign ( _prepareStackTrace , { [ _wasWrapped ] : true } ) ;
93
+
91
94
Object . defineProperty ( Error , 'prepareStackTrace' , {
92
95
configurable : false ,
93
96
get ( ) {
94
97
return _prepareStackTrace ;
95
98
} ,
96
99
set ( v ) {
97
- if ( v && ( v as any ) [ _wasWrapped ] ) {
100
+ if ( v === prepareStackTraceAndFindExtension ) {
101
+ // back to default
98
102
_prepareStackTrace = v ;
99
103
return ;
100
104
}
@@ -103,8 +107,6 @@ abstract class ErrorHandler {
103
107
prepareStackTraceAndFindExtension ( error , stackTrace ) ;
104
108
return v . call ( Error , error , stackTrace ) ;
105
109
} ;
106
-
107
- Object . assign ( _prepareStackTrace , { [ _wasWrapped ] : true } ) ;
108
110
} ,
109
111
} ) ;
110
112
@@ -115,16 +117,16 @@ abstract class ErrorHandler {
115
117
errors . setUnexpectedErrorHandler ( err => {
116
118
logService . error ( err ) ;
117
119
118
- const data = errors . transformErrorForSerialization ( err ) ;
119
- const extension = extensionErrors . get ( err ) ;
120
- if ( ! extension ) {
121
- mainThreadErrors . $onUnexpectedError ( data ) ;
120
+ const errorData = errors . transformErrorForSerialization ( err ) ;
121
+ const stackData = extensionErrors . get ( err ) ;
122
+ if ( ! stackData ?. extensionIdentifier ) {
123
+ mainThreadErrors . $onUnexpectedError ( errorData ) ;
122
124
return ;
123
125
}
124
126
125
- mainThreadExtensions . $onExtensionRuntimeError ( extension , data ) ;
126
- const reported = extensionTelemetry . onExtensionError ( extension , err ) ;
127
- logService . trace ( 'forwarded error to extension?' , reported , extension ) ;
127
+ mainThreadExtensions . $onExtensionRuntimeError ( stackData . extensionIdentifier , errorData ) ;
128
+ const reported = extensionTelemetry . onExtensionError ( stackData . extensionIdentifier , err ) ;
129
+ logService . trace ( 'forwarded error to extension?' , reported , stackData ) ;
128
130
} ) ;
129
131
}
130
132
}
0 commit comments