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

Side by Side Diff: runtime/vm/exceptions.cc

Issue 260713008: Add support for javascript incompatibility warnings. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
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 16 matching lines...) Expand all
27 void __asan_unpoison_memory_region(void* ignore1, size_t ignore2) {} 27 void __asan_unpoison_memory_region(void* ignore1, size_t ignore2) {}
28 #endif // defined(__has_feature) 28 #endif // defined(__has_feature)
29 29
30 30
31 namespace dart { 31 namespace dart {
32 32
33 DEFINE_FLAG(bool, print_stacktrace_at_throw, false, 33 DEFINE_FLAG(bool, print_stacktrace_at_throw, false,
34 "Prints a stack trace everytime a throw occurs."); 34 "Prints a stack trace everytime a throw occurs.");
35 DEFINE_FLAG(bool, verbose_stacktrace, false, 35 DEFINE_FLAG(bool, verbose_stacktrace, false,
36 "Stack traces will include methods marked invisible."); 36 "Stack traces will include methods marked invisible.");
37 DEFINE_FLAG(int, stacktrace_depth_on_warning, 5,
38 "Maximal number of stack frames to print after a runtime warning.");
39 DECLARE_FLAG(bool, silent_warnings);
40 DECLARE_FLAG(bool, warning_as_error);
41 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
42
37 43
38 const char* Exceptions::kCastErrorDstName = "type cast"; 44 const char* Exceptions::kCastErrorDstName = "type cast";
39 45
40 46
41 class StacktraceBuilder : public ValueObject { 47 class StacktraceBuilder : public ValueObject {
42 public: 48 public:
43 StacktraceBuilder() { } 49 StacktraceBuilder() { }
44 virtual ~StacktraceBuilder() { } 50 virtual ~StacktraceBuilder() { }
45 51
46 virtual void AddFrame(const Code& code, 52 virtual void AddFrame(const Code& code,
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 // If instance class extends 'class Error' return '_stackTrace' field. 340 // If instance class extends 'class Error' return '_stackTrace' field.
335 Class& test_class = Class::Handle(isolate, instance.clazz()); 341 Class& test_class = Class::Handle(isolate, instance.clazz());
336 AbstractType& type = AbstractType::Handle(isolate, AbstractType::null()); 342 AbstractType& type = AbstractType::Handle(isolate, AbstractType::null());
337 while (true) { 343 while (true) {
338 if (test_class.raw() == error_class.raw()) { 344 if (test_class.raw() == error_class.raw()) {
339 return error_class.LookupInstanceField(Symbols::_stackTrace()); 345 return error_class.LookupInstanceField(Symbols::_stackTrace());
340 } 346 }
341 type = test_class.super_type(); 347 type = test_class.super_type();
342 if (type.IsNull()) return Field::null(); 348 if (type.IsNull()) return Field::null();
343 test_class = type.type_class(); 349 test_class = type.type_class();
344 }; 350 }
345 UNREACHABLE(); 351 UNREACHABLE();
346 return Field::null(); 352 return Field::null();
347 } 353 }
348 354
349 355
350 RawStacktrace* Exceptions::CurrentStacktrace() { 356 RawStacktrace* Exceptions::CurrentStacktrace() {
351 Isolate* isolate = Isolate::Current(); 357 Isolate* isolate = Isolate::Current();
352 RegularStacktraceBuilder frame_builder(true); 358 RegularStacktraceBuilder frame_builder(true);
353 BuildStackTrace(&frame_builder); 359 BuildStackTrace(&frame_builder);
354 360
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 class_name = &Symbols::IsolateSpawnException(); 688 class_name = &Symbols::IsolateSpawnException();
683 break; 689 break;
684 case kIsolateUnhandledException: 690 case kIsolateUnhandledException:
685 library = Library::IsolateLibrary(); 691 library = Library::IsolateLibrary();
686 class_name = &Symbols::IsolateUnhandledException(); 692 class_name = &Symbols::IsolateUnhandledException();
687 break; 693 break;
688 case kJavascriptIntegerOverflowError: 694 case kJavascriptIntegerOverflowError:
689 library = Library::CoreLibrary(); 695 library = Library::CoreLibrary();
690 class_name = &Symbols::JavascriptIntegerOverflowError(); 696 class_name = &Symbols::JavascriptIntegerOverflowError();
691 break; 697 break;
698 case kJavascriptCompatibilityError:
699 library = Library::CoreLibrary();
700 class_name = &Symbols::JavascriptCompatibilityError();
701 break;
692 case kAssertion: 702 case kAssertion:
693 library = Library::CoreLibrary(); 703 library = Library::CoreLibrary();
694 class_name = &Symbols::AssertionError(); 704 class_name = &Symbols::AssertionError();
695 constructor_name = &Symbols::DotCreate(); 705 constructor_name = &Symbols::DotCreate();
696 break; 706 break;
697 case kCast: 707 case kCast:
698 library = Library::CoreLibrary(); 708 library = Library::CoreLibrary();
699 class_name = &Symbols::CastError(); 709 class_name = &Symbols::CastError();
700 constructor_name = &Symbols::DotCreate(); 710 constructor_name = &Symbols::DotCreate();
701 break; 711 break;
(...skipping 17 matching lines...) Expand all
719 class_name = &Symbols::MirroredCompilationError(); 729 class_name = &Symbols::MirroredCompilationError();
720 break; 730 break;
721 } 731 }
722 732
723 return DartLibraryCalls::InstanceCreate(library, 733 return DartLibraryCalls::InstanceCreate(library,
724 *class_name, 734 *class_name,
725 *constructor_name, 735 *constructor_name,
726 arguments); 736 arguments);
727 } 737 }
728 738
739
740 // Throw JavascriptCompatibilityError exception.
741 static void ThrowJavascriptCompatibilityError(const char* msg) {
742 const Array& exc_args = Array::Handle(Array::New(1));
743 const String& msg_str = String::Handle(String::New(msg));
744 exc_args.SetAt(0, msg_str);
745 Exceptions::ThrowByType(Exceptions::kJavascriptCompatibilityError, exc_args);
746 }
747
748
749 void Exceptions::JSWarning(StackFrame* caller_frame, const char* format, ...) {
750 ASSERT(caller_frame != NULL);
751 ASSERT(FLAG_warn_on_javascript_compatibility);
752 if (FLAG_silent_warnings) return;
753 const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
754 ASSERT(!caller_code.IsNull());
755 const uword caller_pc = caller_frame->pc();
756 const intptr_t token_pos = caller_code.GetTokenIndexOfPC(caller_pc);
757 const Function& caller = Function::Handle(caller_code.function());
758 const Script& script = Script::Handle(caller.script());
759 va_list args;
760 va_start(args, format);
761 const Error& error = Error::Handle(
762 LanguageError::NewFormattedV(Error::Handle(), // No previous error.
763 script, token_pos, LanguageError::kWarning,
764 Heap::kNew, format, args));
765 va_end(args);
766 if (FLAG_warning_as_error) {
767 ThrowJavascriptCompatibilityError(error.ToErrorCString());
768 } else {
769 OS::Print("javascript compatibility warning: %s", error.ToErrorCString());
770 }
771 const Stacktrace& stacktrace =
772 Stacktrace::Handle(Exceptions::CurrentStacktrace());
773 intptr_t idx = 0;
774 OS::Print("%s",
775 stacktrace.ToCStringInternal(&idx,
776 FLAG_stacktrace_depth_on_warning));
777 }
778
729 } // namespace dart 779 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/exceptions.h ('k') | runtime/vm/flow_graph_builder.h » ('j') | runtime/vm/symbols.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698