Rhino.NativeJSON.Walk C# (CSharp) Method

Walk() private static method

private static Walk ( Context cx, Scriptable scope, Callable reviver, Scriptable holder, object name ) : object
cx Context
scope Scriptable
reviver Callable
holder Scriptable
name object
return object
		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 });
		}