From d3e65ac38bf942a4901b710dc9c6af4174a7a1c6 Mon Sep 17 00:00:00 2001 From: Marko Lahma Date: Sat, 13 Jan 2024 12:18:07 +0200 Subject: [PATCH] Replace some string usage with Key when suitable (#1737) --- Jint/Engine.Ast.cs | 18 ++++----- Jint/Engine.cs | 14 +++---- Jint/EsprimaExtensions.cs | 10 ++--- Jint/Key.cs | 10 ----- Jint/Native/Object/ObjectInstance.cs | 5 +-- .../Environments/DeclarativeEnvironment.cs | 10 +---- .../Runtime/Environments/GlobalEnvironment.cs | 39 +++++++------------ .../Interpreter/JintFunctionDefinition.cs | 4 +- Jint/Runtime/Interpreter/JintStatementList.cs | 7 +--- .../Statements/JintBlockStatement.cs | 2 +- .../Statements/JintForInForOfStatement.cs | 6 +-- .../Statements/JintForStatement.cs | 8 ++-- .../Interpreter/Statements/JintSwitchBlock.cs | 2 +- .../Statements/JintTryStatement.cs | 6 +-- Jint/Runtime/KnownKeys.cs | 2 - Jint/Runtime/Modules/SourceTextModule.cs | 12 +++--- 16 files changed, 59 insertions(+), 96 deletions(-) diff --git a/Jint/Engine.Ast.cs b/Jint/Engine.Ast.cs index 6abad0719c..a0a92a5fbb 100644 --- a/Jint/Engine.Ast.cs +++ b/Jint/Engine.Ast.cs @@ -88,14 +88,14 @@ public CachedHoistingScope(Program program) { Scope = HoistingScope.GetProgramLevelDeclarations(program); - VarNames = new List(); + VarNames = new List(); GatherVarNames(Scope, VarNames); LexNames = new List(); GatherLexNames(Scope, LexNames); } - internal static void GatherVarNames(HoistingScope scope, List boundNames) + internal static void GatherVarNames(HoistingScope scope, List boundNames) { var varDeclarations = scope._variablesDeclarations; if (varDeclarations != null) @@ -113,15 +113,15 @@ internal static void GatherLexNames(HoistingScope scope, List var lexDeclarations = scope._lexicalDeclarations; if (lexDeclarations != null) { - var temp = new List(); + var temp = new List(); for (var i = 0; i < lexDeclarations.Count; i++) { var d = lexDeclarations[i]; temp.Clear(); d.GetBoundNames(temp); - foreach (var name in temp) + for (var j = 0; j < temp.Count; j++) { - boundNames.Add(new CachedLexicalName(name, d.IsConstantDeclaration())); + boundNames.Add(new CachedLexicalName(temp[j], d.IsConstantDeclaration())); } } } @@ -131,7 +131,7 @@ internal static void GatherLexNames(HoistingScope scope, List internal readonly record struct CachedLexicalName(Key Name, bool Constant); public HoistingScope Scope { get; } - public List VarNames { get; } + public List VarNames { get; } public List LexNames { get; } } @@ -142,16 +142,16 @@ internal static HoistingScope GetHoistingScope(this Program program) return program.AssociatedData is CachedHoistingScope cached ? cached.Scope : HoistingScope.GetProgramLevelDeclarations(program); } - internal static List GetVarNames(this Program program, HoistingScope hoistingScope) + internal static List GetVarNames(this Program program, HoistingScope hoistingScope) { - List boundNames; + List boundNames; if (program.AssociatedData is CachedHoistingScope cached) { boundNames = cached.VarNames; } else { - boundNames = new List(); + boundNames = new List(); CachedHoistingScope.GatherVarNames(hoistingScope, boundNames); } diff --git a/Jint/Engine.cs b/Jint/Engine.cs index 6fafd7ea78..1484d192f3 100644 --- a/Jint/Engine.cs +++ b/Jint/Engine.cs @@ -945,7 +945,7 @@ private void GlobalDeclarationInstantiation( var functionToInitialize = new List(); var declaredFunctionNames = new HashSet(); - var declaredVarNames = new List(); + var declaredVarNames = new List(); var realm = Realm; @@ -972,7 +972,7 @@ private void GlobalDeclarationInstantiation( var varNames = script.GetVarNames(hoistingScope); for (var j = 0; j < varNames.Count; j++) { - Key vn = varNames[j]; + var vn = varNames[j]; if (env.HasLexicalDeclaration(vn)) { ExceptionHelper.ThrowSyntaxError(realm, $"Identifier '{vn}' has already been declared"); @@ -1014,7 +1014,7 @@ private void GlobalDeclarationInstantiation( for (var i = functionToInitialize.Count - 1; i > -1; i--) { var f = functionToInitialize[i]; - var fn = f.Name!; + Key fn = f.Name!; if (env.HasLexicalDeclaration(fn)) { @@ -1143,7 +1143,7 @@ private void GlobalDeclarationInstantiation( { for (var j = 0; j < d.BoundNames.Count; j++) { - Key dn = d.BoundNames[j]; + var dn = d.BoundNames[j]; if (d.IsConstantDeclaration) { lexEnv.CreateImmutableBinding(dn, strict: true); @@ -1284,7 +1284,7 @@ internal void EvalDeclarationInstantiation( } } - var boundNames = new List(); + var boundNames = new List(); var declaredVarNames = new List(); var variableDeclarations = hoistingScope._variablesDeclarations; var variableDeclarationsCount = variableDeclarations?.Count; @@ -1335,14 +1335,14 @@ internal void EvalDeclarationInstantiation( foreach (var f in functionsToInitialize) { - Key fn = f.Name!; var fo = realm.Intrinsics.Function.InstantiateFunctionObject(f, lexEnv, privateEnv); if (varEnvRec is GlobalEnvironment ger) { - ger.CreateGlobalFunctionBinding(fn, fo, canBeDeleted: true); + ger.CreateGlobalFunctionBinding(f.Name!, fo, canBeDeleted: true); } else { + Key fn = f.Name!; var bindingExists = varEnvRec.HasBinding(fn); if (!bindingExists) { diff --git a/Jint/EsprimaExtensions.cs b/Jint/EsprimaExtensions.cs index 30b0384aa1..f8361c1c73 100644 --- a/Jint/EsprimaExtensions.cs +++ b/Jint/EsprimaExtensions.cs @@ -166,7 +166,7 @@ internal static string LiteralKeyToString(Literal literal) return literal.Value as string ?? Convert.ToString(literal.Value, provider: null) ?? ""; } - internal static void GetBoundNames(this VariableDeclaration variableDeclaration, List target) + internal static void GetBoundNames(this VariableDeclaration variableDeclaration, List target) { ref readonly var declarations = ref variableDeclaration.Declarations; for (var i = 0; i < declarations.Count; i++) @@ -176,7 +176,7 @@ internal static void GetBoundNames(this VariableDeclaration variableDeclaration, } } - internal static void GetBoundNames(this Node? parameter, List target) + internal static void GetBoundNames(this Node? parameter, List target) { if (parameter is null || parameter.Type == Nodes.Literal) { @@ -430,15 +430,15 @@ private static void GetExportEntries(bool defaultExport, StatementListItem decla for (var i = 0; i < names.Count; i++) { var name = names[i]; - var exportName = defaultExport ? "default" : name; + var exportName = defaultExport ? "default" : name.Name; exportEntries.Add(new(exportName, moduleRequest, null, name)); } } } - private static List GetExportNames(StatementListItem declaration) + private static List GetExportNames(StatementListItem declaration) { - var result = new List(); + var result = new List(); switch (declaration) { diff --git a/Jint/Key.cs b/Jint/Key.cs index 158ecee926..206e0c38cf 100644 --- a/Jint/Key.cs +++ b/Jint/Key.cs @@ -39,16 +39,6 @@ private Key(string name) return a.HashCode != b.HashCode || !string.Equals(a.Name, b.Name, StringComparison.Ordinal); } - public static bool operator ==(in Key a, string b) - { - return string.Equals(a.Name, b, StringComparison.Ordinal); - } - - public static bool operator !=(in Key a, string b) - { - return !string.Equals(a.Name, b, StringComparison.Ordinal); - } - public bool Equals(Key other) { return HashCode == other.HashCode && string.Equals(Name, other.Name, StringComparison.Ordinal); diff --git a/Jint/Native/Object/ObjectInstance.cs b/Jint/Native/Object/ObjectInstance.cs index 3db6032497..1ce146b8b5 100644 --- a/Jint/Native/Object/ObjectInstance.cs +++ b/Jint/Native/Object/ObjectInstance.cs @@ -1,4 +1,3 @@ -using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; @@ -6,7 +5,6 @@ using Jint.Native.Array; using Jint.Native.BigInt; using Jint.Native.Boolean; -using Jint.Native.Function; using Jint.Native.Json; using Jint.Native.Number; using Jint.Native.RegExp; @@ -527,8 +525,7 @@ public bool Set(JsValue property, JsValue value) { if ((_type & InternalTypes.PlainObject) != InternalTypes.Empty && property is JsString jsString) { - var key = (Key) jsString.ToString(); - if (_properties?.TryGetValue(key, out var ownDesc) == true) + if (_properties?.TryGetValue(jsString.ToString(), out var ownDesc) == true) { if ((ownDesc._flags & PropertyFlag.Writable) != PropertyFlag.None) { diff --git a/Jint/Runtime/Environments/DeclarativeEnvironment.cs b/Jint/Runtime/Environments/DeclarativeEnvironment.cs index cbdbd864c1..d9bbbd8efe 100644 --- a/Jint/Runtime/Environments/DeclarativeEnvironment.cs +++ b/Jint/Runtime/Environments/DeclarativeEnvironment.cs @@ -143,10 +143,7 @@ internal sealed override bool DeleteBinding(Key name) internal sealed override JsValue WithBaseObject() => Undefined; - internal sealed override bool HasBindings() - { - return _dictionary?.Count > 0; - } + internal sealed override bool HasBindings() => _dictionary?.Count > 0; /// internal sealed override string[] GetAllBindingNames() @@ -166,10 +163,7 @@ internal sealed override string[] GetAllBindingNames() return keys; } - internal override JsValue GetThisBinding() - { - return Undefined; - } + internal override JsValue GetThisBinding() => Undefined; public void Clear() { diff --git a/Jint/Runtime/Environments/GlobalEnvironment.cs b/Jint/Runtime/Environments/GlobalEnvironment.cs index c60cf14556..9c441bb9b7 100644 --- a/Jint/Runtime/Environments/GlobalEnvironment.cs +++ b/Jint/Runtime/Environments/GlobalEnvironment.cs @@ -29,7 +29,7 @@ public GlobalDeclarativeEnvironment(Engine engine) : base(engine) // Environment records are needed by debugger internal readonly GlobalDeclarativeEnvironment _declarativeRecord; - private readonly HashSet _varNames = new(StringComparer.Ordinal); + private readonly HashSet _varNames = []; public GlobalEnvironment(Engine engine, ObjectInstance global) : base(engine) { @@ -272,25 +272,13 @@ internal override bool DeleteBinding(Key name) return true; } - internal override bool HasThisBinding() - { - return true; - } + internal override bool HasThisBinding() => true; - internal override bool HasSuperBinding() - { - return false; - } + internal override bool HasSuperBinding() => false; - internal override JsValue WithBaseObject() - { - return Undefined; - } + internal override JsValue WithBaseObject() => Undefined; - internal override JsValue GetThisBinding() - { - return _global; - } + internal override JsValue GetThisBinding() => _global; internal bool HasVarDeclaration(Key name) => _varNames.Contains(name); @@ -313,7 +301,7 @@ internal bool HasRestrictedGlobalProperty(Key name) return !existingProp.Configurable; } - public bool CanDeclareGlobalVar(string name) + public bool CanDeclareGlobalVar(Key name) { if (_global._properties!.ContainsKey(name)) { @@ -323,7 +311,7 @@ public bool CanDeclareGlobalVar(string name) return _global.Extensible; } - public bool CanDeclareGlobalFunction(string name) + public bool CanDeclareGlobalFunction(Key name) { if (!_global._properties!.TryGetValue(name, out var existingProp) || existingProp == PropertyDescriptor.Undefined) @@ -344,10 +332,9 @@ public bool CanDeclareGlobalFunction(string name) return false; } - public void CreateGlobalVarBinding(string name, bool canBeDeleted) + public void CreateGlobalVarBinding(Key name, bool canBeDeleted) { - Key key = name; - if (_global.Extensible && _global._properties!.TryAdd(key, new PropertyDescriptor(Undefined, canBeDeleted + if (_global.Extensible && _global._properties!.TryAdd(name, new PropertyDescriptor(Undefined, canBeDeleted ? PropertyFlag.ConfigurableEnumerableWritable | PropertyFlag.MutableBinding : PropertyFlag.NonConfigurable | PropertyFlag.MutableBinding))) { @@ -355,7 +342,7 @@ public void CreateGlobalVarBinding(string name, bool canBeDeleted) } } - internal void CreateGlobalVarBindings(List names, bool canBeDeleted) + internal void CreateGlobalVarBindings(List names, bool canBeDeleted) { if (!_global.Extensible) { @@ -366,7 +353,7 @@ internal void CreateGlobalVarBindings(List names, bool canBeDeleted) { var name = names[i]; - _global._properties!.TryAdd(name,new PropertyDescriptor(Undefined, canBeDeleted + _global._properties!.TryAdd(name, new PropertyDescriptor(Undefined, canBeDeleted ? PropertyFlag.ConfigurableEnumerableWritable | PropertyFlag.MutableBinding : PropertyFlag.NonConfigurable | PropertyFlag.MutableBinding)); @@ -377,7 +364,7 @@ internal void CreateGlobalVarBindings(List names, bool canBeDeleted) /// /// https://tc39.es/ecma262/#sec-createglobalfunctionbinding /// - public void CreateGlobalFunctionBinding(string name, JsValue value, bool canBeDeleted) + public void CreateGlobalFunctionBinding(Key name, JsValue value, bool canBeDeleted) { var jsString = new JsString(name); var existingProp = _global.GetOwnProperty(jsString); @@ -397,7 +384,7 @@ public void CreateGlobalFunctionBinding(string name, JsValue value, bool canBeDe _varNames.Add(name); } - internal sealed override bool HasBindings() + internal override bool HasBindings() { return _declarativeRecord.HasBindings() || _globalObject?._properties?.Count > 0 || _global._properties?.Count > 0; } diff --git a/Jint/Runtime/Interpreter/JintFunctionDefinition.cs b/Jint/Runtime/Interpreter/JintFunctionDefinition.cs index b300725950..799efa0808 100644 --- a/Jint/Runtime/Interpreter/JintFunctionDefinition.cs +++ b/Jint/Runtime/Interpreter/JintFunctionDefinition.cs @@ -188,7 +188,7 @@ internal struct VariableValuePair internal struct LexicalVariableDeclaration { public bool IsConstantDeclaration; - public List BoundNames; + public List BoundNames; } } @@ -316,7 +316,7 @@ internal static State BuildState(IFunction function) for (var i = 0; i < lexicalDeclarationsCount; i++) { var d = _lexicalDeclarations[i]; - var boundNames = new List(); + var boundNames = new List(); d.GetBoundNames(boundNames); declarations[i] = new State.LexicalVariableDeclaration { diff --git a/Jint/Runtime/Interpreter/JintStatementList.cs b/Jint/Runtime/Interpreter/JintStatementList.cs index afe4ee6b45..a82a842bb5 100644 --- a/Jint/Runtime/Interpreter/JintStatementList.cs +++ b/Jint/Runtime/Interpreter/JintStatementList.cs @@ -181,13 +181,10 @@ private static Completion CreateThrowCompletion(JintStatement? s, JavaScriptExce /// /// https://tc39.es/ecma262/#sec-blockdeclarationinstantiation /// - internal static void BlockDeclarationInstantiation( - Engine engine, - Environment env, - List declarations) + internal static void BlockDeclarationInstantiation(Environment env, List declarations) { var privateEnv = env._engine.ExecutionContext.PrivateEnvironment; - var boundNames = new List(); + var boundNames = new List(); for (var i = 0; i < declarations.Count; i++) { var d = declarations[i]; diff --git a/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs b/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs index 4835b97822..f6cc58a2c5 100644 --- a/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs +++ b/Jint/Runtime/Interpreter/Statements/JintBlockStatement.cs @@ -43,7 +43,7 @@ public Completion ExecuteBlock(EvaluationContext context) { oldEnv = engine.ExecutionContext.LexicalEnvironment; var blockEnv = JintEnvironment.NewDeclarativeEnvironment(engine, engine.ExecutionContext.LexicalEnvironment); - JintStatementList.BlockDeclarationInstantiation(engine, blockEnv, _lexicalDeclarations); + JintStatementList.BlockDeclarationInstantiation(blockEnv, _lexicalDeclarations); engine.UpdateLexicalEnvironment(blockEnv); } diff --git a/Jint/Runtime/Interpreter/Statements/JintForInForOfStatement.cs b/Jint/Runtime/Interpreter/Statements/JintForInForOfStatement.cs index 10345063c2..da7c2066a2 100644 --- a/Jint/Runtime/Interpreter/Statements/JintForInForOfStatement.cs +++ b/Jint/Runtime/Interpreter/Statements/JintForInForOfStatement.cs @@ -23,7 +23,7 @@ internal sealed class JintForInForOfStatement : JintStatement private JintExpression? _expr; private BindingPattern? _assignmentPattern; private JintExpression _right = null!; - private List? _tdzNames; + private List? _tdzNames; private bool _destructuring; private LhsKind _lhsKind; @@ -57,7 +57,7 @@ protected override void Initialize(EvaluationContext context) var id = variableDeclarationDeclaration.Id; if (_lhsKind == LhsKind.LexicalBinding) { - _tdzNames = new List(1); + _tdzNames = new List(1); id.GetBoundNames(_tdzNames); } @@ -336,7 +336,7 @@ private void BindingInstantiation(Environment environment) { var envRec = (DeclarativeEnvironment) environment; var variableDeclaration = (VariableDeclaration) _leftNode; - var boundNames = new List(); + var boundNames = new List(); variableDeclaration.GetBoundNames(boundNames); for (var i = 0; i < boundNames.Count; i++) { diff --git a/Jint/Runtime/Interpreter/Statements/JintForStatement.cs b/Jint/Runtime/Interpreter/Statements/JintForStatement.cs index 0ef0e277be..bca21bc967 100644 --- a/Jint/Runtime/Interpreter/Statements/JintForStatement.cs +++ b/Jint/Runtime/Interpreter/Statements/JintForStatement.cs @@ -18,7 +18,7 @@ internal sealed class JintForStatement : JintStatement private JintExpression? _increment; private ProbablyBlockStatement _body; - private List? _boundNames; + private List? _boundNames; private bool _shouldCreatePerIterationEnvironment; @@ -38,7 +38,7 @@ protected override void Initialize(EvaluationContext context) var d = (VariableDeclaration) _statement.Init; if (d.Kind != VariableDeclarationKind.Var) { - _boundNames = new List(); + _boundNames = new List(); d.GetBoundNames(_boundNames); } _initStatement = new JintVariableDeclaration(d); @@ -77,11 +77,11 @@ protected override Completion ExecuteInternal(EvaluationContext context) var name = _boundNames[i]; if (kind == VariableDeclarationKind.Const) { - loopEnvRec.CreateImmutableBinding(name, true); + loopEnvRec.CreateImmutableBinding(name); } else { - loopEnvRec.CreateMutableBinding(name, false); + loopEnvRec.CreateMutableBinding(name); } } diff --git a/Jint/Runtime/Interpreter/Statements/JintSwitchBlock.cs b/Jint/Runtime/Interpreter/Statements/JintSwitchBlock.cs index 7680bb0bbd..6c6dd606bd 100644 --- a/Jint/Runtime/Interpreter/Statements/JintSwitchBlock.cs +++ b/Jint/Runtime/Interpreter/Statements/JintSwitchBlock.cs @@ -55,7 +55,7 @@ public Completion Execute(EvaluationContext context, JsValue input) blockEnv ??= JintEnvironment.NewDeclarativeEnvironment(context.Engine, oldEnv); blockEnv.Clear(); - JintStatementList.BlockDeclarationInstantiation(context.Engine, blockEnv, clause.LexicalDeclarations); + JintStatementList.BlockDeclarationInstantiation(blockEnv, clause.LexicalDeclarations); context.Engine.UpdateLexicalEnvironment(blockEnv); } diff --git a/Jint/Runtime/Interpreter/Statements/JintTryStatement.cs b/Jint/Runtime/Interpreter/Statements/JintTryStatement.cs index ffd8e14230..7a2e4fe805 100644 --- a/Jint/Runtime/Interpreter/Statements/JintTryStatement.cs +++ b/Jint/Runtime/Interpreter/Statements/JintTryStatement.cs @@ -69,12 +69,12 @@ private Completion ExecuteCatch(EvaluationContext context, Completion b, Engine var oldEnv = engine.ExecutionContext.LexicalEnvironment; var catchEnv = JintEnvironment.NewDeclarativeEnvironment(engine, oldEnv, catchEnvironment: true); - var boundNames = new List(); + var boundNames = new List(); _statement.Handler.Param.GetBoundNames(boundNames); - foreach (var argName in boundNames) + for (var i = 0; i < boundNames.Count; i++) { - catchEnv.CreateMutableBinding(argName, false); + catchEnv.CreateMutableBinding(boundNames[i]); } engine.UpdateLexicalEnvironment(catchEnv); diff --git a/Jint/Runtime/KnownKeys.cs b/Jint/Runtime/KnownKeys.cs index f486029d89..a9c622630f 100644 --- a/Jint/Runtime/KnownKeys.cs +++ b/Jint/Runtime/KnownKeys.cs @@ -1,5 +1,3 @@ -using Environment = Jint.Runtime.Environments.Environment; - namespace Jint.Runtime; internal static class KnownKeys diff --git a/Jint/Runtime/Modules/SourceTextModule.cs b/Jint/Runtime/Modules/SourceTextModule.cs index d9a54bf6a5..b29c06e412 100644 --- a/Jint/Runtime/Modules/SourceTextModule.cs +++ b/Jint/Runtime/Modules/SourceTextModule.cs @@ -250,10 +250,10 @@ protected override void InitializeEnvironment() var hoistingScope = HoistingScope.GetModuleLevelDeclarations(_source); var varDeclarations = hoistingScope._variablesDeclarations; - var declaredVarNames = new HashSet(StringComparer.Ordinal); + var declaredVarNames = new HashSet(); if (varDeclarations != null) { - var boundNames = new List(); + var boundNames = new List(); for (var i = 0; i < varDeclarations.Count; i++) { var d = varDeclarations[i]; @@ -264,7 +264,7 @@ protected override void InitializeEnvironment() var dn = boundNames[j]; if (declaredVarNames.Add(dn)) { - env.CreateMutableBinding(dn, false); + env.CreateMutableBinding(dn); env.InitializeBinding(dn, Undefined); } } @@ -275,7 +275,7 @@ protected override void InitializeEnvironment() if (lexDeclarations != null) { - var boundNames = new List(); + var boundNames = new List(); for (var i = 0; i < lexDeclarations.Count; i++) { var d = lexDeclarations[i]; @@ -286,11 +286,11 @@ protected override void InitializeEnvironment() var dn = boundNames[j]; if (d.IsConstantDeclaration()) { - env.CreateImmutableBinding(dn, true); + env.CreateImmutableBinding(dn); } else { - env.CreateMutableBinding(dn, false); + env.CreateMutableBinding(dn); } } }