Skip to content

Commit f2a55ed

Browse files
committed
In JavaScriptEngineSwitcher.Jint now script error contains a full stack trace
1 parent e181acd commit f2a55ed

File tree

3 files changed

+83
-16
lines changed

3 files changed

+83
-16
lines changed

NuGet/JavaScriptEngineSwitcher.Jint/JavaScriptEngineSwitcher.Jint.nuspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
<requireLicenseAcceptance>false</requireLicenseAcceptance>
1313
<description>JavaScriptEngineSwitcher.Jint contains adapter `JintJsEngine` (wrapper for the Jint JavaScript Engine (http://github.com/sebastienros/jint) version 2.10.3).</description>
1414
<summary>JavaScriptEngineSwitcher.Jint contains adapter `JintJsEngine` (wrapper for the Jint JavaScript Engine version 2.10.3).</summary>
15-
<releaseNotes>Added support of .NET Core 1.0.4.</releaseNotes>
15+
<releaseNotes>1. Added support of .NET Core 1.0.4;
16+
2. Now script error contains a full stack trace.</releaseNotes>
1617
<copyright>Copyright (c) 2013-2017 Andrey Taritsyn - http://www.taritsyn.ru</copyright>
1718
<language>en-US</language>
1819
<tags>JavaScriptEngineSwitcher JavaScript ECMAScript Jint</tags>

NuGet/JavaScriptEngineSwitcher.Jint/readme.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
=============
1818
RELEASE NOTES
1919
=============
20-
Added support of .NET Core 1.0.4.
20+
1. Added support of .NET Core 1.0.4;
21+
2. Now script error contains a full stack trace.
2122

2223
=============
2324
DOCUMENTATION

src/JavaScriptEngineSwitcher.Jint/JintJsEngine.cs

Lines changed: 79 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
using System;
2+
using System.Text;
23

34
using IOriginalCallable = Jint.Native.ICallable;
45
using OriginalJsEngine = Jint.Engine;
56
using OriginalJsException = Jint.Runtime.JavaScriptException;
67
using OriginalJsValue = Jint.Native.JsValue;
78
using OriginalObjectInstance = Jint.Native.Object.ObjectInstance;
89
using OriginalParserException = Jint.Parser.ParserException;
10+
using OriginalParserOptions = Jint.Parser.ParserOptions;
911
using OriginalRecursionDepthOverflowException = Jint.Runtime.RecursionDepthOverflowException;
1012
using OriginalStatementsCountOverflowException = Jint.Runtime.StatementsCountOverflowException;
1113
using 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

Comments
 (0)