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

Unified Diff: runtime/vm/snapshot.cc

Issue 2933223002: Update subclasses array and is_implemented bit when loading script snapshots. (Closed)
Patch Set: Created 3 years, 6 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
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,
« no previous file with comments | « runtime/vm/snapshot.h ('k') | runtime/vm/snapshot_test.cc » ('j') | runtime/vm/snapshot_test.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698