|
@@ -1,3 +1,4 @@
|
|
|
+using System.Collections.Concurrent;
|
|
|
using System.Diagnostics;
|
|
|
using System.Text;
|
|
|
using Jint.Runtime;
|
|
@@ -12,27 +13,29 @@ public class JsString : JsValue, IEquatable<JsString>, IEquatable<string>
|
|
|
private static readonly JsString[] _charToStringJsValue;
|
|
|
private static readonly JsString[] _intToStringJsValue;
|
|
|
|
|
|
- public static readonly JsString Empty = new JsString("");
|
|
|
- internal static readonly JsString NullString = new JsString("null");
|
|
|
- internal static readonly JsString UndefinedString = new JsString("undefined");
|
|
|
- internal static readonly JsString ObjectString = new JsString("object");
|
|
|
- internal static readonly JsString FunctionString = new JsString("function");
|
|
|
- internal static readonly JsString BooleanString = new JsString("boolean");
|
|
|
- internal static readonly JsString StringString = new JsString("string");
|
|
|
- internal static readonly JsString NumberString = new JsString("number");
|
|
|
- internal static readonly JsString BigIntString = new JsString("bigint");
|
|
|
- internal static readonly JsString SymbolString = new JsString("symbol");
|
|
|
- internal static readonly JsString DefaultString = new JsString("default");
|
|
|
- internal static readonly JsString NumberZeroString = new JsString("0");
|
|
|
- internal static readonly JsString NumberOneString = new JsString("1");
|
|
|
- internal static readonly JsString TrueString = new JsString("true");
|
|
|
- internal static readonly JsString FalseString = new JsString("false");
|
|
|
- internal static readonly JsString LengthString = new JsString("length");
|
|
|
- internal static readonly JsValue CommaString = new JsString(",");
|
|
|
+ public static readonly JsString Empty;
|
|
|
+ internal static readonly JsString NullString;
|
|
|
+ internal static readonly JsString UndefinedString;
|
|
|
+ internal static readonly JsString ObjectString;
|
|
|
+ internal static readonly JsString FunctionString;
|
|
|
+ internal static readonly JsString BooleanString;
|
|
|
+ internal static readonly JsString StringString;
|
|
|
+ internal static readonly JsString NumberString;
|
|
|
+ internal static readonly JsString BigIntString;
|
|
|
+ internal static readonly JsString SymbolString;
|
|
|
+ internal static readonly JsString DefaultString;
|
|
|
+ internal static readonly JsString NumberZeroString;
|
|
|
+ internal static readonly JsString NumberOneString;
|
|
|
+ internal static readonly JsString TrueString;
|
|
|
+ internal static readonly JsString FalseString;
|
|
|
+ internal static readonly JsString LengthString;
|
|
|
+ internal static readonly JsValue CommaString;
|
|
|
|
|
|
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
|
internal string _value;
|
|
|
|
|
|
+ private static ConcurrentDictionary<string, JsString> _stringCache;
|
|
|
+
|
|
|
static JsString()
|
|
|
{
|
|
|
_charToJsValue = new JsString[AsciiMax + 1];
|
|
@@ -49,6 +52,26 @@ public class JsString : JsValue, IEquatable<JsString>, IEquatable<string>
|
|
|
{
|
|
|
_intToStringJsValue[i] = new JsString(TypeConverter.ToString(i));
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ _stringCache = new ConcurrentDictionary<string, JsString>();
|
|
|
+ Empty = new JsString("", InternalTypes.String);
|
|
|
+ NullString = CachedCreate("null");
|
|
|
+ UndefinedString = CachedCreate("undefined");
|
|
|
+ ObjectString = CachedCreate("object");
|
|
|
+ FunctionString = CachedCreate("function");
|
|
|
+ BooleanString = CachedCreate("boolean");
|
|
|
+ StringString = CachedCreate("string");
|
|
|
+ NumberString = CachedCreate("number");
|
|
|
+ BigIntString = CachedCreate("bigint");
|
|
|
+ SymbolString = CachedCreate("symbol");
|
|
|
+ DefaultString = CachedCreate("default");
|
|
|
+ NumberZeroString = CachedCreate("0");
|
|
|
+ NumberOneString = CachedCreate("1");
|
|
|
+ TrueString = CachedCreate("true");
|
|
|
+ FalseString = CachedCreate("false");
|
|
|
+ LengthString = CachedCreate("length");
|
|
|
+ CommaString = CachedCreate(",");
|
|
|
}
|
|
|
|
|
|
public JsString(string value) : this(value, InternalTypes.String)
|
|
@@ -146,6 +169,16 @@ public class JsString : JsValue, IEquatable<JsString>, IEquatable<string>
|
|
|
return new JsString(value);
|
|
|
}
|
|
|
|
|
|
+ internal static JsString CachedCreate(string value)
|
|
|
+ {
|
|
|
+ if (value.Length < 2)
|
|
|
+ {
|
|
|
+ return Create(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ return _stringCache.GetOrAdd(value, static x => new JsString(x));
|
|
|
+ }
|
|
|
+
|
|
|
internal static JsString Create(char value)
|
|
|
{
|
|
|
var temp = _charToJsValue;
|