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

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

Issue 559553003: In V8Binding.cpp, throw all exceptions via ExceptionState& argument (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 return static_cast<T>(result); 195 return static_cast<T>(result);
196 if (configuration == EnforceRange) { 196 if (configuration == EnforceRange) {
197 exceptionState.throwTypeError("Value is outside the '" + String(type Name) + "' value range."); 197 exceptionState.throwTypeError("Value is outside the '" + String(type Name) + "' value range.");
198 return 0; 198 return 0;
199 } 199 }
200 result %= LimitsTrait::numberOfValues; 200 result %= LimitsTrait::numberOfValues;
201 return static_cast<T>(result > LimitsTrait::maxValue ? result - LimitsTr ait::numberOfValues : result); 201 return static_cast<T>(result > LimitsTrait::maxValue ? result - LimitsTr ait::numberOfValues : result);
202 } 202 }
203 203
204 // Can the value be converted to a number? 204 // Can the value be converted to a number?
205 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 205 v8::TryCatch block;
206 v8::Local<v8::Number> numberObject(value->ToNumber());
207 if (block.HasCaught()) {
208 exceptionState.rethrowV8Exception(block.Exception());
209 return 0;
210 }
211
206 if (numberObject.IsEmpty()) { 212 if (numberObject.IsEmpty()) {
Jens Widell 2014/09/09 15:06:38 Question: Can this be true? It would be if value->
haraken 2014/09/10 01:09:23 You're right. This should be ASSERT(!numberObject.
Jens Widell 2014/09/10 05:33:57 Done.
207 exceptionState.throwTypeError("Not convertible to a number value (of typ e '" + String(typeName) + "'."); 213 exceptionState.throwTypeError("Not convertible to a number value (of typ e '" + String(typeName) + "'.");
haraken 2014/09/10 01:09:23 Do we want to put this message into the exceptionS
Jens Widell 2014/09/10 04:42:27 Don't know if I understand what you mean. Elaborat
haraken 2014/09/10 04:49:49 Sorry for not being clear. There are two ways to
208 return 0; 214 return 0;
209 } 215 }
210 216
211 if (configuration == EnforceRange) 217 if (configuration == EnforceRange)
212 return enforceRange(numberObject->Value(), LimitsTrait::minValue, Limits Trait::maxValue, typeName, exceptionState); 218 return enforceRange(numberObject->Value(), LimitsTrait::minValue, Limits Trait::maxValue, typeName, exceptionState);
213 219
214 double numberValue = numberObject->Value(); 220 double numberValue = numberObject->Value();
215 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue) 221 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
216 return 0; 222 return 0;
217 223
(...skipping 14 matching lines...) Expand all
232 if (result >= 0 && result <= LimitsTrait::maxValue) 238 if (result >= 0 && result <= LimitsTrait::maxValue)
233 return static_cast<T>(result); 239 return static_cast<T>(result);
234 if (configuration == EnforceRange) { 240 if (configuration == EnforceRange) {
235 exceptionState.throwTypeError("Value is outside the '" + String(type Name) + "' value range."); 241 exceptionState.throwTypeError("Value is outside the '" + String(type Name) + "' value range.");
236 return 0; 242 return 0;
237 } 243 }
238 return static_cast<T>(result); 244 return static_cast<T>(result);
239 } 245 }
240 246
241 // Can the value be converted to a number? 247 // Can the value be converted to a number?
242 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 248 v8::TryCatch block;
249 v8::Local<v8::Number> numberObject(value->ToNumber());
250 if (block.HasCaught()) {
251 exceptionState.rethrowV8Exception(block.Exception());
252 return 0;
253 }
254
243 if (numberObject.IsEmpty()) { 255 if (numberObject.IsEmpty()) {
244 exceptionState.throwTypeError("Not convertible to a number value (of typ e '" + String(typeName) + "'."); 256 exceptionState.throwTypeError("Not convertible to a number value (of typ e '" + String(typeName) + "'.");
245 return 0; 257 return 0;
246 } 258 }
247 259
248 if (configuration == EnforceRange) 260 if (configuration == EnforceRange)
249 return enforceRange(numberObject->Value(), 0, LimitsTrait::maxValue, typ eName, exceptionState); 261 return enforceRange(numberObject->Value(), 0, LimitsTrait::maxValue, typ eName, exceptionState);
250 262
251 // Does the value convert to nan or to an infinity? 263 // Does the value convert to nan or to an infinity?
252 double numberValue = numberObject->Value(); 264 double numberValue = numberObject->Value();
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 return toUInt16(value, NormalConversion, exceptionState); 316 return toUInt16(value, NormalConversion, exceptionState);
305 } 317 }
306 318
307 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState) 319 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState)
308 { 320 {
309 // Fast case. The value is already a 32-bit integer. 321 // Fast case. The value is already a 32-bit integer.
310 if (value->IsInt32()) 322 if (value->IsInt32())
311 return value->Int32Value(); 323 return value->Int32Value();
312 324
313 // Can the value be converted to a number? 325 // Can the value be converted to a number?
314 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 326 v8::TryCatch block;
327 v8::Local<v8::Number> numberObject(value->ToNumber());
328 if (block.HasCaught()) {
329 exceptionState.rethrowV8Exception(block.Exception());
330 return 0;
331 }
332
315 if (numberObject.IsEmpty()) { 333 if (numberObject.IsEmpty()) {
316 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'long'.)"); 334 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'long'.)");
317 return 0; 335 return 0;
318 } 336 }
319 337
320 if (configuration == EnforceRange) 338 if (configuration == EnforceRange)
321 return enforceRange(numberObject->Value(), kMinInt32, kMaxInt32, "long", exceptionState); 339 return enforceRange(numberObject->Value(), kMinInt32, kMaxInt32, "long", exceptionState);
322 340
323 // Does the value convert to nan or to an infinity? 341 // Does the value convert to nan or to an infinity?
324 double numberValue = numberObject->Value(); 342 double numberValue = numberObject->Value();
325 if (std::isnan(numberValue) || std::isinf(numberValue)) 343 if (std::isnan(numberValue) || std::isinf(numberValue))
326 return 0; 344 return 0;
327 345
328 if (configuration == Clamp) 346 if (configuration == Clamp)
329 return clampTo<int32_t>(numberObject->Value()); 347 return clampTo<int32_t>(numberObject->Value());
330 348
331 TONATIVE_DEFAULT_EXCEPTIONSTATE(int32_t, result, numberObject->Int32Value(), exceptionState, 0); 349 return numberObject->Int32Value();
Jens Widell 2014/09/09 15:06:38 I assumed here that since numberObject is a number
332 return result;
333 } 350 }
334 351
335 int32_t toInt32(v8::Handle<v8::Value> value) 352 int32_t toInt32(v8::Handle<v8::Value> value)
336 { 353 {
337 NonThrowableExceptionState exceptionState; 354 NonThrowableExceptionState exceptionState;
338 return toInt32(value, NormalConversion, exceptionState); 355 return toInt32(value, NormalConversion, exceptionState);
339 } 356 }
340 357
341 uint32_t toUInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, ExceptionState& exceptionState) 358 uint32_t toUInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, ExceptionState& exceptionState)
342 { 359 {
343 // Fast case. The value is already a 32-bit unsigned integer. 360 // Fast case. The value is already a 32-bit unsigned integer.
344 if (value->IsUint32()) 361 if (value->IsUint32())
345 return value->Uint32Value(); 362 return value->Uint32Value();
346 363
347 // Fast case. The value is a 32-bit signed integer - possibly positive? 364 // Fast case. The value is a 32-bit signed integer - possibly positive?
348 if (value->IsInt32()) { 365 if (value->IsInt32()) {
349 int32_t result = value->Int32Value(); 366 int32_t result = value->Int32Value();
350 if (result >= 0) 367 if (result >= 0)
351 return result; 368 return result;
352 if (configuration == EnforceRange) { 369 if (configuration == EnforceRange) {
353 exceptionState.throwTypeError("Value is outside the 'unsigned long' value range."); 370 exceptionState.throwTypeError("Value is outside the 'unsigned long' value range.");
354 return 0; 371 return 0;
355 } 372 }
356 return result; 373 return result;
357 } 374 }
358 375
359 // Can the value be converted to a number? 376 // Can the value be converted to a number?
360 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 377 v8::TryCatch block;
378 v8::Local<v8::Number> numberObject(value->ToNumber());
379 if (block.HasCaught()) {
380 exceptionState.rethrowV8Exception(block.Exception());
381 return 0;
382 }
383
361 if (numberObject.IsEmpty()) { 384 if (numberObject.IsEmpty()) {
362 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'unsigned long'.)"); 385 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'unsigned long'.)");
363 return 0; 386 return 0;
364 } 387 }
365 388
366 if (configuration == EnforceRange) 389 if (configuration == EnforceRange)
367 return enforceRange(numberObject->Value(), 0, kMaxUInt32, "unsigned long ", exceptionState); 390 return enforceRange(numberObject->Value(), 0, kMaxUInt32, "unsigned long ", exceptionState);
368 391
369 // Does the value convert to nan or to an infinity? 392 // Does the value convert to nan or to an infinity?
370 double numberValue = numberObject->Value(); 393 double numberValue = numberObject->Value();
371 if (std::isnan(numberValue) || std::isinf(numberValue)) 394 if (std::isnan(numberValue) || std::isinf(numberValue))
372 return 0; 395 return 0;
373 396
374 if (configuration == Clamp) 397 if (configuration == Clamp)
375 return clampTo<uint32_t>(numberObject->Value()); 398 return clampTo<uint32_t>(numberObject->Value());
376 399
377 TONATIVE_DEFAULT(uint32_t, result, numberObject->Uint32Value(), 0); 400 return numberObject->Uint32Value();
378 return result;
379 } 401 }
380 402
381 uint32_t toUInt32(v8::Handle<v8::Value> value) 403 uint32_t toUInt32(v8::Handle<v8::Value> value)
382 { 404 {
383 NonThrowableExceptionState exceptionState; 405 NonThrowableExceptionState exceptionState;
384 return toUInt32(value, NormalConversion, exceptionState); 406 return toUInt32(value, NormalConversion, exceptionState);
385 } 407 }
386 408
387 int64_t toInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState) 409 int64_t toInt64(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, ExceptionState& exceptionState)
388 { 410 {
389 // Fast case. The value is a 32-bit integer. 411 // Fast case. The value is a 32-bit integer.
390 if (value->IsInt32()) 412 if (value->IsInt32())
391 return value->Int32Value(); 413 return value->Int32Value();
392 414
393 // Can the value be converted to a number? 415 // Can the value be converted to a number?
394 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 416 v8::TryCatch block;
417 v8::Local<v8::Number> numberObject(value->ToNumber());
418 if (block.HasCaught()) {
419 exceptionState.rethrowV8Exception(block.Exception());
420 return 0;
421 }
422
395 if (numberObject.IsEmpty()) { 423 if (numberObject.IsEmpty()) {
396 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'long long'.)"); 424 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'long long'.)");
397 return 0; 425 return 0;
398 } 426 }
399 427
400 double x = numberObject->Value(); 428 double x = numberObject->Value();
401 429
402 if (configuration == EnforceRange) 430 if (configuration == EnforceRange)
403 return enforceRange(x, -kJSMaxInteger, kJSMaxInteger, "long long", excep tionState); 431 return enforceRange(x, -kJSMaxInteger, kJSMaxInteger, "long long", excep tionState);
404 432
(...skipping 25 matching lines...) Expand all
430 if (result >= 0) 458 if (result >= 0)
431 return result; 459 return result;
432 if (configuration == EnforceRange) { 460 if (configuration == EnforceRange) {
433 exceptionState.throwTypeError("Value is outside the 'unsigned long l ong' value range."); 461 exceptionState.throwTypeError("Value is outside the 'unsigned long l ong' value range.");
434 return 0; 462 return 0;
435 } 463 }
436 return result; 464 return result;
437 } 465 }
438 466
439 // Can the value be converted to a number? 467 // Can the value be converted to a number?
440 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 468 v8::TryCatch block;
469 v8::Local<v8::Number> numberObject(value->ToNumber());
470 if (block.HasCaught()) {
471 exceptionState.rethrowV8Exception(block.Exception());
472 return 0;
473 }
474
441 if (numberObject.IsEmpty()) { 475 if (numberObject.IsEmpty()) {
442 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'unsigned long long'.)"); 476 exceptionState.throwTypeError("Not convertible to a number value (of typ e 'unsigned long long'.)");
443 return 0; 477 return 0;
444 } 478 }
445 479
446 double x = numberObject->Value(); 480 double x = numberObject->Value();
447 481
448 if (configuration == EnforceRange) 482 if (configuration == EnforceRange)
449 return enforceRange(x, 0, kJSMaxInteger, "unsigned long long", exception State); 483 return enforceRange(x, 0, kJSMaxInteger, "unsigned long long", exception State);
450 484
451 // Does the value convert to nan or to an infinity? 485 // Does the value convert to nan or to an infinity?
452 if (std::isnan(x) || std::isinf(x)) 486 if (std::isnan(x) || std::isinf(x))
453 return 0; 487 return 0;
454 488
455 // NaNs and +/-Infinity should be 0, otherwise modulo 2^64. 489 // NaNs and +/-Infinity should be 0, otherwise modulo 2^64.
456 unsigned long long integer; 490 unsigned long long integer;
457 doubleToInteger(x, integer); 491 doubleToInteger(x, integer);
458 return integer; 492 return integer;
459 } 493 }
460 494
461 uint64_t toUInt64(v8::Handle<v8::Value> value) 495 uint64_t toUInt64(v8::Handle<v8::Value> value)
462 { 496 {
463 NonThrowableExceptionState exceptionState; 497 NonThrowableExceptionState exceptionState;
464 return toUInt64(value, NormalConversion, exceptionState); 498 return toUInt64(value, NormalConversion, exceptionState);
465 } 499 }
466 500
467 float toFloat(v8::Handle<v8::Value> value, ExceptionState& exceptionState) 501 float toFloat(v8::Handle<v8::Value> value, ExceptionState& exceptionState)
468 { 502 {
469 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::Number>, numberObject, value-> ToNumber(), exceptionState, 0); 503 v8::TryCatch block;
504 v8::Local<v8::Number> numberObject(value->ToNumber());
505 if (block.HasCaught()) {
506 exceptionState.rethrowV8Exception(block.Exception());
507 return 0;
508 }
470 return numberObject->NumberValue(); 509 return numberObject->NumberValue();
471 } 510 }
472 511
473 String toByteString(v8::Handle<v8::Value> value, ExceptionState& exceptionState) 512 String toByteString(v8::Handle<v8::Value> value, ExceptionState& exceptionState)
474 { 513 {
475 // Handle null default value. 514 // Handle null default value.
476 if (value.IsEmpty()) 515 if (value.IsEmpty())
477 return String(); 516 return String();
478 517
479 // From the Web IDL spec: http://heycam.github.io/webidl/#es-ByteString 518 // From the Web IDL spec: http://heycam.github.io/webidl/#es-ByteString
480 if (value.IsEmpty()) 519 if (value.IsEmpty())
481 return String(); 520 return String();
482 521
483 // 1. Let x be ToString(v) 522 // 1. Let x be ToString(v)
484 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::String>, stringObject, value-> ToString(), exceptionState, String()); 523 v8::TryCatch block;
524 v8::Local<v8::String> stringObject(value->ToString());
525 if (block.HasCaught()) {
526 exceptionState.rethrowV8Exception(block.Exception());
527 return String();
528 }
529
485 String x = toCoreString(stringObject); 530 String x = toCoreString(stringObject);
486 531
487 // 2. If the value of any element of x is greater than 255, then throw a Typ eError. 532 // 2. If the value of any element of x is greater than 255, then throw a Typ eError.
488 if (!x.containsOnlyLatin1()) { 533 if (!x.containsOnlyLatin1()) {
489 exceptionState.throwTypeError("Value is not a valid ByteString."); 534 exceptionState.throwTypeError("Value is not a valid ByteString.");
490 return String(); 535 return String();
491 } 536 }
492 537
493 // 3. Return an IDL ByteString value whose length is the length of x, and wh ere the 538 // 3. Return an IDL ByteString value whose length is the length of x, and wh ere the
494 // value of each element is the value of the corresponding element of x. 539 // value of each element is the value of the corresponding element of x.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 ASSERT(u.length() == string.length()); 643 ASSERT(u.length() == string.length());
599 return u.toString(); 644 return u.toString();
600 } 645 }
601 646
602 String toScalarValueString(v8::Handle<v8::Value> value, ExceptionState& exceptio nState) 647 String toScalarValueString(v8::Handle<v8::Value> value, ExceptionState& exceptio nState)
603 { 648 {
604 // From the Encoding standard (with a TODO to move to Web IDL): 649 // From the Encoding standard (with a TODO to move to Web IDL):
605 // http://encoding.spec.whatwg.org/#type-scalarvaluestring 650 // http://encoding.spec.whatwg.org/#type-scalarvaluestring
606 if (value.IsEmpty()) 651 if (value.IsEmpty())
607 return String(); 652 return String();
608 TONATIVE_DEFAULT_EXCEPTIONSTATE(v8::Local<v8::String>, stringObject, value-> ToString(), exceptionState, String()); 653
654 v8::TryCatch block;
655 v8::Local<v8::String> stringObject(value->ToString());
656 if (block.HasCaught()) {
657 exceptionState.rethrowV8Exception(block.Exception());
658 return String();
659 }
609 660
610 // ScalarValueString is identical to DOMString except that "convert a 661 // ScalarValueString is identical to DOMString except that "convert a
611 // DOMString to a sequence of Unicode characters" is used subsequently 662 // DOMString to a sequence of Unicode characters" is used subsequently
612 // when converting to an IDL value 663 // when converting to an IDL value
613 String x = toCoreString(stringObject); 664 String x = toCoreString(stringObject);
614 return replaceUnmatchedSurrogates(x); 665 return replaceUnmatchedSurrogates(x);
615 } 666 }
616 667
617 PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value> value, v8::Isolate* isolate) 668 PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value> value, v8::Isolate* isolate)
618 { 669 {
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 971
921 v8::Local<v8::Value> v8IteratorResult(v8::Isolate* isolate, v8::Handle<v8::Value > value) 972 v8::Local<v8::Value> v8IteratorResult(v8::Isolate* isolate, v8::Handle<v8::Value > value)
922 { 973 {
923 v8::Local<v8::Object> result = v8::Object::New(isolate); 974 v8::Local<v8::Object> result = v8::Object::New(isolate);
924 result->Set(v8String(isolate, "value"), value); 975 result->Set(v8String(isolate, "value"), value);
925 result->Set(v8String(isolate, "done"), v8Boolean(false, isolate)); 976 result->Set(v8String(isolate, "done"), v8Boolean(false, isolate));
926 return result; 977 return result;
927 } 978 }
928 979
929 } // namespace blink 980 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698