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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 DEFINE_FLAG(bool, show_internal_names, false, | 58 DEFINE_FLAG(bool, show_internal_names, false, |
59 "Show names of internal classes (e.g. \"OneByteString\") in error messages " | 59 "Show names of internal classes (e.g. \"OneByteString\") in error messages " |
60 "instead of showing the corresponding interface names (e.g. \"String\")"); | 60 "instead of showing the corresponding interface names (e.g. \"String\")"); |
61 DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false, | 61 DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false, |
62 "Throw an exception when the result of an integer calculation will not " | 62 "Throw an exception when the result of an integer calculation will not " |
63 "fit into a javascript integer."); | 63 "fit into a javascript integer."); |
64 DEFINE_FLAG(bool, use_field_guards, true, "Guard field cids."); | 64 DEFINE_FLAG(bool, use_field_guards, true, "Guard field cids."); |
65 DEFINE_FLAG(bool, use_lib_cache, true, "Use library name cache"); | 65 DEFINE_FLAG(bool, use_lib_cache, true, "Use library name cache"); |
66 DEFINE_FLAG(bool, trace_field_guards, false, "Trace changes in field's cids."); | 66 DEFINE_FLAG(bool, trace_field_guards, false, "Trace changes in field's cids."); |
67 | 67 |
68 DECLARE_FLAG(bool, error_on_bad_override); | |
69 DECLARE_FLAG(bool, trace_compiler); | 68 DECLARE_FLAG(bool, trace_compiler); |
70 DECLARE_FLAG(bool, trace_deoptimization); | 69 DECLARE_FLAG(bool, trace_deoptimization); |
71 DECLARE_FLAG(bool, trace_deoptimization_verbose); | 70 DECLARE_FLAG(bool, trace_deoptimization_verbose); |
72 DECLARE_FLAG(bool, show_invisible_frames); | 71 DECLARE_FLAG(bool, show_invisible_frames); |
73 DECLARE_FLAG(charp, coverage_dir); | 72 DECLARE_FLAG(charp, coverage_dir); |
74 DECLARE_FLAG(bool, write_protect_code); | 73 DECLARE_FLAG(bool, write_protect_code); |
75 | 74 |
76 static const char* kGetterPrefix = "get:"; | 75 static const char* kGetterPrefix = "get:"; |
77 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix); | 76 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix); |
78 static const char* kSetterPrefix = "set:"; | 77 static const char* kSetterPrefix = "set:"; |
(...skipping 5029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5108 | 5107 |
5109 bool Function::HasCode() const { | 5108 bool Function::HasCode() const { |
5110 ASSERT(raw_ptr()->instructions_ != Instructions::null()); | 5109 ASSERT(raw_ptr()->instructions_ != Instructions::null()); |
5111 StubCode* stub_code = Isolate::Current()->stub_code(); | 5110 StubCode* stub_code = Isolate::Current()->stub_code(); |
5112 return raw_ptr()->instructions_ != | 5111 return raw_ptr()->instructions_ != |
5113 stub_code->LazyCompile_entry()->code()->ptr()->instructions_; | 5112 stub_code->LazyCompile_entry()->code()->ptr()->instructions_; |
5114 } | 5113 } |
5115 | 5114 |
5116 | 5115 |
5117 void Function::ClearCode() const { | 5116 void Function::ClearCode() const { |
| 5117 ASSERT(ic_data_array() == Array::null()); |
5118 StorePointer(&raw_ptr()->unoptimized_code_, Code::null()); | 5118 StorePointer(&raw_ptr()->unoptimized_code_, Code::null()); |
5119 StubCode* stub_code = Isolate::Current()->stub_code(); | 5119 StubCode* stub_code = Isolate::Current()->stub_code(); |
5120 StorePointer(&raw_ptr()->instructions_, | 5120 StorePointer(&raw_ptr()->instructions_, |
5121 Code::Handle(stub_code->LazyCompile_entry()->code()).instructions()); | 5121 Code::Handle(stub_code->LazyCompile_entry()->code()).instructions()); |
5122 } | 5122 } |
5123 | 5123 |
5124 | 5124 |
5125 void Function::SwitchToUnoptimizedCode() const { | 5125 void Function::SwitchToUnoptimizedCode() const { |
5126 ASSERT(HasOptimizedCode()); | 5126 ASSERT(HasOptimizedCode()); |
5127 Thread* thread = Thread::Current(); | 5127 Thread* thread = Thread::Current(); |
5128 Isolate* isolate = thread->isolate(); | 5128 Isolate* isolate = thread->isolate(); |
5129 Zone* zone = thread->zone(); | 5129 Zone* zone = thread->zone(); |
5130 const Code& current_code = Code::Handle(zone, CurrentCode()); | 5130 const Code& current_code = Code::Handle(zone, CurrentCode()); |
5131 | 5131 |
5132 if (FLAG_trace_deoptimization_verbose) { | 5132 if (FLAG_trace_deoptimization_verbose) { |
5133 OS::Print("Disabling optimized code: '%s' entry: %#" Px "\n", | 5133 OS::Print("Disabling optimized code: '%s' entry: %#" Px "\n", |
5134 ToFullyQualifiedCString(), | 5134 ToFullyQualifiedCString(), |
5135 current_code.EntryPoint()); | 5135 current_code.EntryPoint()); |
5136 } | 5136 } |
5137 // Patch entry of the optimized code. | 5137 // Patch entry of the optimized code. |
5138 CodePatcher::PatchEntry(current_code); | 5138 CodePatcher::PatchEntry(current_code); |
5139 const Error& error = Error::Handle(zone, | 5139 const Error& error = Error::Handle(zone, |
5140 Compiler::EnsureUnoptimizedCode(thread, *this)); | 5140 Compiler::EnsureUnoptimizedCode(thread, *this)); |
5141 if (!error.IsNull()) { | 5141 if (!error.IsNull()) { |
5142 Exceptions::PropagateError(error); | 5142 Exceptions::PropagateError(error); |
5143 } | 5143 } |
5144 AttachCode(Code::Handle(zone, unoptimized_code())); | 5144 const Code& unopt_code = Code::Handle(zone, unoptimized_code()); |
5145 CodePatcher::RestoreEntry(Code::Handle(zone, unoptimized_code())); | 5145 AttachCode(unopt_code); |
| 5146 CodePatcher::RestoreEntry(unopt_code); |
5146 isolate->TrackDeoptimizedCode(current_code); | 5147 isolate->TrackDeoptimizedCode(current_code); |
5147 } | 5148 } |
5148 | 5149 |
5149 | 5150 |
5150 void Function::set_unoptimized_code(const Code& value) const { | 5151 void Function::set_unoptimized_code(const Code& value) const { |
5151 ASSERT(value.IsNull() || !value.is_optimized()); | 5152 ASSERT(value.IsNull() || !value.is_optimized()); |
5152 StorePointer(&raw_ptr()->unoptimized_code_, value.raw()); | 5153 StorePointer(&raw_ptr()->unoptimized_code_, value.raw()); |
5153 } | 5154 } |
5154 | 5155 |
5155 | 5156 |
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5899 const char* Function::ToQualifiedCString() const { | 5900 const char* Function::ToQualifiedCString() const { |
5900 char* chars = NULL; | 5901 char* chars = NULL; |
5901 ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false, | 5902 ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false, |
5902 kQualifiedFunctionLibKindLibUrl); | 5903 kQualifiedFunctionLibKindLibUrl); |
5903 return chars; | 5904 return chars; |
5904 } | 5905 } |
5905 | 5906 |
5906 | 5907 |
5907 bool Function::HasCompatibleParametersWith(const Function& other, | 5908 bool Function::HasCompatibleParametersWith(const Function& other, |
5908 Error* bound_error) const { | 5909 Error* bound_error) const { |
5909 ASSERT(Isolate::Current()->ErrorOnBadOverrideEnabled()); | 5910 ASSERT(Isolate::Current()->flags().error_on_bad_override()); |
5910 ASSERT((bound_error != NULL) && bound_error->IsNull()); | 5911 ASSERT((bound_error != NULL) && bound_error->IsNull()); |
5911 // Check that this function's signature type is a subtype of the other | 5912 // Check that this function's signature type is a subtype of the other |
5912 // function's signature type. | 5913 // function's signature type. |
5913 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), | 5914 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), |
5914 other, Object::null_type_arguments(), bound_error)) { | 5915 other, Object::null_type_arguments(), bound_error)) { |
5915 // For more informative error reporting, use the location of the other | 5916 // For more informative error reporting, use the location of the other |
5916 // function here, since the caller will use the location of this function. | 5917 // function here, since the caller will use the location of this function. |
5917 *bound_error = LanguageError::NewFormatted( | 5918 *bound_error = LanguageError::NewFormatted( |
5918 *bound_error, // A bound error if non null. | 5919 *bound_error, // A bound error if non null. |
5919 Script::Handle(other.script()), | 5920 Script::Handle(other.script()), |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6191 | 6192 |
6192 | 6193 |
6193 RawFunction* Function::Clone(const Class& new_owner) const { | 6194 RawFunction* Function::Clone(const Class& new_owner) const { |
6194 ASSERT(!IsGenerativeConstructor()); | 6195 ASSERT(!IsGenerativeConstructor()); |
6195 Function& clone = Function::Handle(); | 6196 Function& clone = Function::Handle(); |
6196 clone ^= Object::Clone(*this, Heap::kOld); | 6197 clone ^= Object::Clone(*this, Heap::kOld); |
6197 const Class& origin = Class::Handle(this->origin()); | 6198 const Class& origin = Class::Handle(this->origin()); |
6198 const PatchClass& clone_owner = | 6199 const PatchClass& clone_owner = |
6199 PatchClass::Handle(PatchClass::New(new_owner, origin)); | 6200 PatchClass::Handle(PatchClass::New(new_owner, origin)); |
6200 clone.set_owner(clone_owner); | 6201 clone.set_owner(clone_owner); |
| 6202 clone.ClearICDataArray(); |
6201 clone.ClearCode(); | 6203 clone.ClearCode(); |
6202 clone.set_usage_counter(0); | 6204 clone.set_usage_counter(0); |
6203 clone.set_deoptimization_counter(0); | 6205 clone.set_deoptimization_counter(0); |
6204 clone.set_regexp_cid(kIllegalCid); | 6206 clone.set_regexp_cid(kIllegalCid); |
6205 clone.set_optimized_instruction_count(0); | 6207 clone.set_optimized_instruction_count(0); |
6206 clone.set_optimized_call_site_count(0); | 6208 clone.set_optimized_call_site_count(0); |
6207 clone.set_ic_data_array(Array::Handle()); | |
6208 if (new_owner.NumTypeParameters() > 0) { | 6209 if (new_owner.NumTypeParameters() > 0) { |
6209 // Adjust uninstantiated types to refer to type parameters of the new owner. | 6210 // Adjust uninstantiated types to refer to type parameters of the new owner. |
6210 AbstractType& type = AbstractType::Handle(clone.result_type()); | 6211 AbstractType& type = AbstractType::Handle(clone.result_type()); |
6211 type ^= type.CloneUninstantiated(new_owner); | 6212 type ^= type.CloneUninstantiated(new_owner); |
6212 clone.set_result_type(type); | 6213 clone.set_result_type(type); |
6213 const intptr_t num_params = clone.NumParameters(); | 6214 const intptr_t num_params = clone.NumParameters(); |
6214 Array& array = Array::Handle(clone.parameter_types()); | 6215 Array& array = Array::Handle(clone.parameter_types()); |
6215 array ^= Object::Clone(array, Heap::kOld); | 6216 array ^= Object::Clone(array, Heap::kOld); |
6216 clone.set_parameter_types(array); | 6217 clone.set_parameter_types(array); |
6217 for (intptr_t i = 0; i < num_params; i++) { | 6218 for (intptr_t i = 0; i < num_params; i++) { |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6748 void Function::set_ic_data_array(const Array& value) const { | 6749 void Function::set_ic_data_array(const Array& value) const { |
6749 StorePointer(&raw_ptr()->ic_data_array_, value.raw()); | 6750 StorePointer(&raw_ptr()->ic_data_array_, value.raw()); |
6750 } | 6751 } |
6751 | 6752 |
6752 | 6753 |
6753 RawArray* Function::ic_data_array() const { | 6754 RawArray* Function::ic_data_array() const { |
6754 return raw_ptr()->ic_data_array_; | 6755 return raw_ptr()->ic_data_array_; |
6755 } | 6756 } |
6756 | 6757 |
6757 void Function::ClearICDataArray() const { | 6758 void Function::ClearICDataArray() const { |
6758 set_ic_data_array(Array::Handle()); | 6759 set_ic_data_array(Array::null_array()); |
6759 } | 6760 } |
6760 | 6761 |
6761 | 6762 |
6762 void Function::SetDeoptReasonForAll(intptr_t deopt_id, | 6763 void Function::SetDeoptReasonForAll(intptr_t deopt_id, |
6763 ICData::DeoptReasonId reason) { | 6764 ICData::DeoptReasonId reason) { |
6764 const Array& icd_array = Array::Handle(ic_data_array()); | 6765 const Array& icd_array = Array::Handle(ic_data_array()); |
6765 ICData& icd = ICData::Handle(); | 6766 ICData& icd = ICData::Handle(); |
6766 for (intptr_t i = 0; i < icd_array.Length(); i++) { | 6767 for (intptr_t i = 0; i < icd_array.Length(); i++) { |
6767 icd ^= icd_array.At(i); | 6768 icd ^= icd_array.At(i); |
6768 if (icd.deopt_id() == deopt_id) { | 6769 if (icd.deopt_id() == deopt_id) { |
(...skipping 7176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13945 ASSERT(type_arguments.IsNull() || | 13946 ASSERT(type_arguments.IsNull() || |
13946 (type_arguments.Length() >= cls.NumTypeArguments())); | 13947 (type_arguments.Length() >= cls.NumTypeArguments())); |
13947 } | 13948 } |
13948 Class& other_class = Class::Handle(isolate); | 13949 Class& other_class = Class::Handle(isolate); |
13949 TypeArguments& other_type_arguments = TypeArguments::Handle(isolate); | 13950 TypeArguments& other_type_arguments = TypeArguments::Handle(isolate); |
13950 // Note that we may encounter a bound error in checked mode. | 13951 // Note that we may encounter a bound error in checked mode. |
13951 if (!other.IsInstantiated()) { | 13952 if (!other.IsInstantiated()) { |
13952 const AbstractType& instantiated_other = AbstractType::Handle( | 13953 const AbstractType& instantiated_other = AbstractType::Handle( |
13953 isolate, other.InstantiateFrom(other_instantiator, bound_error)); | 13954 isolate, other.InstantiateFrom(other_instantiator, bound_error)); |
13954 if ((bound_error != NULL) && !bound_error->IsNull()) { | 13955 if ((bound_error != NULL) && !bound_error->IsNull()) { |
13955 ASSERT(Isolate::Current()->TypeChecksEnabled()); | 13956 ASSERT(Isolate::Current()->flags().type_checks()); |
13956 return false; | 13957 return false; |
13957 } | 13958 } |
13958 other_class = instantiated_other.type_class(); | 13959 other_class = instantiated_other.type_class(); |
13959 other_type_arguments = instantiated_other.arguments(); | 13960 other_type_arguments = instantiated_other.arguments(); |
13960 } else { | 13961 } else { |
13961 other_class = other.type_class(); | 13962 other_class = other.type_class(); |
13962 other_type_arguments = other.arguments(); | 13963 other_type_arguments = other.arguments(); |
13963 } | 13964 } |
13964 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, | 13965 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, |
13965 bound_error); | 13966 bound_error); |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14612 // more specific than test. | 14613 // more specific than test. |
14613 ASSERT(test_kind == kIsMoreSpecificThan); | 14614 ASSERT(test_kind == kIsMoreSpecificThan); |
14614 return false; | 14615 return false; |
14615 } | 14616 } |
14616 // In case the type checked in a type test is malbounded, the code generator | 14617 // In case the type checked in a type test is malbounded, the code generator |
14617 // may compile a throw instead of a run time call performing the type check. | 14618 // may compile a throw instead of a run time call performing the type check. |
14618 // However, in checked mode, a function type may include malbounded result | 14619 // However, in checked mode, a function type may include malbounded result |
14619 // type and/or malbounded parameter types, which will then be encountered here | 14620 // type and/or malbounded parameter types, which will then be encountered here |
14620 // at run time. | 14621 // at run time. |
14621 if (IsMalbounded()) { | 14622 if (IsMalbounded()) { |
14622 ASSERT(Isolate::Current()->TypeChecksEnabled()); | 14623 ASSERT(Isolate::Current()->flags().type_checks()); |
14623 if ((bound_error != NULL) && bound_error->IsNull()) { | 14624 if ((bound_error != NULL) && bound_error->IsNull()) { |
14624 *bound_error = error(); | 14625 *bound_error = error(); |
14625 } | 14626 } |
14626 return false; | 14627 return false; |
14627 } | 14628 } |
14628 if (other.IsMalbounded()) { | 14629 if (other.IsMalbounded()) { |
14629 ASSERT(Isolate::Current()->TypeChecksEnabled()); | 14630 ASSERT(Isolate::Current()->flags().type_checks()); |
14630 if ((bound_error != NULL) && bound_error->IsNull()) { | 14631 if ((bound_error != NULL) && bound_error->IsNull()) { |
14631 *bound_error = other.error(); | 14632 *bound_error = other.error(); |
14632 } | 14633 } |
14633 return false; | 14634 return false; |
14634 } | 14635 } |
14635 if (IsBoundedType() || other.IsBoundedType()) { | 14636 if (IsBoundedType() || other.IsBoundedType()) { |
14636 if (Equals(other)) { | 14637 if (Equals(other)) { |
14637 return true; | 14638 return true; |
14638 } | 14639 } |
14639 return false; // TODO(regis): We should return "maybe after instantiation". | 14640 return false; // TODO(regis): We should return "maybe after instantiation". |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14826 bool Type::IsMalformed() const { | 14827 bool Type::IsMalformed() const { |
14827 if (raw_ptr()->error_ == LanguageError::null()) { | 14828 if (raw_ptr()->error_ == LanguageError::null()) { |
14828 return false; | 14829 return false; |
14829 } | 14830 } |
14830 const LanguageError& type_error = LanguageError::Handle(error()); | 14831 const LanguageError& type_error = LanguageError::Handle(error()); |
14831 return type_error.kind() == Report::kMalformedType; | 14832 return type_error.kind() == Report::kMalformedType; |
14832 } | 14833 } |
14833 | 14834 |
14834 | 14835 |
14835 bool Type::IsMalbounded() const { | 14836 bool Type::IsMalbounded() const { |
14836 if (!Isolate::Current()->TypeChecksEnabled()) { | 14837 if (!Isolate::Current()->flags().type_checks()) { |
14837 return false; | 14838 return false; |
14838 } | 14839 } |
14839 if (raw_ptr()->error_ == LanguageError::null()) { | 14840 if (raw_ptr()->error_ == LanguageError::null()) { |
14840 return false; | 14841 return false; |
14841 } | 14842 } |
14842 const LanguageError& type_error = LanguageError::Handle(error()); | 14843 const LanguageError& type_error = LanguageError::Handle(error()); |
14843 return type_error.kind() == Report::kMalboundedType; | 14844 return type_error.kind() == Report::kMalboundedType; |
14844 } | 14845 } |
14845 | 14846 |
14846 | 14847 |
14847 bool Type::IsMalformedOrMalbounded() const { | 14848 bool Type::IsMalformedOrMalbounded() const { |
14848 if (raw_ptr()->error_ == LanguageError::null()) { | 14849 if (raw_ptr()->error_ == LanguageError::null()) { |
14849 return false; | 14850 return false; |
14850 } | 14851 } |
14851 const LanguageError& type_error = LanguageError::Handle(error()); | 14852 const LanguageError& type_error = LanguageError::Handle(error()); |
14852 if (type_error.kind() == Report::kMalformedType) { | 14853 if (type_error.kind() == Report::kMalformedType) { |
14853 return true; | 14854 return true; |
14854 } | 14855 } |
14855 ASSERT(type_error.kind() == Report::kMalboundedType); | 14856 ASSERT(type_error.kind() == Report::kMalboundedType); |
14856 return Isolate::Current()->TypeChecksEnabled(); | 14857 return Isolate::Current()->flags().type_checks(); |
14857 } | 14858 } |
14858 | 14859 |
14859 | 14860 |
14860 void Type::set_error(const LanguageError& value) const { | 14861 void Type::set_error(const LanguageError& value) const { |
14861 StorePointer(&raw_ptr()->error_, value.raw()); | 14862 StorePointer(&raw_ptr()->error_, value.raw()); |
14862 } | 14863 } |
14863 | 14864 |
14864 | 14865 |
14865 void Type::set_is_resolved() const { | 14866 void Type::set_is_resolved() const { |
14866 ASSERT(!IsResolved()); | 14867 ASSERT(!IsResolved()); |
(...skipping 983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15850 const TypeArguments& instantiator_type_arguments, | 15851 const TypeArguments& instantiator_type_arguments, |
15851 Error* bound_error, | 15852 Error* bound_error, |
15852 GrowableObjectArray* trail) const { | 15853 GrowableObjectArray* trail) const { |
15853 ASSERT(IsFinalized()); | 15854 ASSERT(IsFinalized()); |
15854 AbstractType& bounded_type = AbstractType::Handle(type()); | 15855 AbstractType& bounded_type = AbstractType::Handle(type()); |
15855 if (!bounded_type.IsInstantiated()) { | 15856 if (!bounded_type.IsInstantiated()) { |
15856 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, | 15857 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, |
15857 bound_error, | 15858 bound_error, |
15858 trail); | 15859 trail); |
15859 } | 15860 } |
15860 if ((Isolate::Current()->TypeChecksEnabled()) && | 15861 if ((Isolate::Current()->flags().type_checks()) && |
15861 (bound_error != NULL) && bound_error->IsNull()) { | 15862 (bound_error != NULL) && bound_error->IsNull()) { |
15862 AbstractType& upper_bound = AbstractType::Handle(bound()); | 15863 AbstractType& upper_bound = AbstractType::Handle(bound()); |
15863 ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType()); | 15864 ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType()); |
15864 const TypeParameter& type_param = TypeParameter::Handle(type_parameter()); | 15865 const TypeParameter& type_param = TypeParameter::Handle(type_parameter()); |
15865 if (!upper_bound.IsInstantiated()) { | 15866 if (!upper_bound.IsInstantiated()) { |
15866 upper_bound = upper_bound.InstantiateFrom(instantiator_type_arguments, | 15867 upper_bound = upper_bound.InstantiateFrom(instantiator_type_arguments, |
15867 bound_error, | 15868 bound_error, |
15868 trail); | 15869 trail); |
15869 } | 15870 } |
15870 if (bound_error->IsNull()) { | 15871 if (bound_error->IsNull()) { |
(...skipping 4941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20812 return tag_label.ToCString(); | 20813 return tag_label.ToCString(); |
20813 } | 20814 } |
20814 | 20815 |
20815 | 20816 |
20816 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 20817 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
20817 Instance::PrintJSONImpl(stream, ref); | 20818 Instance::PrintJSONImpl(stream, ref); |
20818 } | 20819 } |
20819 | 20820 |
20820 | 20821 |
20821 } // namespace dart | 20822 } // namespace dart |
OLD | NEW |