Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1675 result.set_num_type_arguments(0); | 1675 result.set_num_type_arguments(0); |
| 1676 result.set_num_own_type_arguments(0); | 1676 result.set_num_own_type_arguments(0); |
| 1677 result.set_num_native_fields(0); | 1677 result.set_num_native_fields(0); |
| 1678 result.set_token_pos(Scanner::kDummyTokenIndex); | 1678 result.set_token_pos(Scanner::kDummyTokenIndex); |
| 1679 result.InitEmptyFields(); | 1679 result.InitEmptyFields(); |
| 1680 Isolate::Current()->RegisterClass(result); | 1680 Isolate::Current()->RegisterClass(result); |
| 1681 return result.raw(); | 1681 return result.raw(); |
| 1682 } | 1682 } |
| 1683 | 1683 |
| 1684 | 1684 |
| 1685 static RawError* FormatError(const Error& prev_error, | |
| 1686 const Script& script, | |
| 1687 intptr_t token_pos, | |
| 1688 const char* format, ...) { | |
| 1689 va_list args; | |
| 1690 va_start(args, format); | |
| 1691 if (prev_error.IsNull()) { | |
| 1692 return Parser::FormatError(script, token_pos, "Error", format, args); | |
| 1693 } else { | |
| 1694 return Parser::FormatErrorWithAppend(prev_error, script, token_pos, | |
| 1695 "Error", format, args); | |
| 1696 } | |
| 1697 } | |
| 1698 | |
| 1699 | 1685 |
| 1700 static void ReportTooManyTypeArguments(const Class& cls) { | 1686 static void ReportTooManyTypeArguments(const Class& cls) { |
| 1701 const Error& error = Error::Handle( | 1687 const Error& error = Error::Handle( |
| 1702 FormatError(Error::Handle(), // No previous error. | 1688 LanguageError::NewFormatted( |
| 1703 Script::Handle(cls.script()), cls.token_pos(), | 1689 Error::Handle(), // No previous error. |
| 1704 "too many type parameters declared in class '%s' or in its " | 1690 Script::Handle(cls.script()), |
| 1705 "super classes", | 1691 cls.token_pos(), |
| 1706 String::Handle(cls.Name()).ToCString())); | 1692 LanguageError::kError, |
| 1693 Heap::kNew, | |
| 1694 "too many type parameters declared in class '%s' or in its " | |
| 1695 "super classes", | |
| 1696 String::Handle(cls.Name()).ToCString())); | |
| 1707 Isolate::Current()->long_jump_base()->Jump(1, error); | 1697 Isolate::Current()->long_jump_base()->Jump(1, error); |
| 1708 UNREACHABLE(); | 1698 UNREACHABLE(); |
| 1709 } | 1699 } |
| 1710 | 1700 |
| 1711 | 1701 |
| 1712 void Class::set_num_type_arguments(intptr_t value) const { | 1702 void Class::set_num_type_arguments(intptr_t value) const { |
| 1713 if (!Utils::IsInt(16, value)) { | 1703 if (!Utils::IsInt(16, value)) { |
| 1714 ReportTooManyTypeArguments(*this); | 1704 ReportTooManyTypeArguments(*this); |
| 1715 } | 1705 } |
| 1716 raw_ptr()->num_type_arguments_ = value; | 1706 raw_ptr()->num_type_arguments_ = value; |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2233 // the loop below. | 2223 // the loop below. |
| 2234 // However, an implicitly created constructor should not be preserved if | 2224 // However, an implicitly created constructor should not be preserved if |
| 2235 // the patch provides a constructor or a factory. Wait for now. | 2225 // the patch provides a constructor or a factory. Wait for now. |
| 2236 if (orig_func.raw() != orig_implicit_ctor.raw()) { | 2226 if (orig_func.raw() != orig_implicit_ctor.raw()) { |
| 2237 new_functions.Add(orig_func); | 2227 new_functions.Add(orig_func); |
| 2238 } | 2228 } |
| 2239 } else if (func.UserVisibleSignature() != | 2229 } else if (func.UserVisibleSignature() != |
| 2240 orig_func.UserVisibleSignature()) { | 2230 orig_func.UserVisibleSignature()) { |
| 2241 // Compare user visible signatures to ignore different implicit parameters | 2231 // Compare user visible signatures to ignore different implicit parameters |
| 2242 // when patching a constructor with a factory. | 2232 // when patching a constructor with a factory. |
| 2243 *error = FormatError(*error, // No previous error. | 2233 *error = LanguageError::NewFormatted( |
| 2244 Script::Handle(patch.script()), func.token_pos(), | 2234 *error, // No previous error. |
| 2245 "signature mismatch: '%s'", member_name.ToCString()); | 2235 Script::Handle(patch.script()), |
| 2236 func.token_pos(), | |
| 2237 LanguageError::kError, | |
| 2238 Heap::kNew, | |
| 2239 "signature mismatch: '%s'", member_name.ToCString()); | |
| 2246 return false; | 2240 return false; |
| 2247 } | 2241 } |
| 2248 } | 2242 } |
| 2249 for (intptr_t i = 0; i < patch_len; i++) { | 2243 for (intptr_t i = 0; i < patch_len; i++) { |
| 2250 func ^= patch_list.At(i); | 2244 func ^= patch_list.At(i); |
| 2251 if (func.IsConstructor() || func.IsFactory()) { | 2245 if (func.IsConstructor() || func.IsFactory()) { |
| 2252 // Do not preserve the original implicit constructor, if any. | 2246 // Do not preserve the original implicit constructor, if any. |
| 2253 orig_implicit_ctor = Function::null(); | 2247 orig_implicit_ctor = Function::null(); |
| 2254 } | 2248 } |
| 2255 func.set_owner(patch_class); | 2249 func.set_owner(patch_class); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2274 new_list = Array::New(patch_len + orig_len); | 2268 new_list = Array::New(patch_len + orig_len); |
| 2275 for (intptr_t i = 0; i < patch_len; i++) { | 2269 for (intptr_t i = 0; i < patch_len; i++) { |
| 2276 field ^= patch_list.At(i); | 2270 field ^= patch_list.At(i); |
| 2277 field.set_owner(*this); | 2271 field.set_owner(*this); |
| 2278 member_name = field.name(); | 2272 member_name = field.name(); |
| 2279 // TODO(iposva): Verify non-public fields only. | 2273 // TODO(iposva): Verify non-public fields only. |
| 2280 | 2274 |
| 2281 // Verify no duplicate additions. | 2275 // Verify no duplicate additions. |
| 2282 orig_field ^= LookupField(member_name); | 2276 orig_field ^= LookupField(member_name); |
| 2283 if (!orig_field.IsNull()) { | 2277 if (!orig_field.IsNull()) { |
| 2284 *error = FormatError(*error, // No previous error. | 2278 *error = LanguageError::NewFormatted( |
| 2285 Script::Handle(patch.script()), field.token_pos(), | 2279 *error, // No previous error. |
| 2286 "duplicate field: %s", member_name.ToCString()); | 2280 Script::Handle(patch.script()), |
| 2281 field.token_pos(), | |
| 2282 LanguageError::kError, | |
| 2283 Heap::kNew, | |
| 2284 "duplicate field: %s", member_name.ToCString()); | |
| 2287 return false; | 2285 return false; |
| 2288 } | 2286 } |
| 2289 new_list.SetAt(i, field); | 2287 new_list.SetAt(i, field); |
| 2290 } | 2288 } |
| 2291 for (intptr_t i = 0; i < orig_len; i++) { | 2289 for (intptr_t i = 0; i < orig_len; i++) { |
| 2292 field ^= orig_list.At(i); | 2290 field ^= orig_list.At(i); |
| 2293 new_list.SetAt(patch_len + i, field); | 2291 new_list.SetAt(patch_len + i, field); |
| 2294 } | 2292 } |
| 2295 SetFields(new_list); | 2293 SetFields(new_list); |
| 2296 | 2294 |
| (...skipping 2548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4845 bool Function::HasCompatibleParametersWith(const Function& other, | 4843 bool Function::HasCompatibleParametersWith(const Function& other, |
| 4846 Error* bound_error) const { | 4844 Error* bound_error) const { |
| 4847 ASSERT(FLAG_error_on_bad_override); | 4845 ASSERT(FLAG_error_on_bad_override); |
| 4848 ASSERT((bound_error != NULL) && bound_error->IsNull()); | 4846 ASSERT((bound_error != NULL) && bound_error->IsNull()); |
| 4849 // Check that this function's signature type is a subtype of the other | 4847 // Check that this function's signature type is a subtype of the other |
| 4850 // function's signature type. | 4848 // function's signature type. |
| 4851 if (!TypeTest(kIsSubtypeOf, Object::null_abstract_type_arguments(), | 4849 if (!TypeTest(kIsSubtypeOf, Object::null_abstract_type_arguments(), |
| 4852 other, Object::null_abstract_type_arguments(), bound_error)) { | 4850 other, Object::null_abstract_type_arguments(), bound_error)) { |
| 4853 // For more informative error reporting, use the location of the other | 4851 // For more informative error reporting, use the location of the other |
| 4854 // function here, since the caller will use the location of this function. | 4852 // function here, since the caller will use the location of this function. |
| 4855 *bound_error = FormatError( | 4853 *bound_error = LanguageError::NewFormatted( |
| 4856 *bound_error, // A bound error if non null. | 4854 *bound_error, // A bound error if non null. |
| 4857 Script::Handle(other.script()), | 4855 Script::Handle(other.script()), |
| 4858 other.token_pos(), | 4856 other.token_pos(), |
| 4857 LanguageError::kError, | |
| 4858 Heap::kNew, | |
| 4859 "signature type '%s' of function '%s' is not a subtype of signature " | 4859 "signature type '%s' of function '%s' is not a subtype of signature " |
| 4860 "type '%s' of function '%s'", | 4860 "type '%s' of function '%s'", |
| 4861 String::Handle(UserVisibleSignature()).ToCString(), | 4861 String::Handle(UserVisibleSignature()).ToCString(), |
| 4862 String::Handle(UserVisibleName()).ToCString(), | 4862 String::Handle(UserVisibleName()).ToCString(), |
| 4863 String::Handle(other.UserVisibleSignature()).ToCString(), | 4863 String::Handle(other.UserVisibleSignature()).ToCString(), |
| 4864 String::Handle(other.UserVisibleName()).ToCString()); | 4864 String::Handle(other.UserVisibleName()).ToCString()); |
| 4865 return false; | 4865 return false; |
| 4866 } | 4866 } |
| 4867 // We should also check that if the other function explicitly specifies a | 4867 // We should also check that if the other function explicitly specifies a |
| 4868 // default value for a formal parameter, this function does not specify a | 4868 // default value for a formal parameter, this function does not specify a |
| (...skipping 5803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10672 | 10672 |
| 10673 RawLanguageError* LanguageError::New() { | 10673 RawLanguageError* LanguageError::New() { |
| 10674 ASSERT(Object::language_error_class() != Class::null()); | 10674 ASSERT(Object::language_error_class() != Class::null()); |
| 10675 RawObject* raw = Object::Allocate(LanguageError::kClassId, | 10675 RawObject* raw = Object::Allocate(LanguageError::kClassId, |
| 10676 LanguageError::InstanceSize(), | 10676 LanguageError::InstanceSize(), |
| 10677 Heap::kOld); | 10677 Heap::kOld); |
| 10678 return reinterpret_cast<RawLanguageError*>(raw); | 10678 return reinterpret_cast<RawLanguageError*>(raw); |
| 10679 } | 10679 } |
| 10680 | 10680 |
| 10681 | 10681 |
| 10682 RawLanguageError* LanguageError::New(const String& message, Heap::Space space) { | 10682 RawLanguageError* LanguageError::New(const Error& prev_error, |
| 10683 const Script& script, | |
| 10684 intptr_t token_pos, | |
| 10685 Kind kind, | |
| 10686 const String& message, | |
| 10687 Heap::Space space) { | |
| 10683 ASSERT(Object::language_error_class() != Class::null()); | 10688 ASSERT(Object::language_error_class() != Class::null()); |
| 10684 LanguageError& result = LanguageError::Handle(); | 10689 LanguageError& result = LanguageError::Handle(); |
| 10685 { | 10690 { |
| 10686 RawObject* raw = Object::Allocate(LanguageError::kClassId, | 10691 RawObject* raw = Object::Allocate(LanguageError::kClassId, |
| 10687 LanguageError::InstanceSize(), | 10692 LanguageError::InstanceSize(), |
| 10688 space); | 10693 space); |
| 10689 NoGCScope no_gc; | 10694 NoGCScope no_gc; |
| 10690 result ^= raw; | 10695 result ^= raw; |
| 10691 } | 10696 } |
| 10697 result.set_previous_error(prev_error); | |
| 10698 result.set_script(script); | |
| 10699 result.set_token_pos(token_pos); | |
| 10700 result.set_kind(kind); | |
| 10692 result.set_message(message); | 10701 result.set_message(message); |
| 10693 return result.raw(); | 10702 return result.raw(); |
| 10694 } | 10703 } |
| 10695 | 10704 |
| 10696 | 10705 |
| 10697 void LanguageError::set_message(const String& message) const { | 10706 RawLanguageError* LanguageError::NewFormattedV(const Error& prev_error, |
| 10698 StorePointer(&raw_ptr()->message_, message.raw()); | 10707 const Script& script, |
| 10708 intptr_t token_pos, | |
| 10709 Kind kind, | |
| 10710 Heap::Space space, | |
| 10711 const char* format, | |
| 10712 va_list args) { | |
| 10713 const String& msg = String::Handle(String::NewFormattedV(format, args)); | |
| 10714 return LanguageError::New(prev_error, script, token_pos, kind, msg, space); | |
| 10715 } | |
| 10716 | |
| 10717 | |
| 10718 RawLanguageError* LanguageError::NewFormatted(const Error& prev_error, | |
| 10719 const Script& script, | |
| 10720 intptr_t token_pos, | |
| 10721 Kind kind, | |
| 10722 Heap::Space space, | |
| 10723 const char* format, ...) { | |
| 10724 va_list args; | |
| 10725 va_start(args, format); | |
| 10726 RawLanguageError* result = LanguageError::NewFormattedV( | |
| 10727 prev_error, script, token_pos, kind, space, format, args); | |
| 10728 NoGCScope no_gc; | |
|
Ivan Posva
2013/11/15 04:42:13
What is this NoGCScope for?
regis
2013/11/15 18:27:38
To save a handle. Same as in String::NewFormatted.
| |
| 10729 va_end(args); | |
| 10730 return result; | |
| 10731 } | |
| 10732 | |
| 10733 | |
| 10734 RawLanguageError* LanguageError::New(const String& formatted_message, | |
| 10735 Heap::Space space) { | |
| 10736 ASSERT(Object::language_error_class() != Class::null()); | |
| 10737 LanguageError& result = LanguageError::Handle(); | |
| 10738 { | |
| 10739 RawObject* raw = Object::Allocate(LanguageError::kClassId, | |
| 10740 LanguageError::InstanceSize(), | |
| 10741 space); | |
| 10742 NoGCScope no_gc; | |
| 10743 result ^= raw; | |
| 10744 } | |
| 10745 result.set_formatted_message(formatted_message); | |
| 10746 return result.raw(); | |
| 10747 } | |
| 10748 | |
| 10749 | |
| 10750 void LanguageError::set_previous_error(const Error& value) const { | |
| 10751 StorePointer(&raw_ptr()->previous_error_, value.raw()); | |
| 10752 } | |
| 10753 | |
| 10754 | |
| 10755 void LanguageError::set_script(const Script& value) const { | |
| 10756 StorePointer(&raw_ptr()->script_, value.raw()); | |
| 10757 } | |
| 10758 | |
| 10759 | |
| 10760 void LanguageError::set_token_pos(intptr_t value) const { | |
| 10761 ASSERT(value >= 0); | |
| 10762 raw_ptr()->token_pos_ = value; | |
| 10763 } | |
| 10764 | |
| 10765 | |
| 10766 void LanguageError::set_kind(uint8_t value) const { | |
| 10767 raw_ptr()->kind_ = value; | |
| 10768 } | |
| 10769 | |
| 10770 | |
| 10771 void LanguageError::set_message(const String& value) const { | |
| 10772 StorePointer(&raw_ptr()->message_, value.raw()); | |
| 10773 } | |
| 10774 | |
| 10775 | |
| 10776 void LanguageError::set_formatted_message(const String& value) const { | |
| 10777 StorePointer(&raw_ptr()->formatted_message_, value.raw()); | |
| 10778 } | |
| 10779 | |
| 10780 | |
| 10781 RawString* LanguageError::FormatMessage() const { | |
| 10782 if (formatted_message() != String::null()) { | |
| 10783 return formatted_message(); | |
| 10784 } | |
| 10785 const char* message_header; | |
| 10786 switch (kind()) { | |
| 10787 case kWarning: message_header = "warning"; break; | |
| 10788 case kError: message_header = "error"; break; | |
| 10789 case kMalformedType: message_header = "malformed type"; break; | |
| 10790 case kMalboundedType: message_header = "malbounded type"; break; | |
| 10791 default: message_header = ""; UNREACHABLE(); | |
| 10792 } | |
| 10793 String& result = String::Handle(); | |
| 10794 String& msg = String::Handle(message()); | |
| 10795 const Script& scr = Script::Handle(script()); | |
| 10796 if (!scr.IsNull()) { | |
| 10797 const String& script_url = String::Handle(scr.url()); | |
| 10798 if (token_pos() >= 0) { | |
| 10799 intptr_t line, column; | |
| 10800 scr.GetTokenLocation(token_pos(), &line, &column); | |
| 10801 // Only report the line position if we have the original source. We still | |
| 10802 // need to get a valid column so that we can report the ^ mark below the | |
| 10803 // snippet. | |
| 10804 if (scr.HasSource()) { | |
| 10805 result = String::NewFormatted("'%s': %s: line %" Pd " pos %" Pd ": ", | |
| 10806 script_url.ToCString(), | |
| 10807 message_header, | |
| 10808 line, | |
| 10809 column); | |
| 10810 } else { | |
| 10811 result = String::NewFormatted("'%s': %s: line %" Pd ": ", | |
| 10812 script_url.ToCString(), | |
| 10813 message_header, | |
| 10814 line); | |
| 10815 } | |
| 10816 // Append the formatted error or warning message. | |
| 10817 result = String::Concat(result, msg); | |
| 10818 const String& new_line = String::Handle(String::New("\n")); | |
|
Ivan Posva
2013/11/15 04:42:13
Please just use Symbols::NewLine() where we use th
regis
2013/11/15 18:27:38
Done.
| |
| 10819 // Append the source line. | |
| 10820 const String& script_line = String::Handle(scr.GetLine(line)); | |
| 10821 ASSERT(!script_line.IsNull()); | |
| 10822 result = String::Concat(result, new_line); | |
| 10823 result = String::Concat(result, script_line); | |
| 10824 result = String::Concat(result, new_line); | |
| 10825 // Append the column marker. | |
| 10826 const String& column_line = String::Handle( | |
| 10827 String::NewFormatted("%*s\n", static_cast<int>(column), "^")); | |
| 10828 result = String::Concat(result, column_line); | |
| 10829 } else { | |
| 10830 // Token position is unknown. | |
| 10831 result = String::NewFormatted("'%s': %s: ", | |
| 10832 script_url.ToCString(), | |
| 10833 message_header); | |
| 10834 result = String::Concat(result, msg); | |
| 10835 } | |
| 10836 } else { | |
| 10837 // Script is unknown. | |
| 10838 // Append the formatted error or warning message. | |
| 10839 result = String::NewFormatted("%s: ", message_header); | |
| 10840 result = String::Concat(result, msg); | |
| 10841 } | |
| 10842 // Prepend previous error message. | |
| 10843 const Error& prev_error = Error::Handle(previous_error()); | |
| 10844 if (!prev_error.IsNull()) { | |
| 10845 msg = String::New(prev_error.ToErrorCString()); | |
| 10846 result = String::Concat(msg, result); | |
| 10847 } | |
| 10848 set_formatted_message(result); | |
| 10849 return result.raw(); | |
| 10699 } | 10850 } |
| 10700 | 10851 |
| 10701 | 10852 |
| 10702 const char* LanguageError::ToErrorCString() const { | 10853 const char* LanguageError::ToErrorCString() const { |
| 10703 const String& msg_str = String::Handle(message()); | 10854 const String& msg_str = String::Handle(FormatMessage()); |
| 10704 return msg_str.ToCString(); | 10855 return msg_str.ToCString(); |
| 10705 } | 10856 } |
| 10706 | 10857 |
| 10707 | 10858 |
| 10708 const char* LanguageError::ToCString() const { | 10859 const char* LanguageError::ToCString() const { |
| 10709 return "LanguageError"; | 10860 return "LanguageError"; |
| 10710 } | 10861 } |
| 10711 | 10862 |
| 10712 | 10863 |
| 10713 void LanguageError::PrintToJSONStream(JSONStream* stream, bool ref) const { | 10864 void LanguageError::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| (...skipping 1413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12127 upper_bound.UserVisibleName()); | 12278 upper_bound.UserVisibleName()); |
| 12128 const AbstractType& declared_bound = AbstractType::Handle(bound()); | 12279 const AbstractType& declared_bound = AbstractType::Handle(bound()); |
| 12129 const String& declared_bound_name = String::Handle( | 12280 const String& declared_bound_name = String::Handle( |
| 12130 declared_bound.UserVisibleName()); | 12281 declared_bound.UserVisibleName()); |
| 12131 const String& type_param_name = String::Handle(UserVisibleName()); | 12282 const String& type_param_name = String::Handle(UserVisibleName()); |
| 12132 const Class& cls = Class::Handle(parameterized_class()); | 12283 const Class& cls = Class::Handle(parameterized_class()); |
| 12133 const String& class_name = String::Handle(cls.Name()); | 12284 const String& class_name = String::Handle(cls.Name()); |
| 12134 const Script& script = Script::Handle(cls.script()); | 12285 const Script& script = Script::Handle(cls.script()); |
| 12135 // Since the bound may have been canonicalized, its token index is | 12286 // Since the bound may have been canonicalized, its token index is |
| 12136 // meaningless, therefore use the token index of this type parameter. | 12287 // meaningless, therefore use the token index of this type parameter. |
| 12137 *bound_error = FormatError( | 12288 *bound_error = LanguageError::NewFormatted( |
| 12138 *bound_error, | 12289 *bound_error, |
| 12139 script, | 12290 script, |
| 12140 token_pos(), | 12291 token_pos(), |
| 12292 LanguageError::kMalboundedType, | |
| 12293 Heap::kNew, | |
| 12141 "type parameter '%s' of class '%s' must extend bound '%s', " | 12294 "type parameter '%s' of class '%s' must extend bound '%s', " |
| 12142 "but type argument '%s' is not a subtype of '%s'\n", | 12295 "but type argument '%s' is not a subtype of '%s'\n", |
| 12143 type_param_name.ToCString(), | 12296 type_param_name.ToCString(), |
| 12144 class_name.ToCString(), | 12297 class_name.ToCString(), |
| 12145 declared_bound_name.ToCString(), | 12298 declared_bound_name.ToCString(), |
| 12146 bounded_type_name.ToCString(), | 12299 bounded_type_name.ToCString(), |
| 12147 upper_bound_name.ToCString()); | 12300 upper_bound_name.ToCString()); |
| 12148 } | 12301 } |
| 12149 } | 12302 } |
| 12150 return false; | 12303 return false; |
| (...skipping 3632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15783 return "_MirrorReference"; | 15936 return "_MirrorReference"; |
| 15784 } | 15937 } |
| 15785 | 15938 |
| 15786 | 15939 |
| 15787 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { | 15940 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| 15788 JSONObject jsobj(stream); | 15941 JSONObject jsobj(stream); |
| 15789 } | 15942 } |
| 15790 | 15943 |
| 15791 | 15944 |
| 15792 } // namespace dart | 15945 } // namespace dart |
| OLD | NEW |