Index: runtime/vm/kernel_to_il.cc |
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
index 61a4e71f0d36f8aaf7e08312746f2e73041ca437..5c46389eeab079f8f2939f18b95117ecac87e5d9 100644 |
--- a/runtime/vm/kernel_to_il.cc |
+++ b/runtime/vm/kernel_to_il.cc |
@@ -18,6 +18,7 @@ |
#include "vm/resolver.h" |
#include "vm/stack_frame.h" |
+#if !defined(DART_PRECOMPILED_RUNTIME) |
namespace dart { |
DECLARE_FLAG(bool, support_externalizable_strings); |
@@ -645,6 +646,16 @@ void ScopeBuilder::VisitFunctionNode(FunctionNode* node) { |
for (intptr_t i = 0; i < type_parameters.length(); ++i) { |
VisitTypeParameter(type_parameters[i]); |
} |
+ |
+ if (node->async_marker() == FunctionNode::kSyncYielding) { |
+ LocalScope* scope = parsed_function_->node_sequence()->scope(); |
+ for (intptr_t i = 0; |
+ i < parsed_function_->function().NumOptionalPositionalParameters(); |
+ i++) { |
+ scope->VariableAt(i)->set_is_forced_stack(); |
+ } |
+ } |
+ |
// Do not visit the positional and named parameters, because they've |
// already been added to the scope. |
if (node->body() != NULL) { |
@@ -1105,6 +1116,21 @@ dart::RawClass* TranslationHelper::LookupClassByKernelClass( |
} |
+dart::RawUnresolvedClass* TranslationHelper::ToUnresolvedClass( |
+ Class* kernel_klass) { |
+ dart::RawClass* klass = NULL; |
+ |
+ const dart::String& class_name = DartClassName(kernel_klass); |
+ Library* kernel_library = Library::Cast(kernel_klass->parent()); |
+ dart::Library& library = |
+ dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); |
+ |
+ ASSERT(klass != Object::null()); |
+ return dart::UnresolvedClass::New(library, class_name, |
+ TokenPosition::kNoSource); |
+} |
+ |
+ |
dart::RawField* TranslationHelper::LookupFieldByKernelField( |
Field* kernel_field) { |
TreeNode* node = kernel_field->parent(); |
@@ -1839,7 +1865,9 @@ FlowGraphBuilder::FlowGraphBuilder( |
try_catch_block_(NULL), |
next_used_try_index_(0), |
catch_block_(NULL), |
- type_translator_(&translation_helper_, &active_class_), |
+ type_translator_(&translation_helper_, |
+ &active_class_, |
+ /* finalize= */ true), |
constant_evaluator_(this, |
zone_, |
&translation_helper_, |
@@ -3841,10 +3869,8 @@ AbstractType& DartTypeTranslator::TranslateTypeWithoutFinalization( |
DartType* node) { |
bool saved_finalize = finalize_; |
finalize_ = false; |
- H.SetFinalize(false); |
AbstractType& result = TranslateType(node); |
finalize_ = saved_finalize; |
- H.SetFinalize(saved_finalize); |
return result; |
} |
@@ -4000,13 +4026,13 @@ void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { |
const TypeArguments& type_arguments = TranslateTypeArguments( |
node->type_arguments().raw_array(), node->type_arguments().length()); |
- const dart::Class& klass = |
- dart::Class::Handle(Z, H.LookupClassByKernelClass(node->klass())); |
+ dart::Object& klass = |
+ dart::Object::Handle(Z, H.ToUnresolvedClass(node->klass())); |
result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); |
- result_.SetIsResolved(); |
if (finalize_) { |
- result_ = ClassFinalizer::FinalizeType(klass, result_, |
+ ASSERT(active_class_->klass != NULL); |
+ result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_, |
ClassFinalizer::kCanonicalize); |
} |
} |
@@ -5633,9 +5659,6 @@ void FlowGraphBuilder::VisitYieldStatement(YieldStatement* node) { |
ASSERT(stack_trace_var->name().raw() == |
Symbols::StackTraceParameter().raw()); |
- exception_var->set_is_forced_stack(); |
- stack_trace_var->set_is_forced_stack(); |
- |
TargetEntryInstr* no_error; |
TargetEntryInstr* error; |
@@ -5725,3 +5748,4 @@ Fragment FlowGraphBuilder::TranslateFunctionNode(FunctionNode* node, |
} // namespace kernel |
} // namespace dart |
+#endif // !defined(DART_PRECOMPILED_RUNTIME) |