Browse Source

Ensure proper ValueStringBuilder dispose when needed (#1699)

Marko Lahma 1 year ago
parent
commit
a6419328c9

+ 5 - 9
Jint/Extensions/Polyfills.cs

@@ -1,21 +1,17 @@
-using System.Runtime.CompilerServices;
-
 namespace Jint;
 namespace Jint;
 
 
 internal static class Polyfills
 internal static class Polyfills
 {
 {
 #if NETFRAMEWORK || NETSTANDARD2_0
 #if NETFRAMEWORK || NETSTANDARD2_0
-    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
     internal static bool Contains(this string source, char c) => source.IndexOf(c) != -1;
     internal static bool Contains(this string source, char c) => source.IndexOf(c) != -1;
+
+    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
+    internal static bool StartsWith(this string source, char c) => source.Length > 0 && source[0] == c;
 #endif
 #endif
 
 
 #if NETFRAMEWORK
 #if NETFRAMEWORK
-    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
     internal static bool Contains(this ReadOnlySpan<string> source, string c) => source.IndexOf(c) != -1;
     internal static bool Contains(this ReadOnlySpan<string> source, string c) => source.IndexOf(c) != -1;
 #endif
 #endif
-
-#if NETFRAMEWORK || NETSTANDARD2_0
-    [MethodImpl(MethodImplOptions.AggressiveInlining)]
-    internal static bool StartsWith(this string source, char c) => source.Length > 0 && source[0] == c;
-#endif
 }
 }

+ 1 - 1
Jint/Native/Array/ArrayPrototype.cs

@@ -1265,7 +1265,7 @@ namespace Jint.Native.Array
                 return s;
                 return s;
             }
             }
 
 
-            var sb = new ValueStringBuilder(stackalloc char[256]);
+            using var sb = new ValueStringBuilder(stackalloc char[256]);
             sb.Append(s);
             sb.Append(s);
             for (uint k = 1; k < len; k++)
             for (uint k = 1; k < len; k++)
             {
             {

+ 5 - 5
Jint/Native/Json/JsonParser.cs

@@ -170,9 +170,9 @@ namespace Jint.Native.Json
             }
             }
         }
         }
 
 
-        private Token ScanNumericLiteral(ref State state)
+        private Token ScanNumericLiteral()
         {
         {
-            var sb = new ValueStringBuilder(stackalloc char[64]);
+            using var sb = new ValueStringBuilder(stackalloc char[64]);
             var start = _index;
             var start = _index;
             var ch = _source.CharCodeAt(_index);
             var ch = _source.CharCodeAt(_index);
             var canBeInteger = true;
             var canBeInteger = true;
@@ -309,7 +309,7 @@ namespace Jint.Native.Json
             int start = _index;
             int start = _index;
             ++_index;
             ++_index;
 
 
-            var sb = new ValueStringBuilder(stackalloc char[64]);
+            using var sb = new ValueStringBuilder(stackalloc char[64]);
             while (_index < _length)
             while (_index < _length)
             {
             {
                 char ch = _source[_index++];
                 char ch = _source[_index++];
@@ -403,14 +403,14 @@ namespace Jint.Native.Json
             {
             {
                 if (IsDecimalDigit(_source.CharCodeAt(_index + 1)))
                 if (IsDecimalDigit(_source.CharCodeAt(_index + 1)))
                 {
                 {
-                    return ScanNumericLiteral(ref state);
+                    return ScanNumericLiteral();
                 }
                 }
                 return ScanPunctuator();
                 return ScanPunctuator();
             }
             }
 
 
             if (IsDecimalDigit(ch))
             if (IsDecimalDigit(ch))
             {
             {
-                return ScanNumericLiteral(ref state);
+                return ScanNumericLiteral();
             }
             }
 
 
             if (ch == 't' || ch == 'f')
             if (ch == 't' || ch == 'f')

+ 12 - 5
Jint/Native/Json/JsonSerializer.cs

@@ -52,13 +52,20 @@ namespace Jint.Native.Json
             var wrapper = _engine.Realm.Intrinsics.Object.Construct(Arguments.Empty);
             var wrapper = _engine.Realm.Intrinsics.Object.Construct(Arguments.Empty);
             wrapper.DefineOwnProperty(JsString.Empty, new PropertyDescriptor(value, PropertyFlag.ConfigurableEnumerableWritable));
             wrapper.DefineOwnProperty(JsString.Empty, new PropertyDescriptor(value, PropertyFlag.ConfigurableEnumerableWritable));
 
 
-            var jsonBuilder = new ValueStringBuilder();
-            if (SerializeJSONProperty(JsString.Empty, wrapper, ref jsonBuilder) == SerializeResult.Undefined)
+            string result;
+            var json = new ValueStringBuilder();
+            try
             {
             {
-                return JsValue.Undefined;
+                if (SerializeJSONProperty(JsString.Empty, wrapper, ref json) == SerializeResult.Undefined)
+                {
+                    return JsValue.Undefined;
+                }
             }
             }
-
-            return new JsString(jsonBuilder.ToString());
+            finally
+            {
+                result = json.ToString();
+            }
+            return new JsString(result);
         }
         }
 
 
         private void SetupReplacer(JsValue replacer)
         private void SetupReplacer(JsValue replacer)

+ 2 - 2
Jint/Native/Number/NumberPrototype.cs

@@ -418,7 +418,7 @@ namespace Jint.Native.Number
                 return "0";
                 return "0";
             }
             }
 
 
-            using var sb = new ValueStringBuilder(stackalloc char[64]);
+            var sb = new ValueStringBuilder(stackalloc char[64]);
             while (n > 0)
             while (n > 0)
             {
             {
                 var digit = (int) (n % radix);
                 var digit = (int) (n % radix);
@@ -440,7 +440,7 @@ namespace Jint.Native.Number
                 return "0";
                 return "0";
             }
             }
 
 
-            using var result = new ValueStringBuilder(stackalloc char[64]);
+            var result = new ValueStringBuilder(stackalloc char[64]);
             while (n > 0 && result.Length < 50) // arbitrary limit
             while (n > 0 && result.Length < 50) // arbitrary limit
             {
             {
                 var c = n*radix;
                 var c = n*radix;

+ 1 - 1
Jint/Native/RegExp/RegExpPrototype.cs

@@ -337,7 +337,7 @@ namespace Jint.Native.RegExp
             // $`	Inserts the portion of the string that precedes the matched substring.
             // $`	Inserts the portion of the string that precedes the matched substring.
             // $'	Inserts the portion of the string that follows the matched substring.
             // $'	Inserts the portion of the string that follows the matched substring.
             // $n or $nn	Where n or nn are decimal digits, inserts the nth parenthesized submatch string, provided the first argument was a RegExp object.
             // $n or $nn	Where n or nn are decimal digits, inserts the nth parenthesized submatch string, provided the first argument was a RegExp object.
-            var sb = new ValueStringBuilder(stackalloc char[128]);
+            using var sb = new ValueStringBuilder(stackalloc char[128]);
             for (var i = 0; i < replacement.Length; i++)
             for (var i = 0; i < replacement.Length; i++)
             {
             {
                 char c = replacement[i];
                 char c = replacement[i];

+ 2 - 2
Jint/Native/String/StringConstructor.cs

@@ -82,7 +82,7 @@ namespace Jint.Native.String
         private JsValue FromCodePoint(JsValue thisObject, JsValue[] arguments)
         private JsValue FromCodePoint(JsValue thisObject, JsValue[] arguments)
         {
         {
             JsNumber codePoint;
             JsNumber codePoint;
-            var result = new ValueStringBuilder(stackalloc char[128]);
+            using var result = new ValueStringBuilder(stackalloc char[128]);
             foreach (var a in arguments)
             foreach (var a in arguments)
             {
             {
                 int point;
                 int point;
@@ -144,7 +144,7 @@ namespace Jint.Native.String
                 return JsString.Empty;
                 return JsString.Empty;
             }
             }
 
 
-            var result = new ValueStringBuilder();
+            using var result = new ValueStringBuilder();
             for (var i = 0; i < length; i++)
             for (var i = 0; i < length; i++)
             {
             {
                 if (i > 0)
                 if (i > 0)

+ 1 - 1
Jint/Native/String/StringPrototype.cs

@@ -642,7 +642,7 @@ namespace Jint.Native.String
             var advanceBy = System.Math.Max(1, searchLength);
             var advanceBy = System.Math.Max(1, searchLength);
 
 
             var endOfLastMatch = 0;
             var endOfLastMatch = 0;
-            var result = new ValueStringBuilder();
+            using var result = new ValueStringBuilder();
 
 
             var position = StringIndexOf(thisString, searchString, 0);
             var position = StringIndexOf(thisString, searchString, 0);
             while (position != -1)
             while (position != -1)

+ 1 - 1
Jint/Native/TypedArray/IntrinsicTypedArrayPrototype.cs

@@ -637,7 +637,7 @@ namespace Jint.Native.TypedArray
                 return s;
                 return s;
             }
             }
 
 
-            var result = new ValueStringBuilder();
+            using var result = new ValueStringBuilder();
             result.Append(s);
             result.Append(s);
             for (var k = 1; k < len; k++)
             for (var k = 1; k < len; k++)
             {
             {

+ 1 - 1
Jint/Runtime/Interpreter/Expressions/JintTemplateLiteralExpression.cs

@@ -40,7 +40,7 @@ internal sealed class JintTemplateLiteralExpression : JintExpression
             _initialized = true;
             _initialized = true;
         }
         }
 
 
-        var sb = new ValueStringBuilder();
+        using var sb = new ValueStringBuilder();
         ref readonly var elements = ref _templateLiteralExpression.Quasis;
         ref readonly var elements = ref _templateLiteralExpression.Quasis;
         for (var i = 0; i < elements.Count; i++)
         for (var i = 0; i < elements.Count; i++)
         {
         {

+ 0 - 2
Jint/Runtime/TypeConverter.cs

@@ -2,13 +2,11 @@ using System.Globalization;
 using System.Numerics;
 using System.Numerics;
 using System.Reflection;
 using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
-using System.Text;
 using Esprima;
 using Esprima;
 using Esprima.Ast;
 using Esprima.Ast;
 using Jint.Extensions;
 using Jint.Extensions;
 using Jint.Native;
 using Jint.Native;
 using Jint.Native.Number;
 using Jint.Native.Number;
-using Jint.Native.Number.Dtoa;
 using Jint.Native.Object;
 using Jint.Native.Object;
 using Jint.Native.String;
 using Jint.Native.String;
 using Jint.Native.Symbol;
 using Jint.Native.Symbol;