/// // Integer conversions function WebidlEnforceRange(val, min, max): number { var num = ToNumber(val); if (!Number_isFinite(num)) ThrowTypeError("Value isn't finite!"); if (val < 0) num = -std_Math_floor(std_Math_abs(num)); else num = std_Math_floor(std_Math_abs(num)); if (num < min || num > max) ThrowTypeError("Value is out of range"); return num; } function WebidlClamp(val, min, max): number { var num = ToNumber(val); if (Number_isNaN(num)) return 0; num = std_Math_min(std_Math_max(num, min), max); var to_truncate = num + 0.5; num = num | 0; if (to_truncate == num) { return num & ~1; } return num; } function ToWebidlByte(val): number { var num = (val >>> 0) % (1 << 8); if (num >= (1 << 7)) return num - (1 << 8); return num; } function ToWebidlByteEnforceRange(val): number { return WebidlEnforceRange(val, -(1 << 7), (1 << 7) - 1); } function ToWebidlByteClamp(val): number { return WebidlClamp(val, -(1 << 7), (1 << 7) - 1); } function ToWebidlOctet(val): number { return (val >>> 0) % (1 << 8); } function ToWebidlOctetEnforceRange(val): number { return WebidlEnforceRange(val, 0, (1 << 8) - 1); } function ToWebidlOctetClamp(val): number { return WebidlClamp(val, 0, (1 << 8) - 1); } function ToWebidlShort(val): number { var num = (val >>> 0) % (1 << 16); if (num >= (1 << 15)) return num - (1 << 16); return num; } function ToWebidlShortEnforceRange(val): number { return WebidlEnforceRange(val, -(1 << 15), (1 << 15) - 1); } function ToWebidlShortClamp(val): number { return WebidlClamp(val, -(1 << 15), (1 << 15) - 1); } function ToWebidlUnsignedShort(val): number { return (val >>> 0) % (1 << 16); } function ToWebidlUnsignedShortEnforceRange(val): number { return WebidlEnforceRange(val, 0, (1 << 16) - 1); } function ToWebidlUnsignedShortClamp(val): number { return WebidlClamp(val, 0, (1 << 16) - 1); } function ToWebidlLong(val): number { return val | 0; } function ToWebidlLongEnforceRange(val): number { return WebidlEnforceRange(val, -(1 << 31), (1 << 31) - 1); } function ToWebidlLongClamp(val): number { return WebidlClamp(val, -(1 << 31), (1 << 31) - 1); } function ToWebidlUnsignedLong(val): number { return val >>> 0; } function ToWebidlUnsignedLongEnforceRange(val): number { return WebidlEnforceRange(val, 0, ~0 >>> 0); } function ToWebidlUnsignedLongClamp(val): number { return WebidlClamp(val, 0, ~0 >>> 0); } // XXX add long long conversions function ToWebidlFloat(val): number { var num = ToNumber(val); if (!Number_isFinite(num)) ThrowTypeError("Value must be finite"); var rval = std_Math_fround(num); // XXX Check and throw on 2 ^ 128 if (rval === 0.0 && num < 0) rval = -0.0; return rval; } function ToWebidlUnrestrictedFloat(val): number { var num = ToNumber(val); if (!Number_isFinite(num)) ThrowTypeError("Value must be finite"); var rval = std_Math_fround(num); // XXX Check for 2 ^ 128 and return infinity if so if (rval === 0.0 && num < 0) rval = -0.0; return rval; } function ToWebidlDouble(val): number { var num = ToNumber(val); if (!Number_isFinite(num)) ThrowTypeError("Value must be finite"); return num; } function ToWebidlByteString(val): string { var str = ToString(val); for (var i = 0; i < str.length; i++) { if (callFunction(std_String_charCodeAt, str, i) > 255) ThrowTypeError("Value at " + i + "is greater than 255"); } return str; } function ToWebidlObject(val): Object { if (!IsObject(val)) ThrowTypeError("Value is not an object"); return val; }