private static object Str(object key, Scriptable holder, NativeJSON.StringifyState state)
{
object value = null;
if (key is string)
{
value = GetProperty(holder, (string)key);
}
else
{
value = GetProperty(holder, System.Convert.ToInt32(((Number)key)));
}
if (value is Scriptable)
{
object toJSON = GetProperty((Scriptable)value, "toJSON");
if (toJSON is Callable)
{
value = CallMethod(state.cx, (Scriptable)value, "toJSON", new object[] { key });
}
}
if (state.replacer != null)
{
value = state.replacer.Call(state.cx, state.scope, holder, new object[] { key, value });
}
if (value is NativeNumber)
{
value = ScriptRuntime.ToNumber(value);
}
else
{
if (value is NativeString)
{
value = ScriptRuntime.ToString(value);
}
else
{
if (value is NativeBoolean)
{
value = ((NativeBoolean)value).GetDefaultValue(ScriptRuntime.BooleanClass);
}
}
}
if (value == null)
{
return "null";
}
if (value.Equals(true))
{
return "true";
}
if (value.Equals(false))
{
return "false";
}
if (value is CharSequence)
{
return Quote(value.ToString());
}
if (value is Number)
{
double d = System.Convert.ToDouble(((Number)value));
if (d == d && d != double.PositiveInfinity && d != double.NegativeInfinity)
{
return ScriptRuntime.ToString(value);
}
else
{
return "null";
}
}
if (value is Scriptable && !(value is Callable))
{
if (value is NativeArray)
{
return Ja((NativeArray)value, state);
}
return Jo((Scriptable)value, state);
}
return Undefined.instance;
}