// HACK snewman 7/26/01: ensure that the type analysis in these methods is // complete, e.g. that "value is double" will fire for all numeric values. // Might need to add additional tests for 64-bit int, for example. // Convert the given value to a primitive type. public static object ToPrimitive(object value, JObject.ValueHintType hint) { // If the value is already a JavaScript primitive type, just return it. if (JObject.IsPrimitive(value)) return value; // Otherwise, convert it to a primitive. JObject asObj = value as JObject; if (asObj != null) return asObj.DefaultValue(hint); else throw new TypeError("attempt to convert non-JavaScript object to primitive"); } // ToPrimitive
} // ToUInt16 // Convert the given value to a string value. public static string ToString(object value) { double d; if (value is string) return (string)value; else if (PrimSupport.AsNumber(value, out d)) { // HACK snewman 7/26/01: format according to grammar in 9.8.1 on p. 47 return System.Convert.ToString(d); } else if (value == null) return "null"; else if (value is JUndefinedObject) return "undefined"; else if (value is bool) return (bool)value ? "true" : "false"; JObject asObj = value as JObject; if (asObj != null) return ToString(asObj.DefaultValue(JObject.ValueHintType.String)); else return value.ToString(); } // ToString
} // ToBoolean // Convert the given value to a numeric value. public static double ToNumber(object value) { double d; if (PrimSupport.AsNumber(value, out d)) return d; else if (value == null) return 0; else if (value is JUndefinedObject) return Double.NaN; else if (value is bool) return (bool)value ? 1 : 0; else if (value is string) { // HACK snewman 7/26/01: parse according to grammar in 9.3.1 on p. 43 return System.Convert.ToDouble((string)value); } JObject asObj = value as JObject; if (asObj != null) return ToNumber(asObj.DefaultValue(JObject.ValueHintType.Number)); else throw new TypeError("attempt to convert non-JavaScript object to number"); } // ToNumber