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

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

Issue 1414933006: Copy ICData descriptors when starting background compilation, so that they do not change while comp… (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: fix test Created 5 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
« runtime/vm/object.h ('K') | « runtime/vm/object.h ('k') | no next file » | 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) 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 7100 matching lines...) Expand 10 before | Expand all | Expand 10 after
7111 } 7111 }
7112 for (intptr_t i = 1; i < saved_length; i++) { 7112 for (intptr_t i = 1; i < saved_length; i++) {
7113 ICData& ic_data = ICData::ZoneHandle(zone); 7113 ICData& ic_data = ICData::ZoneHandle(zone);
7114 ic_data ^= saved_ic_data.At(i); 7114 ic_data ^= saved_ic_data.At(i);
7115 (*deopt_id_to_ic_data)[ic_data.deopt_id()] = &ic_data; 7115 (*deopt_id_to_ic_data)[ic_data.deopt_id()] = &ic_data;
7116 } 7116 }
7117 } 7117 }
7118 } 7118 }
7119 7119
7120 7120
7121 void Function::CopyICDataMap(
7122 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const {
7123 ASSERT(deopt_id_to_ic_data->is_empty());
7124 Zone* zone = Thread::Current()->zone();
7125 const Array& saved_ic_data = Array::Handle(zone, ic_data_array());
7126 if (saved_ic_data.IsNull()) {
7127 return;
7128 }
7129 const intptr_t saved_length = saved_ic_data.Length();
7130 ASSERT(saved_length > 0);
7131 if (saved_length > 1) {
7132 const intptr_t restored_length = ICData::Cast(Object::Handle(
7133 zone, saved_ic_data.At(saved_length - 1))).deopt_id() + 1;
7134 deopt_id_to_ic_data->SetLength(restored_length);
7135 for (intptr_t i = 0; i < restored_length; i++) {
7136 (*deopt_id_to_ic_data)[i] = NULL;
7137 }
7138 for (intptr_t i = 1; i < saved_length; i++) {
7139 ICData& ic_data = ICData::ZoneHandle(zone);
7140 ic_data ^= saved_ic_data.At(i);
7141 ic_data = ICData::CloneDescriptor(ic_data);
7142 (*deopt_id_to_ic_data)[ic_data.deopt_id()] = &ic_data;
7143 }
7144 }
7145 }
siva 2015/10/27 23:36:45 This function seems identical to RestoreICDataMap
srdjan 2015/10/28 16:54:43 Yes, passing argument clone_descriptor. Also added
7146
7147
7121 void Function::set_ic_data_array(const Array& value) const { 7148 void Function::set_ic_data_array(const Array& value) const {
7122 StorePointer(&raw_ptr()->ic_data_array_, value.raw()); 7149 StorePointer(&raw_ptr()->ic_data_array_, value.raw());
7123 } 7150 }
7124 7151
7125 7152
7126 RawArray* Function::ic_data_array() const { 7153 RawArray* Function::ic_data_array() const {
7127 return raw_ptr()->ic_data_array_; 7154 return raw_ptr()->ic_data_array_;
7128 } 7155 }
7129 7156
7130 7157
(...skipping 5587 matching lines...) Expand 10 before | Expand all | Expand 10 after
12718 String::Handle(from.target_name()), 12745 String::Handle(from.target_name()),
12719 Array::Handle(from.arguments_descriptor()), 12746 Array::Handle(from.arguments_descriptor()),
12720 from.deopt_id(), 12747 from.deopt_id(),
12721 num_args_tested)); 12748 num_args_tested));
12722 // Copy deoptimization reasons. 12749 // Copy deoptimization reasons.
12723 result.SetDeoptReasons(from.DeoptReasons()); 12750 result.SetDeoptReasons(from.DeoptReasons());
12724 return result.raw(); 12751 return result.raw();
12725 } 12752 }
12726 12753
12727 12754
12755 RawICData* ICData::CloneDescriptor(const ICData& from) {
12756 Zone* zone = Thread::Current()->zone();
12757 const ICData& result = ICData::Handle(ICData::NewDescriptor(
12758 zone,
12759 Function::Handle(zone, from.owner()),
12760 String::Handle(zone, from.target_name()),
12761 Array::Handle(zone, from.arguments_descriptor()),
12762 from.deopt_id(),
12763 from.NumArgsTested()));
12764 // Preserve entry array.
12765 result.set_ic_data_array(Array::Handle(zone, from.ic_data()));
12766 // Copy deoptimization reasons.
12767 result.SetDeoptReasons(from.DeoptReasons());
12768 return result.raw();
12769 }
12770
12771
12728 void ICData::PrintJSONImpl(JSONStream* stream, bool ref) const { 12772 void ICData::PrintJSONImpl(JSONStream* stream, bool ref) const {
12729 JSONObject jsobj(stream); 12773 JSONObject jsobj(stream);
12730 AddCommonObjectProperties(&jsobj, "Object", ref); 12774 AddCommonObjectProperties(&jsobj, "Object", ref);
12731 jsobj.AddServiceId(*this); 12775 jsobj.AddServiceId(*this);
12732 jsobj.AddProperty("_owner", Object::Handle(owner())); 12776 jsobj.AddProperty("_owner", Object::Handle(owner()));
12733 jsobj.AddProperty("_selector", String::Handle(target_name()).ToCString()); 12777 jsobj.AddProperty("_selector", String::Handle(target_name()).ToCString());
12734 if (ref) { 12778 if (ref) {
12735 return; 12779 return;
12736 } 12780 }
12737 jsobj.AddProperty("_argumentsDescriptor", 12781 jsobj.AddProperty("_argumentsDescriptor",
(...skipping 9089 matching lines...) Expand 10 before | Expand all | Expand 10 after
21827 return tag_label.ToCString(); 21871 return tag_label.ToCString();
21828 } 21872 }
21829 21873
21830 21874
21831 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 21875 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
21832 Instance::PrintJSONImpl(stream, ref); 21876 Instance::PrintJSONImpl(stream, ref);
21833 } 21877 }
21834 21878
21835 21879
21836 } // namespace dart 21880 } // namespace dart
OLDNEW
« runtime/vm/object.h ('K') | « runtime/vm/object.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698