| Index: runtime/vm/kernel_to_il.cc
|
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
|
| index 38900f10b9a2efb5a1c96073f314a77ec985e258..0a1a9a556807427ba53a2ca3e1d3e146cfe1169a 100644
|
| --- a/runtime/vm/kernel_to_il.cc
|
| +++ b/runtime/vm/kernel_to_il.cc
|
| @@ -599,6 +599,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) {
|
| @@ -1056,6 +1066,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();
|
| @@ -1753,12 +1778,15 @@ const Object& ConstantEvaluator::RunFunction(const Function& function,
|
|
|
|
|
| FlowGraphBuilder::FlowGraphBuilder(
|
| - TreeNode* node, ParsedFunction* parsed_function,
|
| + TreeNode* node,
|
| + ParsedFunction* parsed_function,
|
| const ZoneGrowableArray<const ICData*>& ic_data_array,
|
| - InlineExitCollector* exit_collector, intptr_t osr_id,
|
| + InlineExitCollector* exit_collector,
|
| + intptr_t osr_id,
|
| intptr_t first_block_id)
|
| : zone_(Thread::Current()->zone()),
|
| - translation_helper_(Thread::Current(), zone_,
|
| + translation_helper_(Thread::Current(),
|
| + zone_,
|
| Thread::Current()->isolate()),
|
| node_(node),
|
| parsed_function_(parsed_function),
|
| @@ -1782,8 +1810,12 @@ FlowGraphBuilder::FlowGraphBuilder(
|
| try_catch_block_(NULL),
|
| next_used_try_index_(0),
|
| catch_block_(NULL),
|
| - type_translator_(&translation_helper_, &active_class_),
|
| - constant_evaluator_(this, zone_, &translation_helper_,
|
| + type_translator_(&translation_helper_,
|
| + &active_class_,
|
| + /* finalize= */ true),
|
| + constant_evaluator_(this,
|
| + zone_,
|
| + &translation_helper_,
|
| &type_translator_) {}
|
|
|
|
|
| @@ -3796,10 +3828,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;
|
| }
|
|
|
| @@ -3937,13 +3967,20 @@ 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);
|
| +
|
| + if (finalize_) {
|
| + klass = H.LookupClassByKernelClass(node->klass());
|
| + } else {
|
| + klass = H.ToUnresolvedClass(node->klass());
|
| + }
|
| +
|
|
|
| result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
|
| - result_.SetIsResolved();
|
| if (finalize_) {
|
| - result_ = ClassFinalizer::FinalizeType(klass, result_,
|
| + result_.SetIsResolved();
|
| + result_ = ClassFinalizer::FinalizeType(dart::Class::Cast(klass), result_,
|
| ClassFinalizer::kCanonicalize);
|
| }
|
| }
|
| @@ -5568,9 +5605,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;
|
|
|
|
|