From ec25b71ed403787f6ce5391b61b7fdfe29d937c3 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Thu, 15 Feb 2024 12:43:35 -0600 Subject: [PATCH 1/6] Reduce the allocations in parsing the js --- .../JavaScript/JSHostImplementation.cs | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs index 7268951b68828b..c6f5b37f0029ea 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs @@ -390,26 +390,35 @@ public static IntPtr GetIntPtrFromMethodHandle(RuntimeMethodHandle methodHandle) public static (string assemblyName, string className, string nameSpace, string shortClassName, string methodName) ParseFQN(string fqn) { - var assembly = fqn.Substring(fqn.IndexOf('[') + 1, fqn.IndexOf(']') - 1).Trim(); - fqn = fqn.Substring(fqn.IndexOf(']') + 1).Trim(); - var methodName = fqn.Substring(fqn.IndexOf(':') + 1); - var className = fqn.Substring(0, fqn.IndexOf(':')).Trim(); - - var nameSpace = ""; - var shortClassName = className; - var idx = fqn.LastIndexOf("."); - if (idx != -1) - { - nameSpace = fqn.Substring(0, idx); - shortClassName = className.Substring(idx + 1); - } + ReadOnlySpan fqnSpan = fqn.AsSpan(); + ReadOnlySpan assemblyStart = fqnSpan..Slice(fqnSpan.IndexOf('[') + 1); + int assemblyEnd = assemblyStart.IndexOf(']'); + + if (assemblyEnd == -1 || assemblyStart.Length == fqnSpan.Length) + throw new InvalidOperationException($"No assembly name specified {fqn}"); + + string assemblySpan = assemblyStart.Slice(assemblyEnd).Trim().ToString(); + ReadOnlySpan classAndMethod = assemblyStart.Slice(assemblyEnd + 1).Trim(); + + int classNameEnd = classAndMethod.IndexOf(':'); + if (classNameEnd == -1) + throw new InvalidOperationException($"No class name specified {fqn}"); + + ReadOnlySpan classSpan = classAndMethod.Slice(0, classNameEnd).Trim(); + string methodName = classAndMethod.Slice(classNameEnd + 1).Trim().ToString(); - if (string.IsNullOrEmpty(assembly)) - throw new InvalidOperationException("No assembly name specified " + fqn); - if (string.IsNullOrEmpty(className)) - throw new InvalidOperationException("No class name specified " + fqn); if (string.IsNullOrEmpty(methodName)) - throw new InvalidOperationException("No method name specified " + fqn); + throw new InvalidOperationException($"No method name specified {fqn}"); + + int namespaceEnd = classSpan.LastIndexOf('.'); + string className = classSpan.ToString(); + string shortClassName = className; + string nameSpace = string.Empty; + if (namespaceEnd != -1) + { + shortClassName = classSpan.Slice(namespaceEnd + 1).ToString(); + nameSpace = classSpan.Slice(0, namespaceEnd).ToString(); + } return (assembly, className, nameSpace, shortClassName, methodName); } } From bd0c5e49722a0b9269cf8baee5e833557dfd5f3a Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Thu, 15 Feb 2024 20:45:11 -0600 Subject: [PATCH 2/6] Update JSHostImplementation.cs --- .../Runtime/InteropServices/JavaScript/JSHostImplementation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs index c6f5b37f0029ea..f77d913efdee8a 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs @@ -391,7 +391,7 @@ public static IntPtr GetIntPtrFromMethodHandle(RuntimeMethodHandle methodHandle) public static (string assemblyName, string className, string nameSpace, string shortClassName, string methodName) ParseFQN(string fqn) { ReadOnlySpan fqnSpan = fqn.AsSpan(); - ReadOnlySpan assemblyStart = fqnSpan..Slice(fqnSpan.IndexOf('[') + 1); + ReadOnlySpan assemblyStart = fqnSpan.Slice(fqnSpan.IndexOf('[') + 1); int assemblyEnd = assemblyStart.IndexOf(']'); if (assemblyEnd == -1 || assemblyStart.Length == fqnSpan.Length) From ac537834d0973a231869320aaf46ced832cd8e20 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Thu, 15 Feb 2024 21:06:25 -0600 Subject: [PATCH 3/6] Update JSHostImplementation.cs --- .../Runtime/InteropServices/JavaScript/JSHostImplementation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs index f77d913efdee8a..1ef39e02f6f697 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs @@ -391,7 +391,7 @@ public static IntPtr GetIntPtrFromMethodHandle(RuntimeMethodHandle methodHandle) public static (string assemblyName, string className, string nameSpace, string shortClassName, string methodName) ParseFQN(string fqn) { ReadOnlySpan fqnSpan = fqn.AsSpan(); - ReadOnlySpan assemblyStart = fqnSpan.Slice(fqnSpan.IndexOf('[') + 1); + ReadOnlySpan assemblyStart = fqnSpan.Slice(fqnSpan.IndexOf('[') + 1); int assemblyEnd = assemblyStart.IndexOf(']'); if (assemblyEnd == -1 || assemblyStart.Length == fqnSpan.Length) From 8a7fbaa55e545049e32e977d7c57419dae1ca633 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Thu, 15 Feb 2024 21:41:14 -0600 Subject: [PATCH 4/6] Update JSHostImplementation.cs --- .../Runtime/InteropServices/JavaScript/JSHostImplementation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs index 1ef39e02f6f697..47033c9ed28361 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs @@ -397,7 +397,7 @@ public static (string assemblyName, string className, string nameSpace, string s if (assemblyEnd == -1 || assemblyStart.Length == fqnSpan.Length) throw new InvalidOperationException($"No assembly name specified {fqn}"); - string assemblySpan = assemblyStart.Slice(assemblyEnd).Trim().ToString(); + string assembly = assemblyStart.Slice(assemblyEnd).Trim().ToString(); ReadOnlySpan classAndMethod = assemblyStart.Slice(assemblyEnd + 1).Trim(); int classNameEnd = classAndMethod.IndexOf(':'); From b1d941e552b203ca8b7356f6e8b1372f7f9f1f33 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Tue, 20 Feb 2024 20:01:50 -0600 Subject: [PATCH 5/6] Update JSHostImplementation.cs --- .../InteropServices/JavaScript/JSHostImplementation.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs index 0163427af22496..81e07d422e1413 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs @@ -340,13 +340,14 @@ public static (string assemblyName, string nameSpace, string shortClassName, str throw new InvalidOperationException($"No method name specified {fqn}"); int namespaceEnd = classSpan.LastIndexOf('.'); - string className = classSpan.ToString(); - string shortClassName = className; + string shortClassName; string nameSpace = string.Empty; if (namespaceEnd != -1) { shortClassName = classSpan.Slice(namespaceEnd + 1).ToString(); nameSpace = classSpan.Slice(0, namespaceEnd).ToString(); + } else { + shortClassName = classSpan.ToString(); } return (assembly, nameSpace, shortClassName, methodName); } From 4847ee62861e15ef546aad2a57ffe3ee3318b0be Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Tue, 20 Feb 2024 21:07:26 -0600 Subject: [PATCH 6/6] Update JSHostImplementation.cs --- .../Runtime/InteropServices/JavaScript/JSHostImplementation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs index 81e07d422e1413..a713dcc6010f67 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.cs @@ -326,7 +326,7 @@ public static (string assemblyName, string nameSpace, string shortClassName, str if (assemblyEnd == -1 || assemblyStart.Length == fqnSpan.Length) throw new InvalidOperationException($"No assembly name specified {fqn}"); - string assembly = assemblyStart.Slice(assemblyEnd).Trim().ToString(); + string assembly = assemblyStart.Slice(assemblyEnd -1).Trim().ToString(); ReadOnlySpan classAndMethod = assemblyStart.Slice(assemblyEnd + 1).Trim(); int classNameEnd = classAndMethod.IndexOf(':');