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

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

Issue 1162033005: Fix http://dartbug.com/23578: (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Update to ToT. Created 5 years, 6 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
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« runtime/vm/isolate.cc ('K') | « runtime/vm/metrics_test.cc ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698