Chromium Code Reviews| Index: runtime/vm/snapshot.cc |
| diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc |
| index 9b192d452265d2038c0e10bcdb4a102acec1268e..6c7a7201ce796232dccdcc553d8c9b6035dbc350 100644 |
| --- a/runtime/vm/snapshot.cc |
| +++ b/runtime/vm/snapshot.cc |
| @@ -242,6 +242,7 @@ RawObject* SnapshotReader::ReadObject() { |
| } |
| if (backward_references_->length() > 0) { |
| ProcessDeferredCanonicalizations(); |
| + FixSubclassesAndImplementors(); |
|
siva
2017/06/12 22:59:42
should only be done when kind == kScript?
This pa
rmacnak
2017/06/12 23:37:42
Yes, added check for kScript
|
| return (*backward_references_)[0].reference()->raw(); |
| } else { |
| return obj.raw(); |
| @@ -1237,6 +1238,37 @@ void SnapshotReader::ProcessDeferredCanonicalizations() { |
| } |
| +void SnapshotReader::FixSubclassesAndImplementors() { |
| + Class& cls = Class::Handle(zone()); |
| + Class& supercls = Class::Handle(zone()); |
| + Array& interfaces = Array::Handle(zone()); |
| + AbstractType& interface = AbstractType::Handle(zone()); |
| + Class& interface_cls = Class::Handle(zone()); |
| + for (intptr_t i = 0; i < backward_references_->length(); i++) { |
| + BackRefNode& backref = (*backward_references_)[i]; |
| + Object* objref = backref.reference(); |
| + if (objref->IsClass()) { |
| + cls ^= objref->raw(); |
| + if (!cls.IsInFullSnapshot()) { |
| + supercls = cls.SuperClass(); |
| + if (!supercls.IsNull() && !supercls.IsObjectClass() && |
| + supercls.IsInFullSnapshot()) { |
| + supercls.AddDirectSubclass(cls); |
| + supercls.DisableCHAOptimizedCode(cls); |
| + } |
| + interfaces = cls.interfaces(); |
| + for (intptr_t i = 0; i < interfaces.Length(); i++) { |
| + interface ^= interfaces.At(i); |
| + interface_cls = interface.type_class(); |
| + interface_cls.set_is_implemented(); |
| + interface_cls.DisableCHAOptimizedCode(cls); |
| + } |
| + } |
| + } |
| + } |
| +} |
| + |
| + |
| void SnapshotReader::ArrayReadFrom(intptr_t object_id, |
| const Array& result, |
| intptr_t len, |