Skip to content

Commit

Permalink
StringSpan Removed from JSString to reduce allocations #96
Browse files Browse the repository at this point in the history
  • Loading branch information
ackava committed Nov 9, 2023
1 parent de6c76e commit e30f424
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 62 deletions.
2 changes: 1 addition & 1 deletion YantraJS.Core/Core/Arguments.cs
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,7 @@ public IElementEnumerator GetElementEnumerator()
[CallerFilePath] string? filePath = null,
[CallerLineNumber] int line = 0)
{
return this[index] is JSString s ? s.Value : throw new JSException(
return this[index] is JSString s ? s.value : throw new JSException(
name + " is required", function, filePath, line);
}

Expand Down
2 changes: 1 addition & 1 deletion YantraJS.Core/Core/Clr/ClrProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ public override bool StrictEquals(JSValue value)
//if (this.value.ToString() == proxy.value.ToString())
// return true;
break;
case JSString @string when @string.Value.Equals(this.value):
case JSString @string when @string.value.Equals(this.value):
return true;
case JSNumber number:
switch (this.value)
Expand Down
2 changes: 1 addition & 1 deletion YantraJS.Core/Core/Function/JSFunction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ internal static JSValue Constructor(in Arguments args)
}
}

var bodyText = body is JSString @string ? @string.Value : body.ToString();
var bodyText = body is JSString @string ? @string.value : body.ToString();
string location = null;
JSContext.Current.DispatchEvalEvent(ref bodyText, ref location);

Expand Down
4 changes: 2 additions & 2 deletions YantraJS.Core/Core/Global/JSGlobal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ public static JSValue Eval(in Arguments a)
var f = a.Get1();
if (!f.IsString)
return f;
var text = (f as JSString).Value;
var text = (f as JSString).value;
string location = null;
JSContext.Current.DispatchEvalEvent(ref text, ref location);
return CoreScript.Evaluate(text.Value, null);
return CoreScript.Evaluate(text, null);
}

[JSExport("encodeURI", Length = 1)]
Expand Down
4 changes: 2 additions & 2 deletions YantraJS.Core/Core/JSContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public class EvalEventArgs: EventArgs
{
public JSContext Context { get; set; }

public StringSpan Script { get; set; }
public string Script { get; set; }

public string Location { get; set; }
}
Expand Down Expand Up @@ -178,7 +178,7 @@ internal Task WaitTask

public event EventHandler<EvalEventArgs> EvalEvent;

internal void DispatchEvalEvent(ref StringSpan script, ref string location)
internal void DispatchEvalEvent(ref string script, ref string location)
{
var ee = EvalEvent;
if (ee != null)
Expand Down
8 changes: 4 additions & 4 deletions YantraJS.Core/Core/JSValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ public virtual bool Less(JSValue value)
if (this.DoubleValue < value.DoubleValue)
return true;
}
else if (this.ToString().CompareTo(value.ToString()) < 0)
else if (this.ToString().Less(value.ToString()))
return true;
}
return false;
Expand All @@ -651,7 +651,7 @@ public virtual bool LessOrEqual(JSValue value)
if (this.DoubleValue <= value.DoubleValue)
return true;
}
else if (this.ToString().CompareTo(value.ToString()) <= 0)
else if (this.ToString().LessOrEqual(value.ToString()))
return true;
}
return false;
Expand All @@ -667,7 +667,7 @@ public virtual bool Greater(JSValue value)
if (this.DoubleValue > value.DoubleValue)
return true;
}
else if (this.ToString().CompareTo(value.ToString()) > 0)
else if (this.ToString().Greater(value.ToString()))
return true;
}
return false;
Expand All @@ -681,7 +681,7 @@ public virtual bool GreaterOrEqual(JSValue value)
if (this.DoubleValue >= value.DoubleValue)
return true;
}
else if (this.ToString().CompareTo(value.ToString()) >= 0)
else if (this.ToString().Greater(value.ToString()))
return true;
}
return false;
Expand Down
2 changes: 1 addition & 1 deletion YantraJS.Core/Core/Json/JSJSON.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ public static string Stringify(JSValue value)
sb.Write(n.value.ToString());
return;
case JSString str:
QuoteString(str.Value, sb);
QuoteString(str.value, sb);
return;
case JSFunction _:
return;
Expand Down
2 changes: 1 addition & 1 deletion YantraJS.Core/Core/Object/JSObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -963,7 +963,7 @@ public override bool Equals(JSValue value)
if (Object.ReferenceEquals(this, value))
return true;
if (value is JSString str)
if (str.Value.Equals(this.ToString()))
if (str.value.Equals(this.ToString()))
return true;
if (DoubleValue == value.DoubleValue)
return true;
Expand Down
50 changes: 21 additions & 29 deletions YantraJS.Core/Core/String/JSString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ public partial class JSString : JSPrimitive

internal static JSString Empty = new JSString(string.Empty);

internal StringSpan Value => value;

private StringSpan value;
internal readonly string value;
KeyString _keyString;

private double NumberValue = 0;
Expand Down Expand Up @@ -54,59 +52,59 @@ public override double DoubleValue

public override JSValue AddValue(double value)
{
if (this.value.IsEmpty)
if (this.value.IsEmpty())
return new JSString(value.ToString());
return new JSString( StringSpan.Concat(in this.value, value.ToString()) );
return new JSString( string.Concat(this.value, value.ToString()) );
}

public override JSValue AddValue(string value)
{
if (this.value.IsEmpty)
if (this.value.IsEmpty())
return new JSString(value);
return new JSString( StringSpan.Concat(in this.value, value));
return new JSString( string.Concat(this.value, value));
}

public override JSValue AddValue(JSValue value)
{
if (value is JSString vString)
{
if (this.value.IsEmpty)
if (this.value.IsEmpty())
{
return vString;
}
if (vString.value.IsEmpty)
if (vString.value.IsEmpty())
{
return this;
}
return new JSString(StringSpan.Concat(in this.value, in vString.value));
return new JSString(string.Concat(this.value, vString.value));
}

if (value.IsObject)
{
value = value.ValueOf();
}

if (this.value.IsEmpty)
if (this.value.IsEmpty())
return new JSString(value.StringValue);

var v = value.StringValue;
if (v.Length == 0)
{
return this;
}
return new JSString(StringSpan.Concat(in this.value, v));
return new JSString(string.Concat(this.value, v));
}

public override bool ConvertTo(Type type, out object value)
{
if (type == typeof(string))
{
value = this.value.Value;
value = this.value;
return true;
}
if (type == typeof(object))
{
value = this.value.Value;
value = this.value;
return true;
}
if(type == typeof(char))
Expand Down Expand Up @@ -162,7 +160,7 @@ public JSString(JSObject prototype, string value): base(prototype)

public JSString(in StringSpan value) : base()
{
this.value = value;
this.value = value.Value;
}


Expand Down Expand Up @@ -190,28 +188,23 @@ public override JSValue TypeOf()

public override string ToString()
{
if(value.Offset == 0 && value.Length == value.Source.Length)
{
return value.Source;
}
value = new StringSpan(value.Value);
return value.Value;
return value;
}

public byte[] Encode(System.Text.Encoding encoding)
{
return value.Encode(encoding);
return encoding.GetBytes(value);
}

public override string ToDetailString()
{
return value.Value;
return value;
}

public override string ToLocaleString(string format, CultureInfo culture)
{

return value.Value;
return value;

}

Expand Down Expand Up @@ -304,8 +297,7 @@ public override bool Less(JSValue value)
{
return this.DoubleValue < value.DoubleValue;
}
int n = this.value.CompareTo(value.ToString());
return n < 0;
return this.value.Less(value.ToString());

}

Expand All @@ -317,7 +309,7 @@ public override bool LessOrEqual(JSValue value)
{
return (this.DoubleValue <= value.DoubleValue);
}
return this.value.CompareTo(value.ToString()) <= 0;
return this.value.LessOrEqual(value.ToString());
}

public override bool Greater(JSValue value)
Expand All @@ -328,7 +320,7 @@ public override bool Greater(JSValue value)
{
return (this.DoubleValue > value.DoubleValue);
}
return this.value.CompareTo(value.ToString()) > 0;
return this.value.Greater(value.ToString());
}

public override bool GreaterOrEqual(JSValue value)
Expand All @@ -339,7 +331,7 @@ public override bool GreaterOrEqual(JSValue value)
{
return (this.DoubleValue >= value.DoubleValue);
}
return this.value.CompareTo(value.ToString()) >= 0;
return this.value.GreaterOrEqual(value.ToString());
}

public override bool StrictEquals(JSValue value)
Expand Down
30 changes: 10 additions & 20 deletions YantraJS.Core/Core/String/JSTemplateString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,6 @@ public void Add(string t)

public unsafe void Add(JSValue value)
{
if (value is JSString @string)
{
var span = @string.Value;
fixed (char* start = span.Source)
{
char* ch1 = start + (span.Offset);
sb.Append(ch1, span.Length);
}
return;
}
sb.Append(value.ToString());
}

Expand All @@ -40,16 +30,16 @@ public JSTemplateString AddQuasi(string text)

public unsafe JSTemplateString AddExpression(JSValue value)
{
if (value is JSString @string)
{
var span = @string.Value;
fixed (char* start = span.Source)
{
char* ch1 = start + (span.Offset);
sb.Append(ch1, span.Length);
}
return this;
}
//if (value is JSString @string)
//{
// var span = @string.Value;
// fixed (char* start = span.Source)
// {
// char* ch1 = start + (span.Offset);
// sb.Append(ch1, span.Length);
// }
// return this;
//}
sb.Append(value.ToString());
return this;
}
Expand Down
27 changes: 27 additions & 0 deletions YantraJS.Core/Extensions/StringExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,39 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;

namespace YantraJS
{
internal static class StringExtensions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsEmpty(this string str)
{
return string.IsNullOrEmpty(str);
}

public static bool Greater(this string left, string right) {
return string.CompareOrdinal(left, right) > 0;
}

public static bool GreaterOrEqual(this string left, string right)
{
return string.CompareOrdinal(left, right) >= 0;
}


public static bool Less(this string left, string right)
{
return string.CompareOrdinal(left, right) < 0;
}

public static bool LessOrEqual(this string left, string right)
{
return string.CompareOrdinal(left, right) <= 0;
}


public static string ToCamelCase(this string text)
{
Expand Down

0 comments on commit e30f424

Please sign in to comment.