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

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

Issue 1799793002: Precompilation: Have instances calls load the entry point and Code object from the ic data array in… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/precompiler.h » ('j') | 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 12311 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 {
12336 // Precompilation only, after all functions have been compiled.
12337 ASSERT(target.HasCode());
12338 const Code& code = Code::Handle(target.CurrentCode());
12339 const Smi& entry_point =
12340 Smi::Handle(Smi::FromAlignedAddress(code.EntryPoint()));
12341 data.SetAt(data_pos + 1, code);
12342 data.SetAt(data_pos + 2, entry_point);
12343 }
12334 // Multithreaded access to ICData requires setting of array to be the last 12344 // Multithreaded access to ICData requires setting of array to be the last
12335 // operation. 12345 // operation.
12336 set_ic_data_array(data); 12346 set_ic_data_array(data);
12337 } 12347 }
12338 12348
12339 12349
12340 void ICData::GetCheckAt(intptr_t index, 12350 void ICData::GetCheckAt(intptr_t index,
12341 GrowableArray<intptr_t>* class_ids, 12351 GrowableArray<intptr_t>* class_ids,
12342 Function* target) const { 12352 Function* target) const {
12343 ASSERT(index < NumberOfChecks()); 12353 ASSERT(index < NumberOfChecks());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
12397 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { 12407 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const {
12398 ASSERT(index < NumberOfChecks()); 12408 ASSERT(index < NumberOfChecks());
12399 const intptr_t data_pos = index * TestEntryLength(); 12409 const intptr_t data_pos = index * TestEntryLength();
12400 NoSafepointScope no_safepoint; 12410 NoSafepointScope no_safepoint;
12401 RawArray* raw_data = ic_data(); 12411 RawArray* raw_data = ic_data();
12402 return Smi::Value(Smi::RawCast(raw_data->ptr()->data()[data_pos])); 12412 return Smi::Value(Smi::RawCast(raw_data->ptr()->data()[data_pos]));
12403 } 12413 }
12404 12414
12405 12415
12406 RawFunction* ICData::GetTargetAt(intptr_t index) const { 12416 RawFunction* ICData::GetTargetAt(intptr_t index) const {
12417 ASSERT(Isolate::Current()->compilation_allowed());
12407 const intptr_t data_pos = index * TestEntryLength() + NumArgsTested(); 12418 const intptr_t data_pos = index * TestEntryLength() + NumArgsTested();
12408 ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction()); 12419 ASSERT(Object::Handle(Array::Handle(ic_data()).At(data_pos)).IsFunction());
12409 12420
12410 NoSafepointScope no_safepoint; 12421 NoSafepointScope no_safepoint;
12411 RawArray* raw_data = ic_data(); 12422 RawArray* raw_data = ic_data();
12412 return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]); 12423 return reinterpret_cast<RawFunction*>(raw_data->ptr()->data()[data_pos]);
12413 } 12424 }
12414 12425
12415 12426
12427 RawObject* ICData::GetTargetOrCodeAt(intptr_t index) const {
12428 const intptr_t data_pos = index * TestEntryLength() + NumArgsTested();
12429
12430 NoSafepointScope no_safepoint;
12431 RawArray* raw_data = ic_data();
12432 return raw_data->ptr()->data()[data_pos];
12433 }
12434
12435
12416 void ICData::IncrementCountAt(intptr_t index, intptr_t value) const { 12436 void ICData::IncrementCountAt(intptr_t index, intptr_t value) const {
12417 ASSERT(0 <= value); 12437 ASSERT(0 <= value);
12418 ASSERT(value <= Smi::kMaxValue); 12438 ASSERT(value <= Smi::kMaxValue);
12419 SetCountAt(index, Utils::Minimum(GetCountAt(index) + value, Smi::kMaxValue)); 12439 SetCountAt(index, Utils::Minimum(GetCountAt(index) + value, Smi::kMaxValue));
12420 } 12440 }
12421 12441
12422 12442
12423 void ICData::SetCountAt(intptr_t index, intptr_t value) const { 12443 void ICData::SetCountAt(intptr_t index, intptr_t value) const {
12424 ASSERT(0 <= value); 12444 ASSERT(0 <= value);
12425 ASSERT(value <= Smi::kMaxValue); 12445 ASSERT(value <= Smi::kMaxValue);
12426 12446
12427 const Array& data = Array::Handle(ic_data()); 12447 const Array& data = Array::Handle(ic_data());
12428 const intptr_t data_pos = index * TestEntryLength() + 12448 const intptr_t data_pos = index * TestEntryLength() +
12429 CountIndexFor(NumArgsTested()); 12449 CountIndexFor(NumArgsTested());
12430 data.SetAt(data_pos, Smi::Handle(Smi::New(value))); 12450 data.SetAt(data_pos, Smi::Handle(Smi::New(value)));
12431 } 12451 }
12432 12452
12433 12453
12434 intptr_t ICData::GetCountAt(intptr_t index) const { 12454 intptr_t ICData::GetCountAt(intptr_t index) const {
12455 ASSERT(Isolate::Current()->compilation_allowed());
12435 const Array& data = Array::Handle(ic_data()); 12456 const Array& data = Array::Handle(ic_data());
12436 const intptr_t data_pos = index * TestEntryLength() + 12457 const intptr_t data_pos = index * TestEntryLength() +
12437 CountIndexFor(NumArgsTested()); 12458 CountIndexFor(NumArgsTested());
12438 return Smi::Value(Smi::RawCast(data.At(data_pos))); 12459 return Smi::Value(Smi::RawCast(data.At(data_pos)));
12439 } 12460 }
12440 12461
12441 12462
12442 intptr_t ICData::AggregateCount() const { 12463 intptr_t ICData::AggregateCount() const {
12443 if (IsNull()) return 0; 12464 if (IsNull()) return 0;
12444 const intptr_t len = NumberOfChecks(); 12465 const intptr_t len = NumberOfChecks();
12445 intptr_t count = 0; 12466 intptr_t count = 0;
12446 for (intptr_t i = 0; i < len; i++) { 12467 for (intptr_t i = 0; i < len; i++) {
12447 count += GetCountAt(i); 12468 count += GetCountAt(i);
12448 } 12469 }
12449 return count; 12470 return count;
12450 } 12471 }
12451 12472
12452 12473
12474 void ICData::SetCodeAt(intptr_t index, const Code& value) const {
12475 ASSERT(!Isolate::Current()->compilation_allowed());
12476 const Array& data = Array::Handle(ic_data());
12477 const intptr_t data_pos = index * TestEntryLength() +
12478 CodeIndexFor(NumArgsTested());
12479 data.SetAt(data_pos, value);
12480 }
12481
12482
12483 void ICData::SetEntryPointAt(intptr_t index, const Smi& value) const {
12484 ASSERT(!Isolate::Current()->compilation_allowed());
12485 const Array& data = Array::Handle(ic_data());
12486 const intptr_t data_pos = index * TestEntryLength() +
12487 EntryPointIndexFor(NumArgsTested());
12488 data.SetAt(data_pos, value);
12489 }
12490
12491
12453 RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const { 12492 RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const {
12454 const intptr_t len = NumberOfChecks(); 12493 const intptr_t len = NumberOfChecks();
12455 for (intptr_t i = 0; i < len; i++) { 12494 for (intptr_t i = 0; i < len; i++) {
12456 if (GetReceiverClassIdAt(i) == class_id) { 12495 if (GetReceiverClassIdAt(i) == class_id) {
12457 return GetTargetAt(i); 12496 return GetTargetAt(i);
12458 } 12497 }
12459 } 12498 }
12460 return Function::null(); 12499 return Function::null();
12461 } 12500 }
12462 12501
(...skipping 9454 matching lines...) Expand 10 before | Expand all | Expand 10 after
21917 return UserTag::null(); 21956 return UserTag::null();
21918 } 21957 }
21919 21958
21920 21959
21921 const char* UserTag::ToCString() const { 21960 const char* UserTag::ToCString() const {
21922 const String& tag_label = String::Handle(label()); 21961 const String& tag_label = String::Handle(label());
21923 return tag_label.ToCString(); 21962 return tag_label.ToCString();
21924 } 21963 }
21925 21964
21926 } // namespace dart 21965 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/precompiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698