Index: runtime/vm/compiler.cc |
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc |
index 4b5a737afbc83ffa285ad9ddb85edce6971da4db..bf5eac59933cec7484c67d3055bb0ec67b8e600c 100644 |
--- a/runtime/vm/compiler.cc |
+++ b/runtime/vm/compiler.cc |
@@ -378,16 +378,12 @@ class CompileParsedFunctionHelper : public ValueObject { |
optimized_(optimized), |
osr_id_(osr_id), |
thread_(Thread::Current()), |
- cha_invalidation_gen_at_start_(isolate()->cha_invalidation_gen()), |
field_invalidation_gen_at_start_(isolate()->field_invalidation_gen()), |
- prefix_invalidation_gen_at_start_( |
- isolate()->prefix_invalidation_gen()) { |
+ loading_invalidation_gen_at_start_( |
+ isolate()->loading_invalidation_gen()) { |
} |
bool Compile(CompilationPipeline* pipeline); |
- uint32_t prefix_invalidation_gen_at_start() const { |
- return prefix_invalidation_gen_at_start_; |
- } |
private: |
ParsedFunction* parsed_function() const { return parsed_function_; } |
@@ -395,12 +391,12 @@ class CompileParsedFunctionHelper : public ValueObject { |
intptr_t osr_id() const { return osr_id_; } |
Thread* thread() const { return thread_; } |
Isolate* isolate() const { return thread_->isolate(); } |
- uint32_t cha_invalidation_gen_at_start() const { |
- return cha_invalidation_gen_at_start_; |
- } |
- uint32_t field_invalidation_gen_at_start() const { |
+ intptr_t field_invalidation_gen_at_start() const { |
return field_invalidation_gen_at_start_; |
} |
+ intptr_t loading_invalidation_gen_at_start() const { |
+ return loading_invalidation_gen_at_start_; |
+ } |
void FinalizeCompilation(Assembler* assembler, |
FlowGraphCompiler* graph_compiler, |
FlowGraph* flow_graph); |
@@ -409,9 +405,8 @@ class CompileParsedFunctionHelper : public ValueObject { |
const bool optimized_; |
const intptr_t osr_id_; |
Thread* const thread_; |
- const uint32_t cha_invalidation_gen_at_start_; |
- const uint32_t field_invalidation_gen_at_start_; |
- const uint32_t prefix_invalidation_gen_at_start_; |
+ const intptr_t field_invalidation_gen_at_start_; |
+ const intptr_t loading_invalidation_gen_at_start_; |
DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper); |
}; |
@@ -501,15 +496,6 @@ NOT_IN_PRODUCT( |
const bool trace_compiler = |
FLAG_trace_compiler || FLAG_trace_optimizing_compiler; |
bool code_is_valid = true; |
- if (!thread()->cha()->leaf_classes().is_empty()) { |
- if (cha_invalidation_gen_at_start() != |
- isolate()->cha_invalidation_gen()) { |
- code_is_valid = false; |
- if (trace_compiler) { |
- THR_Print("--> FAIL: CHA invalidation."); |
- } |
- } |
- } |
if (!flow_graph->parsed_function().guarded_fields()->is_empty()) { |
if (field_invalidation_gen_at_start() != |
isolate()->field_invalidation_gen()) { |
@@ -519,13 +505,11 @@ NOT_IN_PRODUCT( |
} |
} |
} |
- if (parsed_function()->HasDeferredPrefixes()) { |
- if (prefix_invalidation_gen_at_start() != |
- isolate()->prefix_invalidation_gen()) { |
- code_is_valid = false; |
- if (trace_compiler) { |
- THR_Print("--> FAIL: Prefix invalidation."); |
- } |
+ if (loading_invalidation_gen_at_start() != |
+ isolate()->loading_invalidation_gen()) { |
+ code_is_valid = false; |
+ if (trace_compiler) { |
+ THR_Print("--> FAIL: Loading invalidation."); |
} |
} |
if (code_is_valid) { |
@@ -1154,9 +1138,9 @@ static RawError* CompileFunctionHelper(CompilationPipeline* pipeline, |
if (optimized) { |
INC_STAT(thread, num_functions_optimized, 1); |
} |
- // Makes sure no libraries are loaded during parsing. |
- const uint32_t prefix_invalidation_gen_at_start = |
- isolate->prefix_invalidation_gen(); |
+ // Makes sure no classes are loaded during parsing in background. |
+ const intptr_t loading_invalidation_gen_at_start = |
+ isolate->loading_invalidation_gen(); |
{ |
HANDLESCOPE(thread); |
const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed); |
@@ -1167,14 +1151,19 @@ static RawError* CompileFunctionHelper(CompilationPipeline* pipeline, |
num_tokens_after - num_tokens_before); |
} |
+ |
CompileParsedFunctionHelper helper(parsed_function, optimized, osr_id); |
- if (prefix_invalidation_gen_at_start != |
- helper.prefix_invalidation_gen_at_start()) { |
- ASSERT(Compiler::IsBackgroundCompilation()); |
- // Deferred loading occured while parsing or copying ICData. We need |
- // to abort here because deopt-ids may have changed. |
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId); |
+ |
+ if (Compiler::IsBackgroundCompilation()) { |
+ if (isolate->IsTopLevelParsing() || |
+ (loading_invalidation_gen_at_start != |
+ isolate->loading_invalidation_gen())) { |
+ // Loading occured while parsing. We need to abort here because state |
+ // changed while compiling. |
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId); |
+ } |
} |
+ |
const bool success = helper.Compile(pipeline); |
if (!success) { |
if (optimized) { |