Skip to content

Commit 2347e2f

Browse files
committed
In JavaScriptEngineSwitcher.Jint now only one instance of JS parser per engine is used during pre-compilation of scripts
1 parent c714ba1 commit 2347e2f

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

src/JavaScriptEngineSwitcher.Jint/JavaScriptEngineSwitcher.Jint.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<Description>JavaScriptEngineSwitcher.Jint contains adapter `JintJsEngine` (wrapper for the Jint JavaScript Engine (http://github.com/sebastienros/jint) version 3.0.0 Beta 2040).</Description>
2222
<PackageTags>$(PackageCommonTags);Jint</PackageTags>
2323
<PackageIconFullPath>../../Icons/JavaScriptEngineSwitcher_Jint_Logo128x128.png</PackageIconFullPath>
24-
<PackageReleaseNotes>Jint was updated to version 3.0.0 Beta 2040.</PackageReleaseNotes>
24+
<PackageReleaseNotes>Now only one instance of JS parser per engine is used during pre-compilation of scripts.</PackageReleaseNotes>
2525
</PropertyGroup>
2626

2727
<ItemGroup>

src/JavaScriptEngineSwitcher.Jint/JintJsEngine.cs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using OriginalParsedScript = Esprima.Ast.Script;
1616
using OriginalParser = Esprima.JavaScriptParser;
1717
using OriginalParserException = Esprima.ParserException;
18+
using OriginalParserOptions = Esprima.ParserOptions;
1819
using OriginalRecursionDepthOverflowException = Jint.Runtime.RecursionDepthOverflowException;
1920
using OriginalRuntimeException = Jint.Runtime.JintException;
2021
using OriginalStatementsCountOverflowException = Jint.Runtime.StatementsCountOverflowException;
@@ -58,6 +59,12 @@ public sealed class JintJsEngine : JsEngineBase
5859
/// </summary>
5960
private OriginalEngine _jsEngine;
6061

62+
/// <summary>
63+
/// Esprima .NET JS parser
64+
/// </summary>
65+
/// <remarks>Used for pre-compilation of scripts.</remarks>
66+
private OriginalParser _jsParser;
67+
6168
/// <summary>
6269
/// Token source for canceling of script execution
6370
/// </summary>
@@ -79,10 +86,15 @@ public sealed class JintJsEngine : JsEngineBase
7986
private OriginalDebuggerEventHandler _debuggerStepCallback;
8087

8188
/// <summary>
82-
/// Synchronizer of code execution
89+
/// Synchronizer of script execution
8390
/// </summary>
8491
private readonly object _executionSynchronizer = new object();
8592

93+
/// <summary>
94+
/// Synchronizer of script pre-compilation
95+
/// </summary>
96+
private readonly object _precompilationSynchronizer = new object();
97+
8698
/// <summary>
8799
/// Unique document name manager
88100
/// </summary>
@@ -351,14 +363,21 @@ protected override IPrecompiledScript InnerPrecompile(string code, string docume
351363
OriginalParsedScript parsedScript;
352364
string uniqueDocumentName = _documentNameManager.GetUniqueName(documentName);
353365

354-
try
366+
lock (_precompilationSynchronizer)
355367
{
356-
var parser = new OriginalParser();
357-
parsedScript = parser.ParseScript(code, uniqueDocumentName);
358-
}
359-
catch (OriginalParserException e)
360-
{
361-
throw WrapParserException(e);
368+
if (_jsParser == null)
369+
{
370+
_jsParser = new OriginalParser(OriginalParserOptions.Default);
371+
}
372+
373+
try
374+
{
375+
parsedScript = _jsParser.ParseScript(code, uniqueDocumentName);
376+
}
377+
catch (OriginalParserException e)
378+
{
379+
throw WrapParserException(e);
380+
}
362381
}
363382

364383
return new JintPrecompiledScript(parsedScript);
@@ -706,6 +725,7 @@ public override void Dispose()
706725
_jsEngine = null;
707726
}
708727

728+
_jsParser = null;
709729
_debuggerStepCallback = null;
710730
_debuggerBreakCallback = null;
711731
_cancellationConstraint = null;

src/JavaScriptEngineSwitcher.Jint/readme.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
=============
1919
RELEASE NOTES
2020
=============
21-
Jint was updated to version 3.0.0 Beta 2040.
21+
Now only one instance of JS parser per engine is used during pre-compilation of
22+
scripts.
2223

2324
=============
2425
DOCUMENTATION

0 commit comments

Comments
 (0)