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

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

Issue 68113028: Lazily format LanguageError messages (fix issue 15069). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 1 month 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
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/flow_graph.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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/class_finalizer.h" 5 #include "vm/class_finalizer.h"
6 6
7 #include "vm/code_generator.h"
7 #include "vm/flags.h" 8 #include "vm/flags.h"
8 #include "vm/heap.h" 9 #include "vm/heap.h"
9 #include "vm/isolate.h" 10 #include "vm/isolate.h"
10 #include "vm/longjump.h" 11 #include "vm/longjump.h"
11 #include "vm/object_store.h" 12 #include "vm/object_store.h"
12 #include "vm/parser.h"
13 #include "vm/symbols.h" 13 #include "vm/symbols.h"
14 14
15 namespace dart { 15 namespace dart {
16 16
17 DEFINE_FLAG(bool, error_on_bad_override, false, 17 DEFINE_FLAG(bool, error_on_bad_override, false,
18 "Report error for bad overrides."); 18 "Report error for bad overrides.");
19 DEFINE_FLAG(bool, error_on_bad_type, false, 19 DEFINE_FLAG(bool, error_on_bad_type, false,
20 "Report error for malformed types."); 20 "Report error for malformed types.");
21 DEFINE_FLAG(bool, print_classes, false, "Prints details about loaded classes."); 21 DEFINE_FLAG(bool, print_classes, false, "Prints details about loaded classes.");
22 DEFINE_FLAG(bool, trace_class_finalization, false, "Trace class finalization."); 22 DEFINE_FLAG(bool, trace_class_finalization, false, "Trace class finalization.");
(...skipping 2584 matching lines...) Expand 10 before | Expand all | Expand 10 after
2607 OS::Print(" %s\n", field.ToCString()); 2607 OS::Print(" %s\n", field.ToCString());
2608 } 2608 }
2609 } 2609 }
2610 2610
2611 // Either report an error or mark the type as malformed. 2611 // Either report an error or mark the type as malformed.
2612 void ClassFinalizer::ReportMalformedType(const Error& prev_error, 2612 void ClassFinalizer::ReportMalformedType(const Error& prev_error,
2613 const Script& script, 2613 const Script& script,
2614 const Type& type, 2614 const Type& type,
2615 const char* format, 2615 const char* format,
2616 va_list args) { 2616 va_list args) {
2617 LanguageError& error = LanguageError::Handle(); 2617 LanguageError& error = LanguageError::Handle(
2618 if (prev_error.IsNull()) { 2618 LanguageError::NewFormattedV(
2619 error ^= Parser::FormatError( 2619 prev_error, script, type.token_pos(),
2620 script, type.token_pos(), "Error", format, args); 2620 LanguageError::kMalformedType, Heap::kOld,
2621 } else { 2621 format, args));
2622 error ^= Parser::FormatErrorWithAppend(
2623 prev_error, script, type.token_pos(), "Error", format, args);
2624 }
2625 if (FLAG_error_on_bad_type) { 2622 if (FLAG_error_on_bad_type) {
2626 ReportError(error); 2623 ReportError(error);
2627 } 2624 }
2628 type.set_malformed_error(error); 2625 type.set_malformed_error(error);
2629 // Make the type raw, since it may not be possible to 2626 // Make the type raw, since it may not be possible to
2630 // properly finalize its type arguments. 2627 // properly finalize its type arguments.
2631 type.set_type_class(Class::Handle(Object::dynamic_class())); 2628 type.set_type_class(Class::Handle(Object::dynamic_class()));
2632 type.set_arguments(Object::null_abstract_type_arguments()); 2629 type.set_arguments(Object::null_abstract_type_arguments());
2633 if (!type.IsFinalized()) { 2630 if (!type.IsFinalized()) {
2634 type.SetIsFinalized(); 2631 type.SetIsFinalized();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2677 UNREACHABLE(); 2674 UNREACHABLE();
2678 } 2675 }
2679 2676
2680 2677
2681 void ClassFinalizer::ReportError(const Error& prev_error, 2678 void ClassFinalizer::ReportError(const Error& prev_error,
2682 const Script& script, 2679 const Script& script,
2683 intptr_t token_pos, 2680 intptr_t token_pos,
2684 const char* format, ...) { 2681 const char* format, ...) {
2685 va_list args; 2682 va_list args;
2686 va_start(args, format); 2683 va_start(args, format);
2687 Error& error = Error::Handle(); 2684 Error& error = Error::Handle(
2688 if (prev_error.IsNull()) { 2685 LanguageError::NewFormattedV(
2689 error ^= Parser::FormatError(script, token_pos, "Error", format, args); 2686 prev_error, script, token_pos,
2690 } else { 2687 LanguageError::kError, Heap::kNew,
2691 error ^= Parser::FormatErrorWithAppend( 2688 format, args));
2692 prev_error, script, token_pos, "Error", format, args);
2693 }
2694 va_end(args); 2689 va_end(args);
2695 ReportError(error); 2690 ReportError(error);
2696 } 2691 }
2697 2692
2698 2693
2699 void ClassFinalizer::VerifyImplicitFieldOffsets() { 2694 void ClassFinalizer::VerifyImplicitFieldOffsets() {
2700 #ifdef DEBUG 2695 #ifdef DEBUG
2701 Isolate* isolate = Isolate::Current(); 2696 Isolate* isolate = Isolate::Current();
2702 const ClassTable& class_table = *(isolate->class_table()); 2697 const ClassTable& class_table = *(isolate->class_table());
2703 Class& cls = Class::Handle(isolate); 2698 Class& cls = Class::Handle(isolate);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2749 expected_name ^= String::New("_offset"); 2744 expected_name ^= String::New("_offset");
2750 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name)); 2745 ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
2751 field ^= fields_array.At(2); 2746 field ^= fields_array.At(2);
2752 ASSERT(field.Offset() == TypedDataView::length_offset()); 2747 ASSERT(field.Offset() == TypedDataView::length_offset());
2753 name ^= field.name(); 2748 name ^= field.name();
2754 ASSERT(name.Equals("length")); 2749 ASSERT(name.Equals("length"));
2755 #endif 2750 #endif
2756 } 2751 }
2757 2752
2758 } // namespace dart 2753 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/flow_graph.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698