Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Side by Side Diff: Source/bindings/v8/V8Binding.cpp

Issue 121113004: Improve handling of failed integer type conversions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Update expected outputs Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 19 matching lines...) Expand all
30 30
31 #include "config.h" 31 #include "config.h"
32 #include "bindings/v8/V8Binding.h" 32 #include "bindings/v8/V8Binding.h"
33 33
34 #include "V8Element.h" 34 #include "V8Element.h"
35 #include "V8NodeFilter.h" 35 #include "V8NodeFilter.h"
36 #include "V8Window.h" 36 #include "V8Window.h"
37 #include "V8WorkerGlobalScope.h" 37 #include "V8WorkerGlobalScope.h"
38 #include "V8XPathNSResolver.h" 38 #include "V8XPathNSResolver.h"
39 #include "bindings/v8/ScriptController.h" 39 #include "bindings/v8/ScriptController.h"
40 #include "bindings/v8/V8BindingMacros.h"
40 #include "bindings/v8/V8NodeFilterCondition.h" 41 #include "bindings/v8/V8NodeFilterCondition.h"
41 #include "bindings/v8/V8ObjectConstructor.h" 42 #include "bindings/v8/V8ObjectConstructor.h"
42 #include "bindings/v8/V8WindowShell.h" 43 #include "bindings/v8/V8WindowShell.h"
43 #include "bindings/v8/WorkerScriptController.h" 44 #include "bindings/v8/WorkerScriptController.h"
44 #include "bindings/v8/custom/V8CustomXPathNSResolver.h" 45 #include "bindings/v8/custom/V8CustomXPathNSResolver.h"
45 #include "core/dom/Element.h" 46 #include "core/dom/Element.h"
46 #include "core/dom/NodeFilter.h" 47 #include "core/dom/NodeFilter.h"
47 #include "core/dom/QualifiedName.h" 48 #include "core/dom/QualifiedName.h"
48 #include "core/inspector/BindingVisitors.h" 49 #include "core/inspector/BindingVisitors.h"
49 #include "core/loader/FrameLoader.h" 50 #include "core/loader/FrameLoader.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 filter->setCondition(condition.release()); 136 filter->setCondition(condition.release());
136 137
137 return filter.release(); 138 return filter.release();
138 } 139 }
139 140
140 const int32_t kMaxInt32 = 0x7fffffff; 141 const int32_t kMaxInt32 = 0x7fffffff;
141 const int32_t kMinInt32 = -kMaxInt32 - 1; 142 const int32_t kMinInt32 = -kMaxInt32 - 1;
142 const uint32_t kMaxUInt32 = 0xffffffff; 143 const uint32_t kMaxUInt32 = 0xffffffff;
143 const int64_t kJSMaxInteger = 0x20000000000000LL - 1; // 2^53 - 1, maximum integ er exactly representable in ECMAScript. 144 const int64_t kJSMaxInteger = 0x20000000000000LL - 1; // 2^53 - 1, maximum integ er exactly representable in ECMAScript.
144 145
145 static double enforceRange(double x, double minimum, double maximum, bool& ok) 146 static double enforceRange(double x, double minimum, double maximum, const char* typeName, ExceptionState& exceptionState)
146 { 147 {
147 if (std::isnan(x) || std::isinf(x)) { 148 if (std::isnan(x) || std::isinf(x)) {
148 ok = false; 149 exceptionState.throwTypeError("Value is" + String(std::isinf(x) ? " infi nite and" : "") + " not of type '" + String(typeName) + "'.");
149 return 0; 150 return 0;
150 } 151 }
151 x = trunc(x); 152 x = trunc(x);
152 if (x < minimum || x > maximum) { 153 if (x < minimum || x > maximum) {
153 ok = false; 154 exceptionState.throwTypeError("Value is outside the '" + String(typeName ) + "' value range.");
154 return 0; 155 return 0;
155 } 156 }
156 return x; 157 return x;
157 } 158 }
158 159
159 template <typename T> 160 template <typename T>
160 struct IntTypeLimits { 161 struct IntTypeLimits {
161 }; 162 };
162 163
163 template <> 164 template <>
(...skipping 16 matching lines...) Expand all
180 static const unsigned numberOfValues = 65536; // 2^16 181 static const unsigned numberOfValues = 65536; // 2^16
181 }; 182 };
182 183
183 template <> 184 template <>
184 struct IntTypeLimits<uint16_t> { 185 struct IntTypeLimits<uint16_t> {
185 static const unsigned short maxValue = 65535; 186 static const unsigned short maxValue = 65535;
186 static const unsigned numberOfValues = 65536; // 2^16 187 static const unsigned numberOfValues = 65536; // 2^16
187 }; 188 };
188 189
189 template <typename T> 190 template <typename T>
190 static inline T toSmallerInt(v8::Handle<v8::Value> value, IntegerConversionConfi guration configuration, bool& ok) 191 static inline T toSmallerInt(v8::Handle<v8::Value> value, IntegerConversionConfi guration configuration, const char* typeName, ExceptionState& exceptionState)
191 { 192 {
192 typedef IntTypeLimits<T> LimitsTrait; 193 typedef IntTypeLimits<T> LimitsTrait;
193 ok = true;
194 194
195 // Fast case. The value is already a 32-bit integer in the right range. 195 // Fast case. The value is already a 32-bit integer in the right range.
196 if (value->IsInt32()) { 196 if (value->IsInt32()) {
197 int32_t result = value->Int32Value(); 197 int32_t result = value->Int32Value();
198 if (result >= LimitsTrait::minValue && result <= LimitsTrait::maxValue) 198 if (result >= LimitsTrait::minValue && result <= LimitsTrait::maxValue)
199 return static_cast<T>(result); 199 return static_cast<T>(result);
200 if (configuration == EnforceRange) { 200 if (configuration == EnforceRange) {
201 ok = false; 201 exceptionState.throwTypeError("Value is outside the '" + String(type Name) + "' value range.");
202 return 0; 202 return 0;
203 } 203 }
204 result %= LimitsTrait::numberOfValues; 204 result %= LimitsTrait::numberOfValues;
205 return static_cast<T>(result > LimitsTrait::maxValue ? result - LimitsTr ait::numberOfValues : result); 205 return static_cast<T>(result > LimitsTrait::maxValue ? result - LimitsTr ait::numberOfValues : result);
206 } 206 }
207 207
208 // Can the value be converted to a number? 208 // Can the value be converted to a number?
209 v8::Local<v8::Number> numberObject = value->ToNumber(); 209 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
210 if (numberObject.IsEmpty()) { 210 if (numberObject.IsEmpty()) {
211 ok = false; 211 exceptionState.throwTypeError("Not convertible to a number value (of typ e '" + String(typeName) + "'.");
212 return 0; 212 return 0;
213 } 213 }
214 214
215 if (configuration == EnforceRange) 215 if (configuration == EnforceRange)
216 return enforceRange(numberObject->Value(), LimitsTrait::minValue, Limits Trait::maxValue, ok); 216 return enforceRange(numberObject->Value(), LimitsTrait::minValue, Limits Trait::maxValue, typeName, exceptionState);
217 217
218 double numberValue = numberObject->Value(); 218 double numberValue = numberObject->Value();
219 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue) 219 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
220 return 0; 220 return 0;
221 221
222 numberValue = numberValue < 0 ? -floor(fabs(numberValue)) : floor(fabs(numbe rValue)); 222 numberValue = numberValue < 0 ? -floor(fabs(numberValue)) : floor(fabs(numbe rValue));
223 numberValue = fmod(numberValue, LimitsTrait::numberOfValues); 223 numberValue = fmod(numberValue, LimitsTrait::numberOfValues);
224 224
225 return static_cast<T>(numberValue > LimitsTrait::maxValue ? numberValue - Li mitsTrait::numberOfValues : numberValue); 225 return static_cast<T>(numberValue > LimitsTrait::maxValue ? numberValue - Li mitsTrait::numberOfValues : numberValue);
226 } 226 }
227 227
228 template <typename T> 228 template <typename T>
229 static inline T toSmallerUInt(v8::Handle<v8::Value> value, IntegerConversionConf iguration configuration, bool& ok) 229 static inline T toSmallerUInt(v8::Handle<v8::Value> value, IntegerConversionConf iguration configuration, const char* typeName, ExceptionState& exceptionState)
230 { 230 {
231 typedef IntTypeLimits<T> LimitsTrait; 231 typedef IntTypeLimits<T> LimitsTrait;
232 ok = true;
233 232
234 // Fast case. The value is a 32-bit signed integer - possibly positive? 233 // Fast case. The value is a 32-bit signed integer - possibly positive?
235 if (value->IsInt32()) { 234 if (value->IsInt32()) {
236 int32_t result = value->Int32Value(); 235 int32_t result = value->Int32Value();
237 if (result >= 0 && result <= LimitsTrait::maxValue) 236 if (result >= 0 && result <= LimitsTrait::maxValue)
238 return static_cast<T>(result); 237 return static_cast<T>(result);
239 if (configuration == EnforceRange) { 238 if (configuration == EnforceRange) {
240 ok = false; 239 exceptionState.throwTypeError("Value is outside the '" + String(type Name) + "' value range.");
241 return 0; 240 return 0;
242 } 241 }
243 return static_cast<T>(result); 242 return static_cast<T>(result);
244 } 243 }
245 244
246 // Can the value be converted to a number? 245 // Can the value be converted to a number?
247 v8::Local<v8::Number> numberObject = value->ToNumber(); 246 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
248 if (numberObject.IsEmpty()) { 247 if (numberObject.IsEmpty()) {
249 ok = false; 248 exceptionState.throwTypeError("Not convertible to a number value (of typ e '" + String(typeName) + "'.");
250 return 0; 249 return 0;
251 } 250 }
252 251
253 if (configuration == EnforceRange) 252 if (configuration == EnforceRange)
254 return enforceRange(numberObject->Value(), 0, LimitsTrait::maxValue, ok) ; 253 return enforceRange(numberObject->Value(), 0, LimitsTrait::maxValue, typ eName, exceptionState);
255 254
256 // Does the value convert to nan or to an infinity? 255 // Does the value convert to nan or to an infinity?
257 double numberValue = numberObject->Value(); 256 double numberValue = numberObject->Value();
258 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue) 257 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
259 return 0; 258 return 0;
260 259
261 if (configuration == Clamp) 260 if (configuration == Clamp)
262 return clampTo<T>(numberObject->Value()); 261 return clampTo<T>(numberObject->Value());
263 262
264 numberValue = numberValue < 0 ? -floor(fabs(numberValue)) : floor(fabs(numbe rValue)); 263 numberValue = numberValue < 0 ? -floor(fabs(numberValue)) : floor(fabs(numbe rValue));
265 return static_cast<T>(fmod(numberValue, LimitsTrait::numberOfValues)); 264 return static_cast<T>(fmod(numberValue, LimitsTrait::numberOfValues));
266 } 265 }
267 266
268 int8_t toInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration config uration, bool& ok) 267 int8_t toInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration config uration, ExceptionState& exceptionState)
269 { 268 {
270 return toSmallerInt<int8_t>(value, configuration, ok); 269 return toSmallerInt<int8_t>(value, configuration, "byte", exceptionState);
271 } 270 }
272 271
273 uint8_t toUInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 272 int8_t toInt8(v8::Handle<v8::Value> value)
274 { 273 {
275 return toSmallerUInt<uint8_t>(value, configuration, ok); 274 NonThrowableExceptionState exceptionState;
275 return toInt8(value, NormalConversion, exceptionState);
276 } 276 }
277 277
278 int16_t toInt16(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 278 uint8_t toUInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState)
279 { 279 {
280 return toSmallerInt<int16_t>(value, configuration, ok); 280 return toSmallerUInt<uint8_t>(value, configuration, "octet", exceptionState) ;
281 } 281 }
282 282
283 uint16_t toUInt16(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, bool& ok) 283 uint8_t toUInt8(v8::Handle<v8::Value> value)
284 { 284 {
285 return toSmallerUInt<uint16_t>(value, configuration, ok); 285 NonThrowableExceptionState exceptionState;
286 return toUInt8(value, NormalConversion, exceptionState);
286 } 287 }
287 288
288 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 289 int16_t toInt16(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState)
289 { 290 {
290 ok = true; 291 return toSmallerInt<int16_t>(value, configuration, "short", exceptionState);
292 }
291 293
294 int16_t toInt16(v8::Handle<v8::Value> value)
295 {
296 NonThrowableExceptionState exceptionState;
297 return toInt16(value, NormalConversion, exceptionState);
298 }
299
300 uint16_t toUInt16(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, ExceptionState& exceptionState)
301 {
302 return toSmallerUInt<uint16_t>(value, configuration, "unsigned short", excep tionState);
303 }
304
305 uint16_t toUInt16(v8::Handle<v8::Value> value)
306 {
307 NonThrowableExceptionState exceptionState;
308 return toUInt16(value, NormalConversion, exceptionState);
309 }
310
311 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState)
312 {
292 // Fast case. The value is already a 32-bit integer. 313 // Fast case. The value is already a 32-bit integer.
293 if (value->IsInt32()) 314 if (value->IsInt32())
294 return value->Int32Value(); 315 return value->Int32Value();
295 316
296 // Can the value be converted to a number? 317 // Can the value be converted to a number?
297 ok = false; 318 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
298 V8TRYCATCH_RETURN(v8::Local<v8::Number>, numberObject, value->ToNumber(), 0) ;
299 if (numberObject.IsEmpty()) { 319 if (numberObject.IsEmpty()) {
320 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'long'.)");
300 return 0; 321 return 0;
301 } 322 }
302 ok = true;
303 323
304 if (configuration == EnforceRange) 324 if (configuration == EnforceRange)
305 return enforceRange(numberObject->Value(), kMinInt32, kMaxInt32, ok); 325 return enforceRange(numberObject->Value(), kMinInt32, kMaxInt32, "long", exceptionState);
306 326
307 // Does the value convert to nan or to an infinity? 327 // Does the value convert to nan or to an infinity?
308 double numberValue = numberObject->Value(); 328 double numberValue = numberObject->Value();
309 if (std::isnan(numberValue) || std::isinf(numberValue)) 329 if (std::isnan(numberValue) || std::isinf(numberValue))
310 return 0; 330 return 0;
311 331
312 if (configuration == Clamp) 332 if (configuration == Clamp)
313 return clampTo<int32_t>(numberObject->Value()); 333 return clampTo<int32_t>(numberObject->Value());
314 334
315 V8TRYCATCH_RETURN(int32_t, result, numberObject->Int32Value(), 0); 335 V8TRYCATCH_EXCEPTION_RETURN(int32_t, result, numberObject->Int32Value(), exc eptionState, 0);
316 return result; 336 return result;
317 } 337 }
318 338
319 uint32_t toUInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, bool& ok) 339 int32_t toInt32(v8::Handle<v8::Value> value)
320 { 340 {
321 ok = true; 341 NonThrowableExceptionState exceptionState;
342 return toInt32(value, NormalConversion, exceptionState);
343 }
322 344
345 uint32_t toUInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, ExceptionState& exceptionState)
346 {
323 // Fast case. The value is already a 32-bit unsigned integer. 347 // Fast case. The value is already a 32-bit unsigned integer.
324 if (value->IsUint32()) 348 if (value->IsUint32())
325 return value->Uint32Value(); 349 return value->Uint32Value();
326 350
327 // Fast case. The value is a 32-bit signed integer - possibly positive? 351 // Fast case. The value is a 32-bit signed integer - possibly positive?
328 if (value->IsInt32()) { 352 if (value->IsInt32()) {
329 int32_t result = value->Int32Value(); 353 int32_t result = value->Int32Value();
330 if (result >= 0) 354 if (result >= 0)
331 return result; 355 return result;
332 if (configuration == EnforceRange) { 356 if (configuration == EnforceRange) {
333 ok = false; 357 exceptionState.throwTypeError("Value is outside the 'unsigned long' value range.");
334 return 0; 358 return 0;
335 } 359 }
336 return result; 360 return result;
337 } 361 }
338 362
339 // Can the value be converted to a number? 363 // Can the value be converted to a number?
340 ok = false; 364 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
341 V8TRYCATCH_RETURN(v8::Local<v8::Number>, numberObject, value->ToNumber(), 0) ;
342 if (numberObject.IsEmpty()) { 365 if (numberObject.IsEmpty()) {
366 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'unsigned long'.)");
343 return 0; 367 return 0;
344 } 368 }
345 ok = true;
346 369
347 if (configuration == EnforceRange) 370 if (configuration == EnforceRange)
348 return enforceRange(numberObject->Value(), 0, kMaxUInt32, ok); 371 return enforceRange(numberObject->Value(), 0, kMaxUInt32, "unsigned long ", exceptionState);
349 372
350 // Does the value convert to nan or to an infinity? 373 // Does the value convert to nan or to an infinity?
351 double numberValue = numberObject->Value(); 374 double numberValue = numberObject->Value();
352 if (std::isnan(numberValue) || std::isinf(numberValue)) 375 if (std::isnan(numberValue) || std::isinf(numberValue))
353 return 0; 376 return 0;
354 377
355 if (configuration == Clamp) 378 if (configuration == Clamp)
356 return clampTo<uint32_t>(numberObject->Value()); 379 return clampTo<uint32_t>(numberObject->Value());
357 380
358 V8TRYCATCH_RETURN(uint32_t, result, numberObject->Uint32Value(), 0); 381 V8TRYCATCH_RETURN(uint32_t, result, numberObject->Uint32Value(), 0);
359 return result; 382 return result;
360 } 383 }
361 384
362 int64_t toInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 385 uint32_t toUInt32(v8::Handle<v8::Value> value)
363 { 386 {
364 ok = true; 387 NonThrowableExceptionState exceptionState;
388 return toUInt32(value, NormalConversion, exceptionState);
389 }
365 390
391 int64_t toInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState)
392 {
366 // Fast case. The value is a 32-bit integer. 393 // Fast case. The value is a 32-bit integer.
367 if (value->IsInt32()) 394 if (value->IsInt32())
368 return value->Int32Value(); 395 return value->Int32Value();
369 396
370 // Can the value be converted to a number? 397 // Can the value be converted to a number?
371 v8::Local<v8::Number> numberObject = value->ToNumber(); 398 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
372 if (numberObject.IsEmpty()) { 399 if (numberObject.IsEmpty()) {
373 ok = false; 400 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'long long'.)");
374 return 0; 401 return 0;
375 } 402 }
376 403
377 double x = numberObject->Value(); 404 double x = numberObject->Value();
378 405
379 if (configuration == EnforceRange) 406 if (configuration == EnforceRange)
380 return enforceRange(x, -kJSMaxInteger, kJSMaxInteger, ok); 407 return enforceRange(x, -kJSMaxInteger, kJSMaxInteger, "long long", excep tionState);
381 408
382 // Does the value convert to nan or to an infinity? 409 // Does the value convert to nan or to an infinity?
383 if (std::isnan(x) || std::isinf(x)) 410 if (std::isnan(x) || std::isinf(x))
384 return 0; 411 return 0;
385 412
386 // NaNs and +/-Infinity should be 0, otherwise modulo 2^64. 413 // NaNs and +/-Infinity should be 0, otherwise modulo 2^64.
387 unsigned long long integer; 414 unsigned long long integer;
388 doubleToInteger(x, integer); 415 doubleToInteger(x, integer);
389 return integer; 416 return integer;
390 } 417 }
391 418
392 uint64_t toUInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, bool& ok) 419 int64_t toInt64(v8::Handle<v8::Value> value)
393 { 420 {
394 ok = true; 421 NonThrowableExceptionState exceptionState;
422 return toInt64(value, NormalConversion, exceptionState);
423 }
395 424
425 uint64_t toUInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, ExceptionState& exceptionState)
426 {
396 // Fast case. The value is a 32-bit unsigned integer. 427 // Fast case. The value is a 32-bit unsigned integer.
397 if (value->IsUint32()) 428 if (value->IsUint32())
398 return value->Uint32Value(); 429 return value->Uint32Value();
399 430
400 // Fast case. The value is a 32-bit integer. 431 // Fast case. The value is a 32-bit integer.
401 if (value->IsInt32()) { 432 if (value->IsInt32()) {
402 int32_t result = value->Int32Value(); 433 int32_t result = value->Int32Value();
403 if (result >= 0) 434 if (result >= 0)
404 return result; 435 return result;
405 if (configuration == EnforceRange) { 436 if (configuration == EnforceRange) {
406 ok = false; 437 exceptionState.throwTypeError("Value is outside the 'unsigned long l ong' value range.");
407 return 0; 438 return 0;
408 } 439 }
409 return result; 440 return result;
410 } 441 }
411 442
412 // Can the value be converted to a number? 443 // Can the value be converted to a number?
413 v8::Local<v8::Number> numberObject = value->ToNumber(); 444 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
414 if (numberObject.IsEmpty()) { 445 if (numberObject.IsEmpty()) {
415 ok = false; 446 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'unsigned long long'.)");
416 return 0; 447 return 0;
417 } 448 }
418 449
419 double x = numberObject->Value(); 450 double x = numberObject->Value();
420 451
421 if (configuration == EnforceRange) 452 if (configuration == EnforceRange)
422 return enforceRange(x, 0, kJSMaxInteger, ok); 453 return enforceRange(x, 0, kJSMaxInteger, "unsigned long long", exception State);
423 454
424 // Does the value convert to nan or to an infinity? 455 // Does the value convert to nan or to an infinity?
425 if (std::isnan(x) || std::isinf(x)) 456 if (std::isnan(x) || std::isinf(x))
426 return 0; 457 return 0;
427 458
428 // NaNs and +/-Infinity should be 0, otherwise modulo 2^64. 459 // NaNs and +/-Infinity should be 0, otherwise modulo 2^64.
429 unsigned long long integer; 460 unsigned long long integer;
430 doubleToInteger(x, integer); 461 doubleToInteger(x, integer);
431 return integer; 462 return integer;
432 } 463 }
433 464
465 uint64_t toUInt64(v8::Handle<v8::Value> value)
466 {
467 NonThrowableExceptionState exceptionState;
468 return toUInt64(value, NormalConversion, exceptionState);
469 }
470
471 float toFloat(v8::Handle<v8::Value> value, ExceptionState& exceptionState)
472 {
473 V8TRYCATCH_EXCEPTION_RETURN(v8::Local<v8::Number>, numberObject, value->ToNu mber(), exceptionState, 0);
474 return numberObject->NumberValue();
475 }
476
434 v8::Handle<v8::FunctionTemplate> createRawTemplate(v8::Isolate* isolate) 477 v8::Handle<v8::FunctionTemplate> createRawTemplate(v8::Isolate* isolate)
435 { 478 {
436 v8::EscapableHandleScope scope(isolate); 479 v8::EscapableHandleScope scope(isolate);
437 v8::Local<v8::FunctionTemplate> result = v8::FunctionTemplate::New(isolate, V8ObjectConstructor::isValidConstructorMode); 480 v8::Local<v8::FunctionTemplate> result = v8::FunctionTemplate::New(isolate, V8ObjectConstructor::isValidConstructorMode);
438 return scope.Escape(result); 481 return scope.Escape(result);
439 } 482 }
440 483
441 PassRefPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value> value, v8::I solate* isolate) 484 PassRefPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value> value, v8::I solate* isolate)
442 { 485 {
443 RefPtr<XPathNSResolver> resolver; 486 RefPtr<XPathNSResolver> resolver;
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 return mainThreadIsolate(); 682 return mainThreadIsolate();
640 return v8::Isolate::GetCurrent(); 683 return v8::Isolate::GetCurrent();
641 } 684 }
642 685
643 v8::Isolate* toIsolate(Frame* frame) 686 v8::Isolate* toIsolate(Frame* frame)
644 { 687 {
645 return frame->script().isolate(); 688 return frame->script().isolate();
646 } 689 }
647 690
648 } // namespace WebCore 691 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698