Index: runtime/vm/cha.h |
diff --git a/runtime/vm/cha.h b/runtime/vm/cha.h |
index a1ea229a2c3816122f2e49440e8e7fefb9fa9701..7aa777487e2564621654290a152fb819141f7233 100644 |
--- a/runtime/vm/cha.h |
+++ b/runtime/vm/cha.h |
@@ -21,7 +21,7 @@ class CHA : public StackResource { |
explicit CHA(Thread* thread) |
: StackResource(thread), |
thread_(thread), |
- leaf_classes_(thread->zone(), 1), |
+ guarded_classes_(thread->zone(), 1), |
previous_(thread->cha()) { |
thread->set_cha(this); |
} |
@@ -44,20 +44,42 @@ class CHA : public StackResource { |
static bool IsImplemented(const Class& cls); |
// Returns true if any subclass of 'cls' contains the function. |
- bool HasOverride(const Class& cls, const String& function_name); |
+ // If no override was found subclass_count would contain total count of |
+ // finalized subclasses that CHA looked at. |
+ // This count will be used to validate CHA decision before installing |
+ // optimized code compiled in background. |
+ bool HasOverride(const Class& cls, |
+ const String& function_name, |
+ intptr_t* subclass_count); |
- const GrowableArray<Class*>& leaf_classes() const { |
- return leaf_classes_; |
- } |
- |
- // Adds class 'cls' to the list of guarded leaf classes, deoptimization occurs |
- // if any of those leaf classes gets subclassed through later loaded/finalized |
+ // Adds class 'cls' to the list of guarded classes, deoptimization occurs |
+ // if any of those classes gets subclassed through later loaded/finalized |
// libraries. Only classes that were used for CHA optimizations are added. |
- void AddToLeafClasses(const Class& cls); |
+ void AddToGuardedClasses(const Class& cls, intptr_t subclass_count); |
+ |
+ // When compiling in background we need to check that no new finalized |
+ // subclasses were added to guarded classes. |
+ bool IsConsistentWithCurrentHierarchy() const; |
+ |
+ void RegisterDependencies(const Code& code) const; |
+ |
+ // Used for testing. |
+ bool IsGuardedClass(intptr_t cid) const; |
private: |
Thread* thread_; |
- GrowableArray<Class*> leaf_classes_; |
+ |
+ struct GuardedClassInfo { |
+ Class* cls; |
+ |
+ // Number of finalized subclasses that this class had at the moment |
+ // when CHA made the first decision based on this class. |
+ // Used to validate correctness of background compilation: if |
+ // any subclasses were added we will discard compiled code. |
+ intptr_t subclass_count; |
+ }; |
+ |
+ GrowableArray<GuardedClassInfo> guarded_classes_; |
CHA* previous_; |
}; |