OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/exceptions.h" | 5 #include "vm/exceptions.h" |
6 | 6 |
7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
8 #include "vm/dart_entry.h" | 8 #include "vm/dart_entry.h" |
9 #include "vm/debugger.h" | 9 #include "vm/debugger.h" |
10 #include "vm/flags.h" | 10 #include "vm/flags.h" |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 const String& cls_name = String::Handle(Symbols::New(class_name)); | 489 const String& cls_name = String::Handle(Symbols::New(class_name)); |
490 const Library& core_lib = Library::Handle(Library::CoreLibrary()); | 490 const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
491 // No ambiguity error expected: passing NULL. | 491 // No ambiguity error expected: passing NULL. |
492 Class& cls = Class::Handle(core_lib.LookupClass(cls_name, NULL)); | 492 Class& cls = Class::Handle(core_lib.LookupClass(cls_name, NULL)); |
493 ASSERT(!cls.IsNull()); | 493 ASSERT(!cls.IsNull()); |
494 // There are no parameterized error types, so no need to set type arguments. | 494 // There are no parameterized error types, so no need to set type arguments. |
495 return Instance::New(cls); | 495 return Instance::New(cls); |
496 } | 496 } |
497 | 497 |
498 | 498 |
499 // Allocate, initialize, and throw a TypeError. | 499 // Allocate, initialize, and throw a TypeError or CastError. |
500 void Exceptions::CreateAndThrowTypeError(intptr_t location, | 500 void Exceptions::CreateAndThrowTypeError(intptr_t location, |
501 const String& src_type_name, | 501 const String& src_type_name, |
502 const String& dst_type_name, | 502 const String& dst_type_name, |
503 const String& dst_name, | 503 const String& dst_name, |
504 const String& malformed_error) { | 504 const String& malformed_error) { |
505 const Array& args = Array::Handle(Array::New(8)); | 505 const Array& args = Array::Handle(Array::New(7)); |
506 | 506 |
507 ExceptionType exception_type = | 507 ExceptionType exception_type = |
508 dst_name.Equals(kCastErrorDstName) ? kCast : kType; | 508 dst_name.Equals(kCastErrorDstName) ? kCast : kType; |
509 | 509 |
510 // Initialize argument 'failedAssertion'. | |
511 // Printing the src_obj value would be possible, but ToString() is expensive | |
512 // and not meaningful for all classes, so we just print '$expr instanceof...'. | |
513 // Users should look at TypeError.ToString(), which contains more useful | |
514 // information than AssertionError.failedAssertion. | |
515 String& failed_assertion = String::Handle(String::New("$expr instanceof ")); | |
516 failed_assertion = String::Concat(failed_assertion, dst_type_name); | |
517 args.SetAt(0, failed_assertion); | |
518 | |
519 // Initialize 'url', 'line', and 'column' arguments. | |
520 DartFrameIterator iterator; | 510 DartFrameIterator iterator; |
521 const Script& script = Script::Handle(GetCallerScript(&iterator)); | 511 const Script& script = Script::Handle(GetCallerScript(&iterator)); |
522 intptr_t line, column; | 512 intptr_t line, column; |
523 script.GetTokenLocation(location, &line, &column); | 513 script.GetTokenLocation(location, &line, &column); |
524 args.SetAt(1, String::Handle(script.url())); | 514 // Initialize '_url', '_line', and '_column' arguments. |
525 args.SetAt(2, Smi::Handle(Smi::New(line))); | 515 args.SetAt(0, String::Handle(script.url())); |
526 args.SetAt(3, Smi::Handle(Smi::New(column))); | 516 args.SetAt(1, Smi::Handle(Smi::New(line))); |
| 517 args.SetAt(2, Smi::Handle(Smi::New(column))); |
527 | 518 |
528 // Initialize argument 'srcType'. | 519 // Initialize '_srcType', '_dstType', '_dstName', and '_malformedError'. |
529 args.SetAt(4, src_type_name); | 520 args.SetAt(3, src_type_name); |
530 args.SetAt(5, dst_type_name); | 521 args.SetAt(4, dst_type_name); |
531 args.SetAt(6, dst_name); | 522 args.SetAt(5, dst_name); |
532 args.SetAt(7, malformed_error); | 523 args.SetAt(6, malformed_error); |
533 | 524 |
534 // Type errors in the core library may be difficult to diagnose. | 525 // Type errors in the core library may be difficult to diagnose. |
535 // Print type error information before throwing the error when debugging. | 526 // Print type error information before throwing the error when debugging. |
536 if (FLAG_print_stacktrace_at_throw) { | 527 if (FLAG_print_stacktrace_at_throw) { |
537 if (!malformed_error.IsNull()) { | 528 if (!malformed_error.IsNull()) { |
538 OS::Print("%s\n", malformed_error.ToCString()); | 529 OS::Print("%s\n", malformed_error.ToCString()); |
539 } | 530 } |
540 intptr_t line, column; | 531 intptr_t line, column; |
541 script.GetTokenLocation(location, &line, &column); | 532 script.GetTokenLocation(location, &line, &column); |
542 OS::Print("'%s': Failed type check: line %"Pd" pos %"Pd": ", | 533 OS::Print("'%s': Failed type check: line %"Pd" pos %"Pd": ", |
543 String::Handle(script.url()).ToCString(), line, column); | 534 String::Handle(script.url()).ToCString(), line, column); |
544 if (!dst_name.IsNull() && (dst_name.Length() > 0)) { | 535 if (!dst_name.IsNull() && (dst_name.Length() > 0)) { |
545 OS::Print("type '%s' is not a subtype of type '%s' of '%s'.\n", | 536 OS::Print("type '%s' is not a subtype of type '%s' of '%s'.\n", |
546 src_type_name.ToCString(), | 537 src_type_name.ToCString(), |
547 dst_type_name.ToCString(), | 538 dst_type_name.ToCString(), |
548 dst_name.ToCString()); | 539 dst_name.ToCString()); |
549 } else { | 540 } else { |
550 OS::Print("malformed type used.\n"); | 541 OS::Print("malformed type used.\n"); |
551 } | 542 } |
552 } | 543 } |
553 // Throw TypeError instance. | 544 // Throw TypeError or CastError instance. |
554 Exceptions::ThrowByType(exception_type, args); | 545 Exceptions::ThrowByType(exception_type, args); |
555 UNREACHABLE(); | 546 UNREACHABLE(); |
556 } | 547 } |
557 | 548 |
558 | 549 |
559 void Exceptions::Throw(const Instance& exception) { | 550 void Exceptions::Throw(const Instance& exception) { |
560 Isolate* isolate = Isolate::Current(); | 551 Isolate* isolate = Isolate::Current(); |
561 isolate->debugger()->SignalExceptionThrown(exception); | 552 isolate->debugger()->SignalExceptionThrown(exception); |
562 // Null object is a valid exception object. | 553 // Null object is a valid exception object. |
563 ThrowExceptionHelper(exception, Instance::Handle(isolate)); | 554 ThrowExceptionHelper(exception, Instance::Handle(isolate)); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 library = Library::CoreLibrary(); | 629 library = Library::CoreLibrary(); |
639 class_name = &Symbols::RangeError(); | 630 class_name = &Symbols::RangeError(); |
640 break; | 631 break; |
641 case kArgument: | 632 case kArgument: |
642 library = Library::CoreLibrary(); | 633 library = Library::CoreLibrary(); |
643 class_name = &Symbols::ArgumentError(); | 634 class_name = &Symbols::ArgumentError(); |
644 break; | 635 break; |
645 case kNoSuchMethod: | 636 case kNoSuchMethod: |
646 library = Library::CoreLibrary(); | 637 library = Library::CoreLibrary(); |
647 class_name = &Symbols::NoSuchMethodError(); | 638 class_name = &Symbols::NoSuchMethodError(); |
648 constructor_name = &String::Handle(Symbols::New("._withType")); | 639 constructor_name = &Symbols::DotWithType(); |
649 break; | 640 break; |
650 case kFormat: | 641 case kFormat: |
651 library = Library::CoreLibrary(); | 642 library = Library::CoreLibrary(); |
652 class_name = &Symbols::FormatException(); | 643 class_name = &Symbols::FormatException(); |
653 break; | 644 break; |
654 case kUnsupported: | 645 case kUnsupported: |
655 library = Library::CoreLibrary(); | 646 library = Library::CoreLibrary(); |
656 class_name = &Symbols::UnsupportedError(); | 647 class_name = &Symbols::UnsupportedError(); |
657 break; | 648 break; |
658 case kInternalError: | 649 case kInternalError: |
(...skipping 12 matching lines...) Expand all Loading... |
671 library = Library::IsolateLibrary(); | 662 library = Library::IsolateLibrary(); |
672 class_name = &Symbols::IsolateUnhandledException(); | 663 class_name = &Symbols::IsolateUnhandledException(); |
673 break; | 664 break; |
674 case kJavascriptIntegerOverflowError: | 665 case kJavascriptIntegerOverflowError: |
675 library = Library::CoreLibrary(); | 666 library = Library::CoreLibrary(); |
676 class_name = &Symbols::JavascriptIntegerOverflowError(); | 667 class_name = &Symbols::JavascriptIntegerOverflowError(); |
677 break; | 668 break; |
678 case kAssertion: | 669 case kAssertion: |
679 library = Library::CoreLibrary(); | 670 library = Library::CoreLibrary(); |
680 class_name = &Symbols::AssertionError(); | 671 class_name = &Symbols::AssertionError(); |
| 672 constructor_name = &Symbols::DotCreate(); |
681 break; | 673 break; |
682 case kCast: | 674 case kCast: |
683 library = Library::CoreLibrary(); | 675 library = Library::CoreLibrary(); |
684 class_name = &Symbols::CastError(); | 676 class_name = &Symbols::CastError(); |
| 677 constructor_name = &Symbols::DotCreate(); |
685 break; | 678 break; |
686 case kType: | 679 case kType: |
687 library = Library::CoreLibrary(); | 680 library = Library::CoreLibrary(); |
688 class_name = &Symbols::TypeError(); | 681 class_name = &Symbols::TypeError(); |
| 682 constructor_name = &Symbols::DotCreate(); |
689 break; | 683 break; |
690 case kFallThrough: | 684 case kFallThrough: |
691 library = Library::CoreLibrary(); | 685 library = Library::CoreLibrary(); |
692 class_name = &Symbols::FallThroughError(); | 686 class_name = &Symbols::FallThroughError(); |
| 687 constructor_name = &Symbols::DotCreate(); |
693 break; | 688 break; |
694 case kAbstractClassInstantiation: | 689 case kAbstractClassInstantiation: |
695 library = Library::CoreLibrary(); | 690 library = Library::CoreLibrary(); |
696 class_name = &Symbols::AbstractClassInstantiationError(); | 691 class_name = &Symbols::AbstractClassInstantiationError(); |
| 692 constructor_name = &Symbols::DotCreate(); |
697 break; | 693 break; |
698 case kMirroredUncaughtExceptionError: | 694 case kMirroredUncaughtExceptionError: |
699 library = Library::MirrorsLibrary(); | 695 library = Library::MirrorsLibrary(); |
700 class_name = &Symbols::MirroredUncaughtExceptionError(); | 696 class_name = &Symbols::MirroredUncaughtExceptionError(); |
701 break; | 697 break; |
702 case kMirroredCompilationError: | 698 case kMirroredCompilationError: |
703 library = Library::MirrorsLibrary(); | 699 library = Library::MirrorsLibrary(); |
704 class_name = &Symbols::MirroredCompilationError(); | 700 class_name = &Symbols::MirroredCompilationError(); |
705 break; | 701 break; |
706 } | 702 } |
707 | 703 |
708 return DartLibraryCalls::InstanceCreate(library, | 704 return DartLibraryCalls::InstanceCreate(library, |
709 *class_name, | 705 *class_name, |
710 *constructor_name, | 706 *constructor_name, |
711 arguments); | 707 arguments); |
712 } | 708 } |
713 | 709 |
714 } // namespace dart | 710 } // namespace dart |
OLD | NEW |