| 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 6902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6913 result = 31 * result + val; | 6913 result = 31 * result + val; |
| 6914 tokens_iterator.Advance(); | 6914 tokens_iterator.Advance(); |
| 6915 } | 6915 } |
| 6916 result = result & ((static_cast<uint32_t>(1) << 31) - 1); | 6916 result = result & ((static_cast<uint32_t>(1) << 31) - 1); |
| 6917 ASSERT(result <= static_cast<uint32_t>(kMaxInt32)); | 6917 ASSERT(result <= static_cast<uint32_t>(kMaxInt32)); |
| 6918 return result; | 6918 return result; |
| 6919 } | 6919 } |
| 6920 | 6920 |
| 6921 | 6921 |
| 6922 void Function::SaveICDataMap( | 6922 void Function::SaveICDataMap( |
| 6923 const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data) const { | 6923 const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data, |
| 6924 // Compute number of ICData objectsto save. | 6924 const Array& edge_counters_array) const { |
| 6925 intptr_t count = 0; | 6925 // Compute number of ICData objects to save. |
| 6926 // Store edge counter array in the first slot. |
| 6927 intptr_t count = 1; |
| 6926 for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { | 6928 for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { |
| 6927 if (deopt_id_to_ic_data[i] != NULL) { | 6929 if (deopt_id_to_ic_data[i] != NULL) { |
| 6928 count++; | 6930 count++; |
| 6929 } | 6931 } |
| 6930 } | 6932 } |
| 6931 if (count == 0) { | 6933 const Array& array = Array::Handle(Array::New(count, Heap::kOld)); |
| 6932 set_ic_data_array(Object::empty_array()); | 6934 INC_STAT(Thread::Current(), total_code_size, count * sizeof(uword)); |
| 6933 } else { | 6935 count = 1; |
| 6934 const Array& a = Array::Handle(Array::New(count, Heap::kOld)); | 6936 for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { |
| 6935 INC_STAT(Thread::Current(), total_code_size, count * sizeof(uword)); | 6937 if (deopt_id_to_ic_data[i] != NULL) { |
| 6936 count = 0; | 6938 array.SetAt(count++, *deopt_id_to_ic_data[i]); |
| 6937 for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { | |
| 6938 if (deopt_id_to_ic_data[i] != NULL) { | |
| 6939 a.SetAt(count++, *deopt_id_to_ic_data[i]); | |
| 6940 } | |
| 6941 } | 6939 } |
| 6942 set_ic_data_array(a); | |
| 6943 } | 6940 } |
| 6941 array.SetAt(0, edge_counters_array); |
| 6942 set_ic_data_array(array); |
| 6944 } | 6943 } |
| 6945 | 6944 |
| 6946 | 6945 |
| 6947 void Function::RestoreICDataMap( | 6946 void Function::RestoreICDataMap( |
| 6948 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const { | 6947 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const { |
| 6948 ASSERT(deopt_id_to_ic_data->is_empty()); |
| 6949 Zone* zone = Thread::Current()->zone(); | 6949 Zone* zone = Thread::Current()->zone(); |
| 6950 const Array& saved_icd = Array::Handle(zone, ic_data_array()); | 6950 const Array& saved_ic_data = Array::Handle(zone, ic_data_array()); |
| 6951 if (saved_icd.IsNull() || (saved_icd.Length() == 0)) { | 6951 if (saved_ic_data.IsNull()) { |
| 6952 deopt_id_to_ic_data->Clear(); | |
| 6953 return; | 6952 return; |
| 6954 } | 6953 } |
| 6955 ICData& icd = ICData::Handle(); | 6954 const intptr_t saved_length = saved_ic_data.Length(); |
| 6956 icd ^= saved_icd.At(saved_icd.Length() - 1); | 6955 ASSERT(saved_length > 0); |
| 6957 const intptr_t len = icd.deopt_id() + 1; | 6956 if (saved_length > 1) { |
| 6958 deopt_id_to_ic_data->SetLength(len); | 6957 const intptr_t restored_length = ICData::Cast(Object::Handle( |
| 6959 for (intptr_t i = 0; i < len; i++) { | 6958 zone, saved_ic_data.At(saved_length - 1))).deopt_id() + 1; |
| 6960 (*deopt_id_to_ic_data)[i] = NULL; | 6959 deopt_id_to_ic_data->SetLength(restored_length); |
| 6961 } | 6960 for (intptr_t i = 0; i < restored_length; i++) { |
| 6962 for (intptr_t i = 0; i < saved_icd.Length(); i++) { | 6961 (*deopt_id_to_ic_data)[i] = NULL; |
| 6963 ICData& icd = ICData::ZoneHandle(zone); | 6962 } |
| 6964 icd ^= saved_icd.At(i); | 6963 for (intptr_t i = 1; i < saved_length; i++) { |
| 6965 (*deopt_id_to_ic_data)[icd.deopt_id()] = &icd; | 6964 ICData& ic_data = ICData::ZoneHandle(zone); |
| 6965 ic_data ^= saved_ic_data.At(i); |
| 6966 (*deopt_id_to_ic_data)[ic_data.deopt_id()] = &ic_data; |
| 6967 } |
| 6966 } | 6968 } |
| 6967 } | 6969 } |
| 6968 | 6970 |
| 6969 | 6971 |
| 6970 void Function::set_ic_data_array(const Array& value) const { | 6972 void Function::set_ic_data_array(const Array& value) const { |
| 6971 StorePointer(&raw_ptr()->ic_data_array_, value.raw()); | 6973 StorePointer(&raw_ptr()->ic_data_array_, value.raw()); |
| 6972 } | 6974 } |
| 6973 | 6975 |
| 6974 | 6976 |
| 6975 RawArray* Function::ic_data_array() const { | 6977 RawArray* Function::ic_data_array() const { |
| 6976 return raw_ptr()->ic_data_array_; | 6978 return raw_ptr()->ic_data_array_; |
| 6977 } | 6979 } |
| 6978 | 6980 |
| 6979 | 6981 |
| 6980 void Function::ClearICDataArray() const { | 6982 void Function::ClearICDataArray() const { |
| 6981 set_ic_data_array(Array::null_array()); | 6983 set_ic_data_array(Array::null_array()); |
| 6982 } | 6984 } |
| 6983 | 6985 |
| 6984 | 6986 |
| 6985 void Function::SetDeoptReasonForAll(intptr_t deopt_id, | 6987 void Function::SetDeoptReasonForAll(intptr_t deopt_id, |
| 6986 ICData::DeoptReasonId reason) { | 6988 ICData::DeoptReasonId reason) { |
| 6987 const Array& icd_array = Array::Handle(ic_data_array()); | 6989 const Array& array = Array::Handle(ic_data_array()); |
| 6988 ICData& icd = ICData::Handle(); | 6990 ICData& ic_data = ICData::Handle(); |
| 6989 for (intptr_t i = 0; i < icd_array.Length(); i++) { | 6991 for (intptr_t i = 1; i < array.Length(); i++) { |
| 6990 icd ^= icd_array.At(i); | 6992 ic_data ^= array.At(i); |
| 6991 if (icd.deopt_id() == deopt_id) { | 6993 if (ic_data.deopt_id() == deopt_id) { |
| 6992 icd.AddDeoptReason(reason); | 6994 ic_data.AddDeoptReason(reason); |
| 6993 } | 6995 } |
| 6994 } | 6996 } |
| 6995 } | 6997 } |
| 6996 | 6998 |
| 6997 | 6999 |
| 6998 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const { | 7000 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const { |
| 6999 if (SourceFingerprint() != fp) { | 7001 if (SourceFingerprint() != fp) { |
| 7000 const bool recalculatingFingerprints = false; | 7002 const bool recalculatingFingerprints = false; |
| 7001 if (recalculatingFingerprints) { | 7003 if (recalculatingFingerprints) { |
| 7002 // This output can be copied into a file, then used with sed | 7004 // This output can be copied into a file, then used with sed |
| (...skipping 14459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21462 return tag_label.ToCString(); | 21464 return tag_label.ToCString(); |
| 21463 } | 21465 } |
| 21464 | 21466 |
| 21465 | 21467 |
| 21466 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21468 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21467 Instance::PrintJSONImpl(stream, ref); | 21469 Instance::PrintJSONImpl(stream, ref); |
| 21468 } | 21470 } |
| 21469 | 21471 |
| 21470 | 21472 |
| 21471 } // namespace dart | 21473 } // namespace dart |
| OLD | NEW |