Chromium Code Reviews| 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; |