Skip to content

Commit 7ab17c5

Browse files
authored
Add support for block statement preparation (#2048)
* fix benchmark issues between modern and classic in dromaeo-object-string
1 parent 8925d0f commit 7ab17c5

File tree

5 files changed

+21
-8
lines changed

5 files changed

+21
-8
lines changed

Jint.Benchmark/Scripts/dromaeo-object-string-modern.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
// Try to force real results
44
let ret;
5-
const num = 80000;
5+
const num = 5000;
66

77
// TESTS: String concatenation
88

Jint.Benchmark/Scripts/dromaeo-object-string.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
// Try to force real results
44
var ret;
5-
var num = 80000;
5+
var num = 5000;
66

77
// TESTS: String concatenation
88

Jint/Engine.Ast.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ public void NodeVisitor(Node node, OnNodeContext _)
100100
case NodeType.ArrowFunctionExpression:
101101
case NodeType.FunctionDeclaration:
102102
case NodeType.FunctionExpression:
103-
var function = (IFunction) node;
104-
node.UserData = JintFunctionDefinition.BuildState(function);
103+
node.UserData = JintFunctionDefinition.BuildState((IFunction) node);
105104
break;
106105

107106
case NodeType.Program:
@@ -151,6 +150,10 @@ public void NodeVisitor(Node node, OnNodeContext _)
151150
}
152151
}
153152
break;
153+
154+
case NodeType.BlockStatement:
155+
node.UserData = JintBlockStatement.BuildState((BlockStatement) node);
156+
break;
154157
}
155158
}
156159
}

Jint/Engine.cs

+8-3
Original file line numberDiff line numberDiff line change
@@ -1149,11 +1149,14 @@ private void GlobalDeclarationInstantiation(
11491149

11501150
UpdateLexicalEnvironment(lexEnv);
11511151

1152-
if (configuration.LexicalDeclarations?.Declarations.Count > 0)
1152+
var declarations = configuration.LexicalDeclarations;
1153+
if (declarations?.Declarations.Count > 0)
11531154
{
1154-
var lexicalDeclarations = configuration.LexicalDeclarations.Value.Declarations;
1155-
var dictionary = lexEnv._dictionary ??= new HybridDictionary<Binding>(lexicalDeclarations.Count, checkExistingKeys: true);
1155+
var lexicalDeclarations = declarations.Value.Declarations;
1156+
var checkExistingKeys = (lexEnv._dictionary is not null && lexEnv._dictionary.Count > 0) || !declarations.Value.AllLexicalScoped;
1157+
var dictionary = lexEnv._dictionary ??= new HybridDictionary<Binding>(lexicalDeclarations.Count, checkExistingKeys);
11561158
dictionary.EnsureCapacity(dictionary.Count + lexicalDeclarations.Count);
1159+
11571160
for (var i = 0; i < lexicalDeclarations.Count; i++)
11581161
{
11591162
var declaration = lexicalDeclarations[i];
@@ -1169,6 +1172,8 @@ private void GlobalDeclarationInstantiation(
11691172
}
11701173
}
11711174
}
1175+
1176+
dictionary.CheckExistingKeys = true;
11721177
}
11731178

11741179
if (configuration.FunctionsToInitialize != null)

Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public JintBlockStatement(NestedBlockStatement blockStatement) : base(blockState
1515

1616
protected override void Initialize(EvaluationContext context)
1717
{
18-
_lexicalDeclarations = DeclarationCacheBuilder.Build(_statement);
18+
_lexicalDeclarations = (DeclarationCache) (_statement.UserData ??= BuildState(_statement));
1919

2020
if (_statement.Body.Count == 1)
2121
{
@@ -27,6 +27,11 @@ protected override void Initialize(EvaluationContext context)
2727
}
2828
}
2929

30+
internal static DeclarationCache BuildState(BlockStatement blockStatement)
31+
{
32+
return DeclarationCacheBuilder.Build(blockStatement);
33+
}
34+
3035
/// <summary>
3136
/// Optimized for direct access without virtual dispatch.
3237
/// </summary>

0 commit comments

Comments
 (0)