From 5645e0ee14bc738dcd1cf341f7059834bc2d38db Mon Sep 17 00:00:00 2001 From: Marko Lahma Date: Tue, 28 Jan 2025 20:45:43 +0200 Subject: [PATCH] Add support for block statement preparation * fix benchmark issues between modern and classic in dromaeo-object-string --- .../Scripts/dromaeo-object-string-modern.js | 2 +- Jint.Benchmark/Scripts/dromaeo-object-string.js | 2 +- Jint/Engine.Ast.cs | 7 +++++-- Jint/Engine.cs | 11 ++++++++--- .../Interpreter/Statements/JintBlockStatement.cs | 7 ++++++- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Jint.Benchmark/Scripts/dromaeo-object-string-modern.js b/Jint.Benchmark/Scripts/dromaeo-object-string-modern.js index b604865328..8ff9f6f188 100644 --- a/Jint.Benchmark/Scripts/dromaeo-object-string-modern.js +++ b/Jint.Benchmark/Scripts/dromaeo-object-string-modern.js @@ -2,7 +2,7 @@ // Try to force real results let ret; -const num = 80000; +const num = 5000; // TESTS: String concatenation diff --git a/Jint.Benchmark/Scripts/dromaeo-object-string.js b/Jint.Benchmark/Scripts/dromaeo-object-string.js index 88e2030247..cbe9d31af7 100644 --- a/Jint.Benchmark/Scripts/dromaeo-object-string.js +++ b/Jint.Benchmark/Scripts/dromaeo-object-string.js @@ -2,7 +2,7 @@ // Try to force real results var ret; -var num = 80000; +var num = 5000; // TESTS: String concatenation diff --git a/Jint/Engine.Ast.cs b/Jint/Engine.Ast.cs index b87ebbe717..c1f481eed0 100644 --- a/Jint/Engine.Ast.cs +++ b/Jint/Engine.Ast.cs @@ -100,8 +100,7 @@ public void NodeVisitor(Node node, OnNodeContext _) case NodeType.ArrowFunctionExpression: case NodeType.FunctionDeclaration: case NodeType.FunctionExpression: - var function = (IFunction) node; - node.UserData = JintFunctionDefinition.BuildState(function); + node.UserData = JintFunctionDefinition.BuildState((IFunction) node); break; case NodeType.Program: @@ -151,6 +150,10 @@ public void NodeVisitor(Node node, OnNodeContext _) } } break; + + case NodeType.BlockStatement: + node.UserData = JintBlockStatement.BuildState((BlockStatement) node); + break; } } } diff --git a/Jint/Engine.cs b/Jint/Engine.cs index 84937e15f1..651ced817b 100644 --- a/Jint/Engine.cs +++ b/Jint/Engine.cs @@ -1149,11 +1149,14 @@ private void GlobalDeclarationInstantiation( UpdateLexicalEnvironment(lexEnv); - if (configuration.LexicalDeclarations?.Declarations.Count > 0) + var declarations = configuration.LexicalDeclarations; + if (declarations?.Declarations.Count > 0) { - var lexicalDeclarations = configuration.LexicalDeclarations.Value.Declarations; - var dictionary = lexEnv._dictionary ??= new HybridDictionary(lexicalDeclarations.Count, checkExistingKeys: true); + var lexicalDeclarations = declarations.Value.Declarations; + var checkExistingKeys = (lexEnv._dictionary is not null && lexEnv._dictionary.Count > 0) || !declarations.Value.AllLexicalScoped; + var dictionary = lexEnv._dictionary ??= new HybridDictionary(lexicalDeclarations.Count, checkExistingKeys); dictionary.EnsureCapacity(dictionary.Count + lexicalDeclarations.Count); + for (var i = 0; i < lexicalDeclarations.Count; i++) { var declaration = lexicalDeclarations[i]; @@ -1169,6 +1172,8 @@ private void GlobalDeclarationInstantiation( } } } + + dictionary.CheckExistingKeys = true; } if (configuration.FunctionsToInitialize != null) diff --git a/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs b/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs index c6e1f0cba8..e865a3adf6 100644 --- a/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs +++ b/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs @@ -15,7 +15,7 @@ public JintBlockStatement(NestedBlockStatement blockStatement) : base(blockState protected override void Initialize(EvaluationContext context) { - _lexicalDeclarations = DeclarationCacheBuilder.Build(_statement); + _lexicalDeclarations = (DeclarationCache) (_statement.UserData ??= BuildState(_statement)); if (_statement.Body.Count == 1) { @@ -27,6 +27,11 @@ protected override void Initialize(EvaluationContext context) } } + internal static DeclarationCache BuildState(BlockStatement blockStatement) + { + return DeclarationCacheBuilder.Build(blockStatement); + } + /// /// Optimized for direct access without virtual dispatch. ///