Skip to content

Commit e1e2d6d

Browse files
authored
Prevent users from passing arbitrary parser options to Jint (#1831)
* Reduce parsing options for end users (replace ParserOptions with Script/ModuleParseOptions in the public API) * Enforce that pre-parsed scripts can be passed to Jint only if they were created using Engine.PrepareScript/PrepareModule * Avoid copying beefy ExecutionContext struct where possible * Propagate ParserOptions via ExecutionContext * Introduce alias for Esprima.Ast.Module
1 parent b6f99b9 commit e1e2d6d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+754
-229
lines changed

Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<Using Include="Esprima.Utils" />
3333

3434
<Using Include="Esprima.Ast.BindingPattern" Alias="DestructuringPattern" />
35+
<Using Include="Esprima.Ast.Module" Alias="AstModule" />
3536
<Using Include="Esprima.Ast.Nodes" Alias="NodeType" />
3637
<Using Include="Esprima.JavaScriptParser" Alias="Parser" />
3738
<Using Include="Esprima.Location" Alias="SourceLocation" />

Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<ItemGroup>
77
<PackageVersion Include="BenchmarkDotNet" Version="0.13.12" />
88
<PackageVersion Include="BenchmarkDotNet.TestAdapter" Version="0.13.12" />
9-
<PackageVersion Include="Esprima" Version="3.0.4" />
9+
<PackageVersion Include="Esprima" Version="3.0.5" />
1010
<PackageVersion Include="FluentAssertions" Version="6.12.0" />
1111
<PackageVersion Include="Flurl.Http.Signed" Version="3.2.4" />
1212
<PackageVersion Include="Jurassic" Version="3.2.7" />

Jint.Benchmark/DromaeoBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class DromaeoBenchmark
1515
{"dromaeo-string-base64", null}
1616
};
1717

18-
private readonly Dictionary<string, Script> _prepared = new();
18+
private readonly Dictionary<string, Prepared<Script>> _prepared = new();
1919

2020
private Engine engine;
2121

Jint.Benchmark/EngineComparisonBenchmark.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Jint.Benchmark;
1212
[BenchmarkCategory("EngineComparison")]
1313
public class EngineComparisonBenchmark
1414
{
15-
private static readonly Dictionary<string, Script> _parsedScripts = new();
15+
private static readonly Dictionary<string, Prepared<Script>> _parsedScripts = new();
1616

1717
private static readonly Dictionary<string, string> _files = new()
1818
{
@@ -38,7 +38,6 @@ public class EngineComparisonBenchmark
3838
[GlobalSetup]
3939
public void Setup()
4040
{
41-
var parser = new Parser();
4241
foreach (var fileName in _files.Keys.ToList())
4342
{
4443
var script = File.ReadAllText($"Scripts/{fileName}.js");
@@ -47,7 +46,7 @@ public void Setup()
4746
script = _dromaeoHelpers + Environment.NewLine + Environment.NewLine + script;
4847
}
4948
_files[fileName] = script;
50-
_parsedScripts[fileName] = parser.ParseScript(script, strict: true);
49+
_parsedScripts[fileName] = Engine.PrepareScript(script, strict: true);
5150
}
5251
}
5352

Jint.Benchmark/EngineConstructionBenchmark.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ namespace Jint.Benchmark;
66
[MemoryDiagnoser]
77
public class EngineConstructionBenchmark
88
{
9-
private Script _program;
10-
private Script _simple;
9+
private Prepared<Script> _program;
10+
private Prepared<Script> _simple;
1111

1212
[GlobalSetup]
1313
public void GlobalSetup()
1414
{
15-
var parser = new Parser();
16-
_program = parser.ParseScript("([].length + ''.length)");
17-
_simple = parser.ParseScript("1");
15+
_program = Engine.PrepareScript("([].length + ''.length)");
16+
_simple = Engine.PrepareScript("1");
1817
new Engine().Evaluate(_program);
1918
}
2019

Jint.Benchmark/ObjectAccessBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace Jint.Benchmark;
55
[MemoryDiagnoser]
66
public class ObjectAccessBenchmark
77
{
8-
private readonly Script _script;
8+
private readonly Prepared<Script> _script;
99

1010
public ObjectAccessBenchmark()
1111
{

Jint.Benchmark/ShadowRealmBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class ShadowRealmBenchmark
1111
";
1212

1313
private Engine engine;
14-
private Script parsedScript;
14+
private Prepared<Script> parsedScript;
1515

1616
[GlobalSetup]
1717
public void Setup()

Jint.Benchmark/SingleScriptBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Jint.Benchmark;
66
public abstract class SingleScriptBenchmark
77
{
88
private string _script;
9-
private Script _parsedScript;
9+
private Prepared<Script> _parsedScript;
1010

1111
protected abstract string FileName { get; }
1212

Jint.Repl/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@
4040
Console.WriteLine();
4141

4242
var defaultColor = Console.ForegroundColor;
43-
var parserOptions = new ParserOptions
43+
var parsingOptions = new ScriptParsingOptions
4444
{
4545
Tolerant = true,
46-
RegExpParseMode = RegExpParseMode.AdaptToInterpreted
46+
CompileRegex = false,
4747
};
4848

4949
var serializer = new JsonSerializer(engine);
@@ -60,7 +60,7 @@
6060

6161
try
6262
{
63-
var result = engine.Evaluate(input, parserOptions);
63+
var result = engine.Evaluate(input, parsingOptions);
6464
JsValue str = result;
6565
if (!result.IsPrimitive() && result is not IJsPrimitive)
6666
{

Jint.Tests.CommonScripts/ConcurrencyTest.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,10 @@ namespace Jint.Tests.CommonScripts;
44
public class ConcurrencyTest
55
{
66
[Test]
7-
[TestCase(true)]
8-
[TestCase(false)]
9-
public void ConcurrentEnginesCanUseSameAst(bool prepared)
7+
public void ConcurrentEnginesCanUseSameAst()
108
{
119
var scriptContents = SunSpiderTests.GetEmbeddedFile("babel-standalone.js");
12-
var script = prepared
13-
? Engine.PrepareScript(scriptContents)
14-
: new Parser().ParseScript(scriptContents);
10+
var script = Engine.PrepareScript(scriptContents);
1511

1612
Parallel.ForEach(Enumerable.Range(0, 3), x =>
1713
{

0 commit comments

Comments
 (0)