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 736f2de5a134d1..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 @@ -319,26 +319,36 @@ public static RuntimeMethodHandle GetMethodHandleFromIntPtr(IntPtr ptr) public static (string assemblyName, 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 assembly = assemblyStart.Slice(assemblyEnd -1).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 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); } }