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

Unified Diff: runtime/vm/object.cc

Issue 1410573006: Cache initial (empty) ic_data arrays so that they are not repeatedly allocated. Factor out descript… (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: address comment Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 60ad0731417277cc1b9c8a64c56948cf41ac817b..630ffd1ceaede7a6661d47fe4af990282895c967 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -83,6 +83,9 @@ static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix);
static const char* kSetterPrefix = "set:";
static const intptr_t kSetterPrefixLength = strlen(kSetterPrefix);
+// A cache of VM heap allocated preinitialized empty ic data entry arrays.
+RawArray* ICData::cached_icdata_arrays_[kCachedICDataArrayCount];
+
cpp_vtable Object::handle_vtable_ = 0;
cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = { 0 };
cpp_vtable Smi::handle_vtable_ = 0;
@@ -12616,33 +12619,46 @@ bool ICData::IsUsedAt(intptr_t i) const {
}
-RawICData* ICData::New() {
- ICData& result = ICData::Handle();
- {
- // IC data objects are long living objects, allocate them in old generation.
- RawObject* raw = Object::Allocate(ICData::kClassId,
- ICData::InstanceSize(),
- Heap::kOld);
- NoSafepointScope no_safepoint;
- result ^= raw;
+void ICData::InitOnce() {
+ for (int i = 0; i < kCachedICDataArrayCount; i++) {
+ cached_icdata_arrays_[i] = ICData::NewNonCachedEmptyICDataArray(i);
}
- result.set_deopt_id(Thread::kNoDeoptId);
- result.set_state_bits(0);
- return result.raw();
}
-RawICData* ICData::New(const Function& owner,
- const String& target_name,
- const Array& arguments_descriptor,
- intptr_t deopt_id,
- intptr_t num_args_tested) {
+RawArray* ICData::NewNonCachedEmptyICDataArray(intptr_t num_args_tested) {
+ // IC data array must be null terminated (sentinel entry).
+ const intptr_t len = TestEntryLengthFor(num_args_tested);
+ const Array& array = Array::Handle(Array::New(len, Heap::kOld));
+ WriteSentinel(array, len);
+ array.MakeImmutable();
+ return array.raw();
+}
+
+
+RawArray* ICData::NewEmptyICDataArray(intptr_t num_args_tested) {
+ ASSERT(num_args_tested >= 0);
+ if (num_args_tested < kCachedICDataArrayCount) {
+ return cached_icdata_arrays_[num_args_tested];
+ }
+ return NewNonCachedEmptyICDataArray(num_args_tested);
+}
+
+
+
+// Does not initialize ICData array.
+RawICData* ICData::NewDescriptor(Zone* zone,
+ const Function& owner,
+ const String& target_name,
+ const Array& arguments_descriptor,
+ intptr_t deopt_id,
+ intptr_t num_args_tested) {
ASSERT(!owner.IsNull());
ASSERT(!target_name.IsNull());
ASSERT(!arguments_descriptor.IsNull());
ASSERT(Object::icdata_class() != Class::null());
ASSERT(num_args_tested >= 0);
- ICData& result = ICData::Handle();
+ ICData& result = ICData::Handle(zone);
{
// IC data objects are long living objects, allocate them in old generation.
RawObject* raw = Object::Allocate(ICData::kClassId,
@@ -12657,12 +12673,41 @@ RawICData* ICData::New(const Function& owner,
result.set_deopt_id(deopt_id);
result.set_state_bits(0);
result.SetNumArgsTested(num_args_tested);
- // Number of array elements in one test entry.
- intptr_t len = result.TestEntryLength();
- // IC data array must be null terminated (sentinel entry).
- const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld));
- WriteSentinel(ic_data, result.TestEntryLength());
- result.set_ic_data_array(ic_data);
+ return result.raw();
+}
+
+
+RawICData* ICData::New() {
+ ICData& result = ICData::Handle();
+ {
+ // IC data objects are long living objects, allocate them in old generation.
+ RawObject* raw = Object::Allocate(ICData::kClassId,
+ ICData::InstanceSize(),
+ Heap::kOld);
+ NoSafepointScope no_safepoint;
+ result ^= raw;
+ }
+ result.set_deopt_id(Thread::kNoDeoptId);
+ result.set_state_bits(0);
+ return result.raw();
+}
+
+
+RawICData* ICData::New(const Function& owner,
+ const String& target_name,
+ const Array& arguments_descriptor,
+ intptr_t deopt_id,
+ intptr_t num_args_tested) {
+ Zone* zone = Thread::Current()->zone();
+ const ICData& result = ICData::Handle(zone,
+ NewDescriptor(zone,
+ owner,
+ target_name,
+ arguments_descriptor,
+ deopt_id,
+ num_args_tested));
+ result.set_ic_data_array(
+ Array::Handle(zone, NewEmptyICDataArray(num_args_tested)));
return result.raw();
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698