Skip to content

Commit

Permalink
Small performance optimization to string handling (#1358)
Browse files Browse the repository at this point in the history
  • Loading branch information
lahma committed Nov 12, 2022
1 parent 0f898f8 commit 402a431
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 92 deletions.
5 changes: 4 additions & 1 deletion Jint/Native/Array/ArrayPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1245,7 +1245,10 @@ static string StringFromJsValue(JsValue value)
sb.Builder.Append(s);
for (uint k = 1; k < len; k++)
{
sb.Builder.Append(sep);
if (sep != "")
{
sb.Builder.Append(sep);
}
sb.Builder.Append(StringFromJsValue(o.Get(k)));
}

Expand Down
11 changes: 0 additions & 11 deletions Jint/Native/JsString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -196,17 +196,6 @@ public override string ToString()
return _value;
}

public JsArray ToArray(Engine engine)
{
var array = engine.Realm.Intrinsics.Array.ArrayCreate((uint) _value.Length);
for (int i = 0; i < _value.Length; ++i)
{
array.SetIndexValue((uint) i, _value[i], updateLength: false);
}

return array;
}

internal int IndexOf(string value, StringComparison comparisonType)
{
return ToString().IndexOf(value, comparisonType);
Expand Down
9 changes: 9 additions & 0 deletions Jint/Native/String/StringConstructor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,16 @@ private static JsValue FromCharCode(JsValue? thisObj, JsValue[] arguments)
return JsString.Empty;
}

if (arguments.Length == 1)
{
return JsString.Create((char) TypeConverter.ToUint16(arguments[0]));
}

#if NETSTANDARD2_1_OR_GREATER
var elements = length < 512 ? stackalloc char[length] : new char[length];
#else
var elements = new char[length];
#endif
for (var i = 0; i < elements.Length; i++ )
{
var nextCu = TypeConverter.ToUint16(arguments[i]);
Expand Down
38 changes: 13 additions & 25 deletions Jint/Native/String/StringPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ private JsValue Slice(JsValue thisObj, JsValue[] arguments)
return JsString.Empty;
}

var s = TypeConverter.ToString(thisObj);
var s = TypeConverter.ToJsString(thisObj);
var end = TypeConverter.ToNumber(arguments.At(1));
if (double.IsPositiveInfinity(end))
{
Expand All @@ -477,7 +477,7 @@ private JsValue Slice(JsValue thisObj, JsValue[] arguments)
return JsString.Create(s[from]);
}

return new JsString(s.Substring(from, span));
return s.Substring(from, span);
}

private JsValue Search(JsValue thisObj, JsValue[] arguments)
Expand All @@ -495,7 +495,7 @@ private JsValue Search(JsValue thisObj, JsValue[] arguments)
}

var rx = (RegExpInstance) _realm.Intrinsics.RegExp.Construct(new[] {regex});
var s = TypeConverter.ToString(thisObj);
var s = TypeConverter.ToJsString(thisObj);
return _engine.Invoke(rx, GlobalSymbolRegistry.Search, new JsValue[] { s });
}

Expand Down Expand Up @@ -665,7 +665,7 @@ private JsValue Match(JsValue thisObj, JsValue[] arguments)

var rx = (RegExpInstance) _realm.Intrinsics.RegExp.Construct(new[] {regex});

var s = TypeConverter.ToString(thisObj);
var s = TypeConverter.ToJsString(thisObj);
return _engine.Invoke(rx, GlobalSymbolRegistry.Match, new JsValue[] { s });
}

Expand All @@ -692,7 +692,7 @@ private JsValue MatchAll(JsValue thisObj, JsValue[] arguments)
}
}

var s = TypeConverter.ToString(thisObj);
var s = TypeConverter.ToJsString(thisObj);
var rx = (RegExpInstance) _realm.Intrinsics.RegExp.Construct(new[] { regex, "g" });

return _engine.Invoke(rx, GlobalSymbolRegistry.MatchAll, new JsValue[] { s });
Expand Down Expand Up @@ -787,30 +787,18 @@ private JsValue Concat(JsValue thisObj, JsValue[] arguments)
{
TypeConverter.CheckObjectCoercible(Engine, thisObj);

// try to hint capacity if possible
int capacity = 0;
for (int i = 0; i < arguments.Length; ++i)
{
if (arguments[i].Type == Types.String)
{
capacity += arguments[i].ToString().Length;
}
}

var value = TypeConverter.ToString(thisObj);
capacity += value.Length;
if (!(thisObj is JsString jsString))
if (thisObj is not JsString jsString)
{
jsString = new JsString.ConcatenatedString(value, capacity);
jsString = new JsString.ConcatenatedString(TypeConverter.ToString(thisObj));
}
else
{
jsString = jsString.EnsureCapacity(capacity);
jsString = jsString.EnsureCapacity(0);
}

for (int i = 0; i < arguments.Length; i++)
foreach (var argument in arguments)
{
jsString = jsString.Append(arguments[i]);
jsString = jsString.Append(argument);
}

return jsString;
Expand All @@ -821,8 +809,8 @@ private JsValue CharCodeAt(JsValue thisObj, JsValue[] arguments)
TypeConverter.CheckObjectCoercible(Engine, thisObj);

JsValue pos = arguments.Length > 0 ? arguments[0] : 0;
var s = TypeConverter.ToString(thisObj);
var position = (int)TypeConverter.ToInteger(pos);
var s = TypeConverter.ToJsString(thisObj);
var position = (int) TypeConverter.ToInteger(pos);
if (position < 0 || position >= s.Length)
{
return JsNumber.DoubleNaN;
Expand Down Expand Up @@ -860,7 +848,7 @@ private JsValue CodePointAt(JsValue thisObj, JsValue[] arguments)
private JsValue CharAt(JsValue thisObj, JsValue[] arguments)
{
TypeConverter.CheckObjectCoercible(Engine, thisObj);
var s = TypeConverter.ToString(thisObj);
var s = TypeConverter.ToJsString(thisObj);
var position = TypeConverter.ToInteger(arguments.At(0));
var size = s.Length;
if (position >= size || position < 0)
Expand Down

0 comments on commit 402a431

Please sign in to comment.