public TypedArrayInstance From(object source, FunctionInstance mapFn = null, object thisArg = null)
{
var items = TypeConverter.ToObject(Engine, source);
var iterator = TypeUtilities.GetIterator(Engine, items);
if (iterator != null)
{
// Loop.
var values = new List <object>();
foreach (var value in TypeUtilities.Iterate(Engine, iterator))
{
// Collect the values.
values.Add(value);
}
// Convert the values into a typed array instance.
var result = new TypedArrayInstance(this.InstancePrototype, this.type,
Engine.ArrayBuffer.Construct(values.Count * BytesPerElement), 0, values.Count);
for (int i = 0; i < values.Count; i++)
{
if (mapFn != null)
{
result[i] = mapFn.CallFromNative("from", thisArg, values[i], i);
}
else
{
result[i] = values[i];
}
}
return(result);
}
else
{
// There was no iterator symbol value, so fall back on the alternate method.
int length = TypeConverter.ToInt32(items["length"]);
var result = new TypedArrayInstance(this.InstancePrototype, this.type, Engine.ArrayBuffer.Construct(length * BytesPerElement), 0, length);
for (int i = 0; i < length; i++)
{
if (mapFn != null)
{
result[i] = mapFn.CallFromNative("from", thisArg, items[i], i);
}
else
{
result[i] = items[i];
}
}
return(result);
}
}