internal static void SwapValues(Object obj, uint left, uint right){
if (obj is JSObject){
((JSObject)obj).SwapValues(left, right);
return;
}
if (obj is IList){
IList list = (IList)obj;
Object temp = list[(int)left];
list[(int)left] = list[(int)right];
list[(int)right] = temp;
return;
}
if (obj is Array){
Array arr = (Array)obj;
Object temp = arr.GetValue((int)left);
arr.SetValue(arr.GetValue((int)right), (int)left);
arr.SetValue(temp, (int)right);
return;
}
if (obj is IExpando){
String left_name = System.Convert.ToString(left, CultureInfo.InvariantCulture);
String right_name = System.Convert.ToString(right, CultureInfo.InvariantCulture);
IExpando eob = (IExpando)obj;
FieldInfo left_field = eob.GetField(left_name, BindingFlags.Instance|BindingFlags.Public);
FieldInfo right_field = eob.GetField(right_name, BindingFlags.Instance|BindingFlags.Public);
if (left_field == null)
if (right_field == null)
return;
else
try{
left_field = eob.AddField(left_name);
left_field.SetValue(obj, right_field.GetValue(obj));
eob.RemoveMember(right_field);
}catch{
throw new JScriptException(JSError.ActionNotSupported);
}
else if (right_field == null)
try{
right_field = eob.AddField(right_name);
right_field.SetValue(obj, left_field.GetValue(obj));
eob.RemoveMember(left_field);
}catch{
throw new JScriptException(JSError.ActionNotSupported);
}
Object temp = left_field.GetValue(obj);
left_field.SetValue(obj, right_field.GetValue(obj));
right_field.SetValue(obj, temp);
return;
}
Object lval = LateBinding.GetValueAtIndex(obj, left);
Object rval = LateBinding.GetValueAtIndex(obj, right);
if (lval is Missing)
LateBinding.DeleteValueAtIndex(obj, right);
else
LateBinding.SetValueAtIndex(obj, right, lval);
if (rval is Missing)
LateBinding.DeleteValueAtIndex(obj, left);
else
LateBinding.SetValueAtIndex(obj, left, rval);
}