11using System ;
2+ using System . Text ;
23
34using IOriginalCallable = Jint . Native . ICallable ;
45using OriginalJsEngine = Jint . Engine ;
56using OriginalJsException = Jint . Runtime . JavaScriptException ;
67using OriginalJsValue = Jint . Native . JsValue ;
78using OriginalObjectInstance = Jint . Native . Object . ObjectInstance ;
89using OriginalParserException = Jint . Parser . ParserException ;
10+ using OriginalParserOptions = Jint . Parser . ParserOptions ;
911using OriginalRecursionDepthOverflowException = Jint . Runtime . RecursionDepthOverflowException ;
1012using OriginalStatementsCountOverflowException = Jint . Runtime . StatementsCountOverflowException ;
1113using OriginalTypeReference = Jint . Runtime . Interop . TypeReference ;
@@ -137,18 +139,23 @@ private object MapToHostType(OriginalJsValue value)
137139 private JsRuntimeException ConvertParserExceptionToJsRuntimeException (
138140 OriginalParserException jsParserException )
139141 {
140- string message = jsParserException . Description ;
141- if ( string . IsNullOrWhiteSpace ( message ) )
142- {
143- message = jsParserException . Message ;
144- }
142+ const string category = "ParserError" ;
143+ string description = jsParserException . Description ;
144+ int lineNumber = jsParserException . LineNumber ;
145+ int columnNumber = jsParserException . Column ;
146+ string message = ! string . IsNullOrWhiteSpace ( description ) ?
147+ GenerateErorrMessageWithStackTrace ( category , description , jsParserException . Source ,
148+ lineNumber , columnNumber )
149+ :
150+ jsParserException . Message
151+ ;
145152
146153 var jsRuntimeException = new JsRuntimeException ( message , EngineName , EngineVersion ,
147154 jsParserException )
148155 {
149- Category = "ParserError" ,
150- LineNumber = jsParserException . LineNumber ,
151- ColumnNumber = jsParserException . Column
156+ Category = category ,
157+ LineNumber = lineNumber ,
158+ ColumnNumber = columnNumber
152159 } ;
153160
154161 return jsRuntimeException ;
@@ -158,6 +165,9 @@ private JsRuntimeException ConvertJavaScriptExceptionToJsRuntimeException(
158165 OriginalJsException jsException )
159166 {
160167 string category = string . Empty ;
168+ int lineNumber = jsException . LineNumber ;
169+ int columnNumber = jsException . Column ;
170+ string message = jsException . Message ;
161171 OriginalJsValue errorValue = jsException . Error ;
162172
163173 if ( errorValue . IsObject ( ) )
@@ -169,19 +179,51 @@ private JsRuntimeException ConvertJavaScriptExceptionToJsRuntimeException(
169179 {
170180 category = categoryPropertyValue . AsString ( ) ;
171181 }
182+
183+ message = GenerateErorrMessageWithStackTrace ( category , message ,
184+ jsException . Location . Source , lineNumber , columnNumber ) ;
172185 }
173186
174- var jsRuntimeException = new JsRuntimeException ( jsException . Message , EngineName , EngineVersion ,
187+ var jsRuntimeException = new JsRuntimeException ( message , EngineName , EngineVersion ,
175188 jsException )
176189 {
177190 Category = category ,
178- LineNumber = jsException . LineNumber ,
179- ColumnNumber = jsException . Column
191+ LineNumber = lineNumber ,
192+ ColumnNumber = columnNumber
180193 } ;
181194
182195 return jsRuntimeException ;
183196 }
184197
198+ private static string GenerateErorrMessageWithStackTrace ( string category , string message ,
199+ string documentName , int lineNumber , int columnNumber )
200+ {
201+ var messageBuilder = new StringBuilder ( ) ;
202+ if ( ! string . IsNullOrWhiteSpace ( category ) )
203+ {
204+ messageBuilder . AppendFormat ( "{0}: " , category ) ;
205+ }
206+ messageBuilder . Append ( message ) ;
207+ if ( ! string . IsNullOrWhiteSpace ( documentName ) )
208+ {
209+ messageBuilder . AppendLine ( ) ;
210+ messageBuilder . AppendFormat ( " at {0}" , documentName ) ;
211+ if ( lineNumber > 0 )
212+ {
213+ messageBuilder . AppendFormat ( ":{0}" , lineNumber ) ;
214+ if ( columnNumber > 0 )
215+ {
216+ messageBuilder . AppendFormat ( ":{0}" , columnNumber ) ;
217+ }
218+ }
219+ }
220+
221+ string errorMessage = messageBuilder . ToString ( ) ;
222+ messageBuilder . Clear ( ) ;
223+
224+ return errorMessage ;
225+ }
226+
185227 private JsRuntimeException ConvertRecursionDepthOverflowExceptionToJsRuntimeException (
186228 OriginalRecursionDepthOverflowException jsRecursionException )
187229 {
@@ -224,6 +266,11 @@ private JsRuntimeException ConvertTimeoutExceptionToJsRuntimeException(
224266 }
225267
226268 protected override object InnerEvaluate ( string expression )
269+ {
270+ return InnerEvaluate ( expression , null ) ;
271+ }
272+
273+ protected override object InnerEvaluate ( string expression , string documentName )
227274 {
228275 object result ;
229276
@@ -233,7 +280,11 @@ protected override object InnerEvaluate(string expression)
233280
234281 try
235282 {
236- resultValue = _jsEngine . Execute ( expression ) . GetCompletionValue ( ) ;
283+ var parserOptions = new OriginalParserOptions
284+ {
285+ Source = documentName
286+ } ;
287+ resultValue = _jsEngine . Execute ( expression , parserOptions ) . GetCompletionValue ( ) ;
237288 }
238289 catch ( OriginalParserException e )
239290 {
@@ -264,18 +315,32 @@ protected override object InnerEvaluate(string expression)
264315
265316 protected override T InnerEvaluate < T > ( string expression )
266317 {
267- object result = InnerEvaluate ( expression ) ;
318+ return InnerEvaluate < T > ( expression , null ) ;
319+ }
320+
321+ protected override T InnerEvaluate < T > ( string expression , string documentName )
322+ {
323+ object result = InnerEvaluate ( expression , documentName ) ;
268324
269325 return TypeConverter . ConvertToType < T > ( result ) ;
270326 }
271327
272328 protected override void InnerExecute ( string code )
329+ {
330+ InnerExecute ( code , null ) ;
331+ }
332+
333+ protected override void InnerExecute ( string code , string documentName )
273334 {
274335 lock ( _executionSynchronizer )
275336 {
276337 try
277338 {
278- _jsEngine . Execute ( code ) ;
339+ var parserOptions = new OriginalParserOptions
340+ {
341+ Source = documentName
342+ } ;
343+ _jsEngine . Execute ( code , parserOptions ) ;
279344 }
280345 catch ( OriginalParserException e )
281346 {
0 commit comments