private static Object DoOp(Object v1, Object v2, IConvertible ic1, IConvertible ic2, JSToken operatorTok){
if (operatorTok == JSToken.Minus){
IConvertible ic1a = ic1;
Object p1 = Convert.ToPrimitive(v1, PreferredType.Either, ref ic1a);
TypeCode t1 = Convert.GetTypeCode(p1, ic1a);
if (t1 == TypeCode.Char){
IConvertible ic2a = ic2;
Object p2 = Convert.ToPrimitive(v2, PreferredType.Either, ref ic2a);
TypeCode t2 = Convert.GetTypeCode(p2, ic2a);
if (t2 == TypeCode.String){
String str2 = ic2a.ToString(null);
if (str2.Length == 1){
t2 = TypeCode.Char;
p2 = str2[0];
ic2a = Convert.GetIConvertible(p2);
}
}
Object result = NumericBinary.DoOp(Convert.ToNumber(p1, ic1a), Convert.ToNumber(p2, ic2a), operatorTok);
if (t2 != TypeCode.Char)
result = Convert.Coerce2(result, TypeCode.Char, false);
return result;
}
}
return NumericBinary.DoOp(Convert.ToNumber(v1, ic1), Convert.ToNumber(v2, ic2), operatorTok);
}