int64_t toInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration configuration, ExceptionState& exceptionState) { // Fast case. The value is a 32-bit integer. if (value->IsInt32()) return value->Int32Value(); // Can the value be converted to a number? V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNumber(), exceptionState, 0); if (numberObject.IsEmpty()) { exceptionState.throwTypeError("Not convertible to a number value (of type 'long long'.)"); return 0; } double x = numberObject->Value(); if (configuration == EnforceRange) return enforceRange(x, -kJSMaxInteger, kJSMaxInteger, "long long", exceptionState); // Does the value convert to nan or to an infinity? if (std::isnan(x) || std::isinf(x)) return 0; // NaNs and +/-Infinity should be 0, otherwise modulo 2^64. unsigned long long integer; doubleToInteger(x, integer); return integer; }
int64_t toInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration configuration, bool& ok) { ok = true; // Fast case. The value is a 32-bit integer. if (value->IsInt32()) return value->Int32Value(); // Can the value be converted to a number? v8::Local<v8::Number> numberObject = value->ToNumber(); if (numberObject.IsEmpty()) { ok = false; return 0; } double x = numberObject->Value(); if (configuration == EnforceRange) return enforceRange(x, -kJSMaxInteger, kJSMaxInteger, ok); // NaNs and +/-Infinity should be 0, otherwise modulo 2^64. unsigned long long integer; doubleToInteger(x, integer); return integer; }
bool DictionaryHelper::get(const Dictionary& dictionary, const String& key, unsigned long long& value) { v8::Local<v8::Value> v8Value; if (!dictionary.get(key, v8Value)) return false; double doubleValue; if (!v8Call(v8Value->NumberValue(dictionary.v8Context()), doubleValue)) return false; doubleToInteger(doubleValue, value); return true; }
bool Dictionary::get(const String& key, unsigned long long& value) const { v8::Local<v8::Value> v8Value; if (!getKey(key, v8Value)) return false; V8TRYCATCH_RETURN(v8::Local<v8::Number>, v8Number, v8Value->ToNumber(), false); if (v8Number.IsEmpty()) return false; double d = v8Number->Value(); doubleToInteger(d, value); return true; }
bool DictionaryHelper::get(const Dictionary& dictionary, const String& key, unsigned long long& value) { v8::Local<v8::Value> v8Value; if (!dictionary.get(key, v8Value)) return false; TONATIVE_DEFAULT(v8::Local<v8::Number>, v8Number, v8Value->ToNumber(), false); if (v8Number.IsEmpty()) return false; double d = v8Number->Value(); doubleToInteger(d, value); return true; }
void JSDictionary::convertValue(ExecState* exec, JSValue value, unsigned long long& result) { double d = value.toNumber(exec); doubleToInteger(d, result); }