private static object Walk(Context cx, Scriptable scope, Callable reviver, Scriptable holder, object name)
{
object property;
if (name is Number)
{
property = holder.Get(System.Convert.ToInt32(((Number)name)), holder);
}
else
{
property = holder.Get(((string)name), holder);
}
if (property is Scriptable)
{
Scriptable val = ((Scriptable)property);
if (val is NativeArray)
{
long len = ((NativeArray)val).GetLength();
for (long i = 0; i < len; i++)
{
// indices greater than MAX_INT are represented as strings
if (i > int.MaxValue)
{
string id = System.Convert.ToString(i);
object newElement = Walk(cx, scope, reviver, val, id);
if (newElement == Undefined.instance)
{
val.Delete(id);
}
else
{
val.Put(id, val, newElement);
}
}
else
{
int idx = (int)i;
object newElement = Walk(cx, scope, reviver, val, idx);
if (newElement == Undefined.instance)
{
val.Delete(idx);
}
else
{
val.Put(idx, val, newElement);
}
}
}
}
else
{
object[] keys = val.GetIds();
foreach (object p in keys)
{
object newElement = Walk(cx, scope, reviver, val, p);
if (newElement == Undefined.instance)
{
if (p is Number)
{
val.Delete(System.Convert.ToInt32(((Number)p)));
}
else
{
val.Delete((string)p);
}
}
else
{
if (p is Number)
{
val.Put(System.Convert.ToInt32(((Number)p)), val, newElement);
}
else
{
val.Put((string)p, val, newElement);
}
}
}
}
}
return reviver.Call(cx, scope, holder, new object[] { name, property });
}