| Index: runtime/vm/snapshot.cc
|
| diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
|
| index 9b192d452265d2038c0e10bcdb4a102acec1268e..609262e3e5cad5927ea6e82d383542d1a5614635 100644
|
| --- a/runtime/vm/snapshot.cc
|
| +++ b/runtime/vm/snapshot.cc
|
| @@ -242,6 +242,9 @@ RawObject* SnapshotReader::ReadObject() {
|
| }
|
| if (backward_references_->length() > 0) {
|
| ProcessDeferredCanonicalizations();
|
| + if (kind() == Snapshot::kScript) {
|
| + FixSubclassesAndImplementors();
|
| + }
|
| return (*backward_references_)[0].reference()->raw();
|
| } else {
|
| return obj.raw();
|
| @@ -1237,6 +1240,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,
|
|
|