|
@@ -1,6 +1,5 @@
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
-using System.Text;
|
|
|
using Jint.Native.Object;
|
|
|
using Jint.Runtime;
|
|
|
using Jint.Runtime.Descriptors;
|
|
@@ -14,12 +13,6 @@ namespace Jint.Native.Array
|
|
|
/// </summary>
|
|
|
public sealed class ArrayPrototype : ArrayInstance
|
|
|
{
|
|
|
- private readonly StringBuilder _arrayJoinBuilder = new StringBuilder();
|
|
|
- private JsValue[] _callArray1;
|
|
|
- private JsValue[] _callArray2;
|
|
|
- private JsValue[] _callArray3;
|
|
|
- private JsValue[] _callArray4;
|
|
|
-
|
|
|
private ArrayPrototype(Engine engine) : base(engine)
|
|
|
{
|
|
|
}
|
|
@@ -150,8 +143,7 @@ namespace Jint.Native.Array
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- var args = _callArray4 = _callArray4 ?? new JsValue[4];
|
|
|
+ var args = new JsValue[4];
|
|
|
while (k < len)
|
|
|
{
|
|
|
var i = (uint) k;
|
|
@@ -183,15 +175,15 @@ namespace Jint.Native.Array
|
|
|
var a = (ArrayInstance) Engine.Array.Construct(Arguments.Empty);
|
|
|
|
|
|
uint to = 0;
|
|
|
- var jsValues = _callArray3 = _callArray3 ?? new JsValue[3];
|
|
|
+ var args = new JsValue[3];
|
|
|
for (uint k = 0; k < len; k++)
|
|
|
{
|
|
|
if (o.TryGetValue(k, out var kvalue))
|
|
|
{
|
|
|
- jsValues[0] = kvalue;
|
|
|
- jsValues[1] = k;
|
|
|
- jsValues[2] = o.Target;
|
|
|
- var selected = callable.Call(thisArg, jsValues);
|
|
|
+ args[0] = kvalue;
|
|
|
+ args[1] = k;
|
|
|
+ args[2] = o.Target;
|
|
|
+ var selected = callable.Call(thisArg, args);
|
|
|
if (TypeConverter.ToBoolean(selected))
|
|
|
{
|
|
|
a.SetIndexValue(to, kvalue, throwOnError: false);
|
|
@@ -213,18 +205,16 @@ namespace Jint.Native.Array
|
|
|
|
|
|
var callable = callbackfn.TryCast<ICallable>(x => throw new JavaScriptException(Engine.TypeError, "Argument must be callable"));
|
|
|
|
|
|
- var args = _callArray1 = _callArray1 ?? new JsValue[1];
|
|
|
- args[0] = len;
|
|
|
- var a = Engine.Array.Construct(args, len);
|
|
|
- var jsValues = _callArray3 = _callArray3 ?? new JsValue[3];
|
|
|
+ var a = Engine.Array.Construct(new JsValue[] {len}, len);
|
|
|
+ var args = new JsValue[3];
|
|
|
for (uint k = 0; k < len; k++)
|
|
|
{
|
|
|
if (o.TryGetValue(k, out var kvalue))
|
|
|
{
|
|
|
- jsValues[0] = kvalue;
|
|
|
- jsValues[1] = k;
|
|
|
- jsValues[2] = o.Target;
|
|
|
- var mappedValue = callable.Call(thisArg, jsValues);
|
|
|
+ args[0] = kvalue;
|
|
|
+ args[1] = k;
|
|
|
+ args[2] = o.Target;
|
|
|
+ var mappedValue = callable.Call(thisArg, args);
|
|
|
a.SetIndexValue(k, mappedValue, throwOnError: false);
|
|
|
}
|
|
|
}
|
|
@@ -242,15 +232,15 @@ namespace Jint.Native.Array
|
|
|
|
|
|
var callable = callbackfn.TryCast<ICallable>(x => throw new JavaScriptException(Engine.TypeError, "Argument must be callable"));
|
|
|
|
|
|
- var jsValues = _callArray3 = _callArray3 ?? new JsValue[3];
|
|
|
+ var args = new JsValue[3];
|
|
|
for (uint k = 0; k < len; k++)
|
|
|
{
|
|
|
if (o.TryGetValue(k, out var kvalue))
|
|
|
{
|
|
|
- jsValues[0] = kvalue;
|
|
|
- jsValues[1] = k;
|
|
|
- jsValues[2] = o.Target;
|
|
|
- callable.Call(thisArg, jsValues);
|
|
|
+ args[0] = kvalue;
|
|
|
+ args[1] = k;
|
|
|
+ args[2] = o.Target;
|
|
|
+ callable.Call(thisArg, args);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -267,15 +257,15 @@ namespace Jint.Native.Array
|
|
|
|
|
|
var callable = callbackfn.TryCast<ICallable>(x => throw new JavaScriptException(Engine.TypeError, "Argument must be callable"));
|
|
|
|
|
|
- var jsValues = _callArray3 = _callArray3 ?? new JsValue[3];
|
|
|
+ var args = new JsValue[3];
|
|
|
for (uint k = 0; k < len; k++)
|
|
|
{
|
|
|
if (o.TryGetValue(k, out var kvalue))
|
|
|
{
|
|
|
- jsValues[0] = kvalue;
|
|
|
- jsValues[1] = k;
|
|
|
- jsValues[2] = o.Target;
|
|
|
- var testResult = callable.Call(thisArg, jsValues);
|
|
|
+ args[0] = kvalue;
|
|
|
+ args[1] = k;
|
|
|
+ args[2] = o.Target;
|
|
|
+ var testResult = callable.Call(thisArg, args);
|
|
|
if (TypeConverter.ToBoolean(testResult))
|
|
|
{
|
|
|
return true;
|
|
@@ -296,15 +286,15 @@ namespace Jint.Native.Array
|
|
|
|
|
|
var callable = callbackfn.TryCast<ICallable>(x => throw new JavaScriptException(Engine.TypeError, "Argument must be callable"));
|
|
|
|
|
|
- var jsValues = _callArray3 = _callArray3 ?? new JsValue[3];
|
|
|
+ var args = new JsValue[3];
|
|
|
for (uint k = 0; k < len; k++)
|
|
|
{
|
|
|
if (o.TryGetValue(k, out var kvalue))
|
|
|
{
|
|
|
- jsValues[0] = kvalue;
|
|
|
- jsValues[1] = k;
|
|
|
- jsValues[2] = o.Target;
|
|
|
- var testResult = callable.Call(thisArg, jsValues);
|
|
|
+ args[0] = kvalue;
|
|
|
+ args[1] = k;
|
|
|
+ args[2] = o.Target;
|
|
|
+ var testResult = callable.Call(thisArg, args);
|
|
|
if (false == TypeConverter.ToBoolean(testResult))
|
|
|
{
|
|
|
return JsBoolean.False;
|
|
@@ -531,10 +521,7 @@ namespace Jint.Native.Array
|
|
|
|
|
|
if (compareFn != null)
|
|
|
{
|
|
|
- var args = _callArray2 = _callArray2 ?? new JsValue[2];
|
|
|
- args[0] = x;
|
|
|
- args[1] = y;
|
|
|
- var s = TypeConverter.ToNumber(compareFn.Call(Undefined, args));
|
|
|
+ var s = TypeConverter.ToNumber(compareFn.Call(Undefined, new[] {x, y}));
|
|
|
if (s < 0)
|
|
|
{
|
|
|
return -1;
|
|
@@ -727,15 +714,16 @@ namespace Jint.Native.Array
|
|
|
return s;
|
|
|
}
|
|
|
|
|
|
- _arrayJoinBuilder.Clear();
|
|
|
- _arrayJoinBuilder.Append(s);
|
|
|
+ var sb = ArrayExecutionContext.Current.StringBuilder;
|
|
|
+ sb.Clear();
|
|
|
+ sb.Append(s);
|
|
|
for (uint k = 1; k < len; k++)
|
|
|
{
|
|
|
- _arrayJoinBuilder.Append(sep);
|
|
|
- _arrayJoinBuilder.Append(StringFromJsValue(o.Get(k)));
|
|
|
+ sb.Append(sep);
|
|
|
+ sb.Append(StringFromJsValue(o.Get(k)));
|
|
|
}
|
|
|
|
|
|
- return _arrayJoinBuilder.ToString();
|
|
|
+ return sb.ToString();
|
|
|
}
|
|
|
|
|
|
private JsValue ToLocaleString(JsValue thisObj, JsValue[] arguments)
|