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

Unified Diff: runtime/vm/object.cc

Issue 1544583002: For background compilation we copy ICData so that it is immutable during comnpilation. However, we … (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: l Created 5 years 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
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index f44c36539865db16ec85e89c1c206adcb1f01e76..b78a398115a1b0ac93f8a37faa79d549120cb809 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7033,7 +7033,9 @@ void Function::RestoreICDataMap(
ICData& ic_data = ICData::ZoneHandle(zone);
ic_data ^= saved_ic_data.At(i);
if (clone_descriptors) {
+ ICData& original_ic_data = ICData::Handle(zone, ic_data.raw());
ic_data = ICData::CloneDescriptor(ic_data);
+ ic_data.SetOriginal(original_ic_data);
}
(*deopt_id_to_ic_data)[ic_data.deopt_id()] = &ic_data;
}
@@ -12176,9 +12178,39 @@ const char* ICData::ToCString() const {
}
+RawFunction* ICData::Owner() const {
+ Object& obj = Object::Handle(raw_ptr()->owner_);
+ if (obj.IsFunction()) {
+ return Function::Cast(obj).raw();
+ } else {
+ ICData& original = ICData::Handle();
+ original ^= obj.raw();
+ return original.Owner();
+ }
+}
+
+
+RawICData* ICData::Original() const {
+ Object& obj = Object::Handle(raw_ptr()->owner_);
+ if (obj.IsNull()) {
+ return ICData::null();
+ } else if (obj.IsFunction()) {
+ return this->raw();
+ } else {
+ return ICData::RawCast(obj.raw());
+ }
+}
+
+
+void ICData::SetOriginal(const ICData& value) const {
zra 2015/12/21 19:31:47 It looks like there is an assumption that the orig
srdjan 2015/12/21 20:22:49 Done.
+ ASSERT(!value.IsNull());
+ StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(value.raw()));
+}
+
+
void ICData::set_owner(const Function& value) const {
ASSERT(!value.IsNull());
- StorePointer(&raw_ptr()->owner_, value.raw());
+ StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(value.raw()));
}
@@ -12817,7 +12849,7 @@ RawICData* ICData::New(const Function& owner,
RawICData* ICData::NewFrom(const ICData& from, intptr_t num_args_tested) {
const ICData& result = ICData::Handle(ICData::New(
- Function::Handle(from.owner()),
+ Function::Handle(from.Owner()),
String::Handle(from.target_name()),
Array::Handle(from.arguments_descriptor()),
from.deopt_id(),
@@ -12832,7 +12864,7 @@ RawICData* ICData::CloneDescriptor(const ICData& from) {
Zone* zone = Thread::Current()->zone();
const ICData& result = ICData::Handle(ICData::NewDescriptor(
zone,
- Function::Handle(zone, from.owner()),
+ Function::Handle(zone, from.Owner()),
String::Handle(zone, from.target_name()),
Array::Handle(zone, from.arguments_descriptor()),
from.deopt_id(),
@@ -12849,7 +12881,7 @@ void ICData::PrintJSONImpl(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
AddCommonObjectProperties(&jsobj, "Object", ref);
jsobj.AddServiceId(*this);
- jsobj.AddProperty("_owner", Object::Handle(owner()));
+ jsobj.AddProperty("_owner", Object::Handle(Owner()));
jsobj.AddProperty("_selector", String::Handle(target_name()).ToCString());
if (ref) {
return;

Powered by Google App Engine
This is Rietveld 408576698