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 12311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12322 if ((receiver_class_id == kSmiCid) && (data_pos > 0)) { | 12322 if ((receiver_class_id == kSmiCid) && (data_pos > 0)) { |
| 12323 ASSERT(GetReceiverClassIdAt(0) != kSmiCid); | 12323 ASSERT(GetReceiverClassIdAt(0) != kSmiCid); |
| 12324 // Move class occupying position 0 to the data_pos. | 12324 // Move class occupying position 0 to the data_pos. |
| 12325 for (intptr_t i = 0; i < TestEntryLength(); i++) { | 12325 for (intptr_t i = 0; i < TestEntryLength(); i++) { |
| 12326 data.SetAt(data_pos + i, Object::Handle(data.At(i))); | 12326 data.SetAt(data_pos + i, Object::Handle(data.At(i))); |
| 12327 } | 12327 } |
| 12328 // Insert kSmiCid in position 0. | 12328 // Insert kSmiCid in position 0. |
| 12329 data_pos = 0; | 12329 data_pos = 0; |
| 12330 } | 12330 } |
| 12331 data.SetAt(data_pos, Smi::Handle(Smi::New(receiver_class_id))); | 12331 data.SetAt(data_pos, Smi::Handle(Smi::New(receiver_class_id))); |
| 12332 data.SetAt(data_pos + 1, target); | 12332 if (Isolate::Current()->compilation_allowed()) { |
| 12333 data.SetAt(data_pos + 2, Smi::Handle(Smi::New(count))); | 12333 data.SetAt(data_pos + 1, target); |
| 12334 data.SetAt(data_pos + 2, Smi::Handle(Smi::New(count))); | |
| 12335 } else { | |
|
srdjan
2016/03/15 19:15:48
Add a comment, that this is for precompilation onl
rmacnak
2016/03/16 18:21:31
Done.
| |
| 12336 const Code& code = Code::Handle(target.CurrentCode()); | |
| 12337 const Smi& entry_point = | |
| 12338 Smi::Handle(reinterpret_cast<RawSmi*>(code.EntryPoint())); | |
|
srdjan
2016/03/15 19:15:48
Add check that this is a valid Smi value.
rmacnak
2016/03/16 18:21:31
Added Smi::FromAlignedAddress.
| |
| 12339 data.SetAt(data_pos + 1, code); | |
| 12340 data.SetAt(data_pos + 2, entry_point); | |
| 12341 } | |
| 12334 // Multithreaded access to ICData requires setting of array to be the last | 12342 // Multithreaded access to ICData requires setting of array to be the last |
| 12335 // operation. | 12343 // operation. |
| 12336 set_ic_data_array(data); | 12344 set_ic_data_array(data); |
| 12337 } | 12345 } |
| 12338 | 12346 |
| 12339 | 12347 |
| 12340 void ICData::GetCheckAt(intptr_t index, | 12348 void ICData::GetCheckAt(intptr_t index, |
| 12341 GrowableArray<intptr_t>* class_ids, | 12349 GrowableArray<intptr_t>* class_ids, |
| 12342 Function* target) const { | 12350 Function* target) const { |
| 12343 ASSERT(index < NumberOfChecks()); | 12351 ASSERT(index < NumberOfChecks()); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12397 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { | 12405 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { |
| 12398 ASSERT(index < NumberOfChecks()); | 12406 ASSERT(index < NumberOfChecks()); |
| 12399 const intptr_t data_pos = index * TestEntryLength(); | 12407 const intptr_t data_pos = index * TestEntryLength(); |
| 12400 NoSafepointScope no_safepoint; | 12408 NoSafepointScope no_safepoint; |
| 12401 RawArray* raw_data = ic_data(); | 12409 RawArray* raw_data = ic_data(); |
| 12402 return Smi::Value(Smi::RawCast(raw_data->ptr()->data()[data_pos])); | 12410 return Smi::Value(Smi::RawCast(raw_data->ptr()->data()[data_pos])); |
| 12403 } | 12411 } |
| 12404 | 12412 |
| 12405 | 12413 |
| 12406 RawFunction* ICData::GetTargetAt(intptr_t index) const { | 12414 RawFunction* ICData::GetTargetAt(intptr_t index) const { |
| 12415 ASSERT(Isolate::Current()->compilation_allowed()); | |
| 12407 const intptr_t data_pos = index * TestEntryLength() + NumArgsTested(); | 12416 const intptr_t data_pos = index * TestEntryLength() + NumArgsTested(); |
| 12408 ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction()); | 12417 ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction()); |
| 12409 | 12418 |
| 12410 NoSafepointScope no_safepoint; | 12419 NoSafepointScope no_safepoint; |
| 12411 RawArray* raw_data = ic_data(); | 12420 RawArray* raw_data = ic_data(); |
| 12412 return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]); | 12421 return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]); |
| 12413 } | 12422 } |
| 12414 | 12423 |
| 12415 | 12424 |
| 12425 RawObject* ICData::GetTargetOrCodeAt(intptr_t index) const { | |
| 12426 const intptr_t data_pos = index * TestEntryLength() + NumArgsTested(); | |
| 12427 | |
| 12428 NoSafepointScope no_safepoint; | |
| 12429 RawArray* raw_data = ic_data(); | |
| 12430 return reinterpret_cast<RawObject*>(raw_data->ptr()->data()[data_pos]); | |
|
srdjan
2016/03/15 19:15:48
Do you need the cast? Isn't raw_data->ptr()->data(
rmacnak
2016/03/16 18:21:31
No, removed.
| |
| 12431 } | |
| 12432 | |
| 12433 | |
| 12416 void ICData::IncrementCountAt(intptr_t index, intptr_t value) const { | 12434 void ICData::IncrementCountAt(intptr_t index, intptr_t value) const { |
| 12417 ASSERT(0 <= value); | 12435 ASSERT(0 <= value); |
| 12418 ASSERT(value <= Smi::kMaxValue); | 12436 ASSERT(value <= Smi::kMaxValue); |
| 12419 SetCountAt(index, Utils::Minimum(GetCountAt(index) + value, Smi::kMaxValue)); | 12437 SetCountAt(index, Utils::Minimum(GetCountAt(index) + value, Smi::kMaxValue)); |
| 12420 } | 12438 } |
| 12421 | 12439 |
| 12422 | 12440 |
| 12423 void ICData::SetCountAt(intptr_t index, intptr_t value) const { | 12441 void ICData::SetCountAt(intptr_t index, intptr_t value) const { |
| 12424 ASSERT(0 <= value); | 12442 ASSERT(0 <= value); |
| 12425 ASSERT(value <= Smi::kMaxValue); | 12443 ASSERT(value <= Smi::kMaxValue); |
| 12426 | 12444 |
| 12427 const Array& data = Array::Handle(ic_data()); | 12445 const Array& data = Array::Handle(ic_data()); |
| 12428 const intptr_t data_pos = index * TestEntryLength() + | 12446 const intptr_t data_pos = index * TestEntryLength() + |
| 12429 CountIndexFor(NumArgsTested()); | 12447 CountIndexFor(NumArgsTested()); |
| 12430 data.SetAt(data_pos, Smi::Handle(Smi::New(value))); | 12448 data.SetAt(data_pos, Smi::Handle(Smi::New(value))); |
| 12431 } | 12449 } |
| 12432 | 12450 |
| 12433 | 12451 |
| 12452 void ICData::SetCodeAt(intptr_t index, const Code& value) const { | |
| 12453 ASSERT(!Isolate::Current()->compilation_allowed()); | |
| 12454 const Array& data = Array::Handle(ic_data()); | |
| 12455 const intptr_t data_pos = index * TestEntryLength() + | |
| 12456 CodeIndexFor(NumArgsTested()); | |
| 12457 data.SetAt(data_pos, value); | |
| 12458 } | |
| 12459 | |
| 12460 | |
| 12461 void ICData::SetEntryPointAt(intptr_t index, const Smi& value) const { | |
| 12462 ASSERT(!Isolate::Current()->compilation_allowed()); | |
| 12463 const Array& data = Array::Handle(ic_data()); | |
| 12464 const intptr_t data_pos = index * TestEntryLength() + | |
| 12465 EntryPointIndexFor(NumArgsTested()); | |
| 12466 data.SetAt(data_pos, value); | |
|
srdjan
2016/03/15 19:15:48
Maybe put this two functions after all count funct
rmacnak
2016/03/16 18:21:31
Done.
| |
| 12467 } | |
| 12468 | |
| 12469 | |
| 12434 intptr_t ICData::GetCountAt(intptr_t index) const { | 12470 intptr_t ICData::GetCountAt(intptr_t index) const { |
| 12471 ASSERT(Isolate::Current()->compilation_allowed()); | |
| 12435 const Array& data = Array::Handle(ic_data()); | 12472 const Array& data = Array::Handle(ic_data()); |
| 12436 const intptr_t data_pos = index * TestEntryLength() + | 12473 const intptr_t data_pos = index * TestEntryLength() + |
| 12437 CountIndexFor(NumArgsTested()); | 12474 CountIndexFor(NumArgsTested()); |
| 12438 return Smi::Value(Smi::RawCast(data.At(data_pos))); | 12475 return Smi::Value(Smi::RawCast(data.At(data_pos))); |
| 12439 } | 12476 } |
| 12440 | 12477 |
| 12441 | 12478 |
| 12442 intptr_t ICData::AggregateCount() const { | 12479 intptr_t ICData::AggregateCount() const { |
| 12443 if (IsNull()) return 0; | 12480 if (IsNull()) return 0; |
| 12444 const intptr_t len = NumberOfChecks(); | 12481 const intptr_t len = NumberOfChecks(); |
| (...skipping 9472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 21917 return UserTag::null(); | 21954 return UserTag::null(); |
| 21918 } | 21955 } |
| 21919 | 21956 |
| 21920 | 21957 |
| 21921 const char* UserTag::ToCString() const { | 21958 const char* UserTag::ToCString() const { |
| 21922 const String& tag_label = String::Handle(label()); | 21959 const String& tag_label = String::Handle(label()); |
| 21923 return tag_label.ToCString(); | 21960 return tag_label.ToCString(); |
| 21924 } | 21961 } |
| 21925 | 21962 |
| 21926 } // namespace dart | 21963 } // namespace dart |
| OLD | NEW |