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

Side by Side Diff: runtime/vm/kernel_to_il.cc

Issue 2485993002: VM: Support bootstrapping core libraries from Kernel binaries instead of source. (Closed)
Patch Set: rebase Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <map> 5 #include <map>
6 #include <set> 6 #include <set>
7 #include <string> 7 #include <string>
8 8
9 #include "vm/kernel_to_il.h" 9 #include "vm/kernel_to_il.h"
10 10
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 node->finalizer()->AcceptStatementVisitor(this); 638 node->finalizer()->AcceptStatementVisitor(this);
639 --depth_.catch_; 639 --depth_.catch_;
640 } 640 }
641 641
642 642
643 void ScopeBuilder::VisitFunctionNode(FunctionNode* node) { 643 void ScopeBuilder::VisitFunctionNode(FunctionNode* node) {
644 List<TypeParameter>& type_parameters = node->type_parameters(); 644 List<TypeParameter>& type_parameters = node->type_parameters();
645 for (intptr_t i = 0; i < type_parameters.length(); ++i) { 645 for (intptr_t i = 0; i < type_parameters.length(); ++i) {
646 VisitTypeParameter(type_parameters[i]); 646 VisitTypeParameter(type_parameters[i]);
647 } 647 }
648
649 if (node->async_marker() == FunctionNode::kSyncYielding) {
650 LocalScope* scope = parsed_function_->node_sequence()->scope();
651 for (intptr_t i = 0;
652 i < parsed_function_->function().NumOptionalPositionalParameters();
653 i++) {
654 scope->VariableAt(i)->set_is_forced_stack();
655 }
656 }
657
648 // Do not visit the positional and named parameters, because they've 658 // Do not visit the positional and named parameters, because they've
649 // already been added to the scope. 659 // already been added to the scope.
650 if (node->body() != NULL) { 660 if (node->body() != NULL) {
651 node->body()->AcceptStatementVisitor(this); 661 node->body()->AcceptStatementVisitor(this);
652 } 662 }
653 663
654 // Ensure that :await_jump_var and :await_ctx_var are captured. 664 // Ensure that :await_jump_var and :await_ctx_var are captured.
655 if (node->async_marker() == FunctionNode::kSyncYielding) { 665 if (node->async_marker() == FunctionNode::kSyncYielding) {
656 { 666 {
657 LocalVariable* temp = NULL; 667 LocalVariable* temp = NULL;
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 Library* kernel_library = Library::Cast(kernel_klass->parent()); 1108 Library* kernel_library = Library::Cast(kernel_klass->parent());
1099 dart::Library& library = 1109 dart::Library& library =
1100 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); 1110 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library));
1101 klass = library.LookupClassAllowPrivate(class_name); 1111 klass = library.LookupClassAllowPrivate(class_name);
1102 1112
1103 ASSERT(klass != Object::null()); 1113 ASSERT(klass != Object::null());
1104 return klass; 1114 return klass;
1105 } 1115 }
1106 1116
1107 1117
1118 dart::RawUnresolvedClass* TranslationHelper::ToUnresolvedClass(
1119 Class* kernel_klass) {
1120 dart::RawClass* klass = NULL;
1121
1122 const dart::String& class_name = DartClassName(kernel_klass);
1123 Library* kernel_library = Library::Cast(kernel_klass->parent());
1124 dart::Library& library =
1125 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library));
1126
1127 ASSERT(klass != Object::null());
1128 return dart::UnresolvedClass::New(library, class_name,
1129 TokenPosition::kNoSource);
1130 }
1131
1132
1108 dart::RawField* TranslationHelper::LookupFieldByKernelField( 1133 dart::RawField* TranslationHelper::LookupFieldByKernelField(
1109 Field* kernel_field) { 1134 Field* kernel_field) {
1110 TreeNode* node = kernel_field->parent(); 1135 TreeNode* node = kernel_field->parent();
1111 1136
1112 dart::Class& klass = dart::Class::Handle(Z); 1137 dart::Class& klass = dart::Class::Handle(Z);
1113 if (node->IsClass()) { 1138 if (node->IsClass()) {
1114 klass = LookupClassByKernelClass(Class::Cast(node)); 1139 klass = LookupClassByKernelClass(Class::Cast(node));
1115 } else { 1140 } else {
1116 ASSERT(node->IsLibrary()); 1141 ASSERT(node->IsLibrary());
1117 dart::Library& library = dart::Library::Handle( 1142 dart::Library& library = dart::Library::Handle(
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
1832 stack_(NULL), 1857 stack_(NULL),
1833 pending_argument_count_(0), 1858 pending_argument_count_(0),
1834 graph_entry_(NULL), 1859 graph_entry_(NULL),
1835 scopes_(NULL), 1860 scopes_(NULL),
1836 breakable_block_(NULL), 1861 breakable_block_(NULL),
1837 switch_block_(NULL), 1862 switch_block_(NULL),
1838 try_finally_block_(NULL), 1863 try_finally_block_(NULL),
1839 try_catch_block_(NULL), 1864 try_catch_block_(NULL),
1840 next_used_try_index_(0), 1865 next_used_try_index_(0),
1841 catch_block_(NULL), 1866 catch_block_(NULL),
1842 type_translator_(&translation_helper_, &active_class_), 1867 type_translator_(&translation_helper_,
1868 &active_class_,
1869 /* finalize= */ true),
1843 constant_evaluator_(this, 1870 constant_evaluator_(this,
1844 zone_, 1871 zone_,
1845 &translation_helper_, 1872 &translation_helper_,
1846 &type_translator_) {} 1873 &type_translator_) {}
1847 1874
1848 1875
1849 FlowGraphBuilder::~FlowGraphBuilder() {} 1876 FlowGraphBuilder::~FlowGraphBuilder() {}
1850 1877
1851 1878
1852 Fragment FlowGraphBuilder::TranslateFinallyFinalizers( 1879 Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
(...skipping 1981 matching lines...) Expand 10 before | Expand all | Expand 10 after
3834 // We return a new `ZoneHandle` here on purpose: The intermediate language 3861 // We return a new `ZoneHandle` here on purpose: The intermediate language
3835 // instructions do not make a copy of the handle, so we do it. 3862 // instructions do not make a copy of the handle, so we do it.
3836 return dart::AbstractType::ZoneHandle(Z, result_.raw()); 3863 return dart::AbstractType::ZoneHandle(Z, result_.raw());
3837 } 3864 }
3838 3865
3839 3866
3840 AbstractType& DartTypeTranslator::TranslateTypeWithoutFinalization( 3867 AbstractType& DartTypeTranslator::TranslateTypeWithoutFinalization(
3841 DartType* node) { 3868 DartType* node) {
3842 bool saved_finalize = finalize_; 3869 bool saved_finalize = finalize_;
3843 finalize_ = false; 3870 finalize_ = false;
3844 H.SetFinalize(false);
3845 AbstractType& result = TranslateType(node); 3871 AbstractType& result = TranslateType(node);
3846 finalize_ = saved_finalize; 3872 finalize_ = saved_finalize;
3847 H.SetFinalize(saved_finalize);
3848 return result; 3873 return result;
3849 } 3874 }
3850 3875
3851 3876
3852 const AbstractType& DartTypeTranslator::TranslateVariableType( 3877 const AbstractType& DartTypeTranslator::TranslateVariableType(
3853 VariableDeclaration* variable) { 3878 VariableDeclaration* variable) {
3854 AbstractType& abstract_type = TranslateType(variable->type()); 3879 AbstractType& abstract_type = TranslateType(variable->type());
3855 3880
3856 // We return a new `ZoneHandle` here on purpose: The intermediate language 3881 // We return a new `ZoneHandle` here on purpose: The intermediate language
3857 // instructions do not make a copy of the handle, so we do it. 3882 // instructions do not make a copy of the handle, so we do it.
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3993 } 4018 }
3994 4019
3995 4020
3996 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { 4021 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) {
3997 // NOTE: That an interface type like `T<A, B>` is considered to be 4022 // NOTE: That an interface type like `T<A, B>` is considered to be
3998 // malformed iff `T` is malformed. 4023 // malformed iff `T` is malformed.
3999 // => We therefore ignore errors in `A` or `B`. 4024 // => We therefore ignore errors in `A` or `B`.
4000 const TypeArguments& type_arguments = TranslateTypeArguments( 4025 const TypeArguments& type_arguments = TranslateTypeArguments(
4001 node->type_arguments().raw_array(), node->type_arguments().length()); 4026 node->type_arguments().raw_array(), node->type_arguments().length());
4002 4027
4003 const dart::Class& klass = 4028
4004 dart::Class::Handle(Z, H.LookupClassByKernelClass(node->klass())); 4029 dart::Object& klass = dart::Object::Handle(Z);
4030
4031 if (finalize_) {
4032 klass = H.LookupClassByKernelClass(node->klass());
4033 } else {
4034 klass = H.ToUnresolvedClass(node->klass());
4035 }
4036
4005 4037
4006 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); 4038 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
4007 result_.SetIsResolved();
4008 if (finalize_) { 4039 if (finalize_) {
4009 result_ = ClassFinalizer::FinalizeType(klass, result_, 4040 result_.SetIsResolved();
4041 result_ = ClassFinalizer::FinalizeType(dart::Class::Cast(klass), result_,
4010 ClassFinalizer::kCanonicalize); 4042 ClassFinalizer::kCanonicalize);
4011 } 4043 }
4012 } 4044 }
4013 4045
4014 4046
4015 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { 4047 void DartTypeTranslator::VisitDynamicType(DynamicType* node) {
4016 result_ = Object::dynamic_type().raw(); 4048 result_ = Object::dynamic_type().raw();
4017 } 4049 }
4018 4050
4019 4051
(...skipping 1606 matching lines...) Expand 10 before | Expand all | Expand 10 after
5626 // ... 5658 // ...
5627 // } 5659 // }
5628 // 5660 //
5629 LocalScope* scope = parsed_function_->node_sequence()->scope(); 5661 LocalScope* scope = parsed_function_->node_sequence()->scope();
5630 LocalVariable* exception_var = scope->VariableAt(2); 5662 LocalVariable* exception_var = scope->VariableAt(2);
5631 LocalVariable* stack_trace_var = scope->VariableAt(3); 5663 LocalVariable* stack_trace_var = scope->VariableAt(3);
5632 ASSERT(exception_var->name().raw() == Symbols::ExceptionParameter().raw()); 5664 ASSERT(exception_var->name().raw() == Symbols::ExceptionParameter().raw());
5633 ASSERT(stack_trace_var->name().raw() == 5665 ASSERT(stack_trace_var->name().raw() ==
5634 Symbols::StackTraceParameter().raw()); 5666 Symbols::StackTraceParameter().raw());
5635 5667
5636 exception_var->set_is_forced_stack();
5637 stack_trace_var->set_is_forced_stack();
5638
5639 TargetEntryInstr* no_error; 5668 TargetEntryInstr* no_error;
5640 TargetEntryInstr* error; 5669 TargetEntryInstr* error;
5641 5670
5642 continuation += LoadLocal(exception_var); 5671 continuation += LoadLocal(exception_var);
5643 continuation += BranchIfNull(&no_error, &error); 5672 continuation += BranchIfNull(&no_error, &error);
5644 5673
5645 Fragment rethrow(error); 5674 Fragment rethrow(error);
5646 rethrow += LoadLocal(exception_var); 5675 rethrow += LoadLocal(exception_var);
5647 rethrow += PushArgument(); 5676 rethrow += PushArgument();
5648 rethrow += LoadLocal(stack_trace_var); 5677 rethrow += LoadLocal(stack_trace_var);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
5718 instructions += LoadLocal(closure); 5747 instructions += LoadLocal(closure);
5719 instructions += LoadLocal(parsed_function_->current_context_var()); 5748 instructions += LoadLocal(parsed_function_->current_context_var());
5720 instructions += StoreInstanceField(Closure::context_offset()); 5749 instructions += StoreInstanceField(Closure::context_offset());
5721 5750
5722 return instructions; 5751 return instructions;
5723 } 5752 }
5724 5753
5725 5754
5726 } // namespace kernel 5755 } // namespace kernel
5727 } // namespace dart 5756 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698