OLD | NEW |
---|---|
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 "vm/kernel_reader.h" | 5 #include "vm/kernel_reader.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
163 Script& script = | 163 Script& script = |
164 Script::Handle(Z, Script::New(Symbols::KernelScriptUri(), | 164 Script::Handle(Z, Script::New(Symbols::KernelScriptUri(), |
165 Symbols::Empty(), RawScript::kScriptTag)); | 165 Symbols::Empty(), RawScript::kScriptTag)); |
166 script.SetLocationOffset(0, 0); | 166 script.SetLocationOffset(0, 0); |
167 script.Tokenize(H.DartString("nop() {}")); | 167 script.Tokenize(H.DartString("nop() {}")); |
168 dart::Class& toplevel_class = dart::Class::Handle( | 168 dart::Class& toplevel_class = dart::Class::Handle( |
169 Z, dart::Class::New(library, Symbols::TopLevel(), script, | 169 Z, dart::Class::New(library, Symbols::TopLevel(), script, |
170 TokenPosition::kNoSource)); | 170 TokenPosition::kNoSource)); |
171 toplevel_class.set_is_cycle_free(); | 171 toplevel_class.set_is_cycle_free(); |
172 library.set_toplevel_class(toplevel_class); | 172 library.set_toplevel_class(toplevel_class); |
173 if (bootstrapping_) { | |
174 GrowableObjectArray::Handle(Z, I->object_store()->pending_classes()) | |
175 .Add(toplevel_class, Heap::kOld); | |
176 } | |
177 | 173 |
178 ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); | 174 ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); |
179 // Load toplevel fields. | 175 // Load toplevel fields. |
180 for (intptr_t i = 0; i < kernel_library->fields().length(); i++) { | 176 for (intptr_t i = 0; i < kernel_library->fields().length(); i++) { |
181 Field* kernel_field = kernel_library->fields()[i]; | 177 Field* kernel_field = kernel_library->fields()[i]; |
182 | 178 |
183 ActiveMemberScope active_member_scope(&active_class_, kernel_field); | 179 ActiveMemberScope active_member_scope(&active_class_, kernel_field); |
184 const dart::String& name = H.DartFieldName(kernel_field->name()); | 180 const dart::String& name = H.DartFieldName(kernel_field->name()); |
185 dart::Field& field = dart::Field::Handle( | 181 dart::Field& field = dart::Field::Handle( |
186 Z, dart::Field::NewTopLevel(name, kernel_field->IsFinal(), | 182 Z, dart::Field::NewTopLevel(name, kernel_field->IsFinal(), |
(...skipping 13 matching lines...) Expand all Loading... | |
200 Procedure* kernel_procedure = kernel_library->procedures()[i]; | 196 Procedure* kernel_procedure = kernel_library->procedures()[i]; |
201 ReadProcedure(library, toplevel_class, kernel_procedure); | 197 ReadProcedure(library, toplevel_class, kernel_procedure); |
202 } | 198 } |
203 | 199 |
204 const GrowableObjectArray& classes = | 200 const GrowableObjectArray& classes = |
205 GrowableObjectArray::Handle(I->object_store()->pending_classes()); | 201 GrowableObjectArray::Handle(I->object_store()->pending_classes()); |
206 | 202 |
207 // Load all classes. | 203 // Load all classes. |
208 for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { | 204 for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { |
209 Class* kernel_klass = kernel_library->classes()[i]; | 205 Class* kernel_klass = kernel_library->classes()[i]; |
210 classes.Add(ReadClass(library, kernel_klass), Heap::kOld); | 206 classes.Add(ReadClass(library, kernel_klass), Heap::kOld); |
Kevin Millikin (Google)
2016/11/21 15:00:11
When bootstrapping, ReadClass is also adding class
kustermann
2016/11/21 15:30:05
Good point. Done.
| |
211 } | 207 } |
208 | |
209 classes.Add(toplevel_class, Heap::kOld); | |
212 } | 210 } |
213 | 211 |
214 | 212 |
215 void KernelReader::ReadPreliminaryClass(dart::Class* klass, | 213 void KernelReader::ReadPreliminaryClass(dart::Class* klass, |
216 Class* kernel_klass) { | 214 Class* kernel_klass) { |
217 ASSERT(kernel_klass->IsNormalClass()); | 215 ASSERT(kernel_klass->IsNormalClass()); |
218 NormalClass* kernel_normal_class = NormalClass::Cast(kernel_klass); | 216 NormalClass* kernel_normal_class = NormalClass::Cast(kernel_klass); |
219 | 217 |
220 ActiveClassScope active_class_scope(&active_class_, kernel_klass, klass); | 218 ActiveClassScope active_class_scope(&active_class_, kernel_klass, klass); |
221 | 219 |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
638 TokenPosition pos(0); | 636 TokenPosition pos(0); |
639 Script& script = Script::Handle( | 637 Script& script = Script::Handle( |
640 Z, Script::New(Symbols::KernelScriptUri(), Symbols::Empty(), | 638 Z, Script::New(Symbols::KernelScriptUri(), Symbols::Empty(), |
641 RawScript::kScriptTag)); | 639 RawScript::kScriptTag)); |
642 handle->set_script(script); | 640 handle->set_script(script); |
643 } | 641 } |
644 // Insert the class in the cache before calling ReadPreliminaryClass so | 642 // Insert the class in the cache before calling ReadPreliminaryClass so |
645 // we do not risk allocating the class again by calling LookupClass | 643 // we do not risk allocating the class again by calling LookupClass |
646 // recursively from ReadPreliminaryClass for the same class. | 644 // recursively from ReadPreliminaryClass for the same class. |
647 classes_.Insert(klass, handle); | 645 classes_.Insert(klass, handle); |
648 if (!handle->is_type_finalized()) { | 646 if (!handle->is_cycle_free()) { |
649 ReadPreliminaryClass(handle, klass); | 647 ReadPreliminaryClass(handle, klass); |
650 } | 648 } |
651 } | 649 } |
652 return *handle; | 650 return *handle; |
653 } | 651 } |
654 | 652 |
655 | 653 |
656 RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { | 654 RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { |
657 intptr_t lookuptable[] = { | 655 intptr_t lookuptable[] = { |
658 RawFunction::kRegularFunction, // Procedure::kMethod | 656 RawFunction::kRegularFunction, // Procedure::kMethod |
659 RawFunction::kGetterFunction, // Procedure::kGetter | 657 RawFunction::kGetterFunction, // Procedure::kGetter |
660 RawFunction::kSetterFunction, // Procedure::kSetter | 658 RawFunction::kSetterFunction, // Procedure::kSetter |
661 RawFunction::kRegularFunction, // Procedure::kOperator | 659 RawFunction::kRegularFunction, // Procedure::kOperator |
662 RawFunction::kConstructor, // Procedure::kFactory | 660 RawFunction::kConstructor, // Procedure::kFactory |
663 }; | 661 }; |
664 intptr_t kind = static_cast<int>(kernel_procedure->kind()); | 662 intptr_t kind = static_cast<int>(kernel_procedure->kind()); |
665 if (kind == Procedure::kIncompleteProcedure) { | 663 if (kind == Procedure::kIncompleteProcedure) { |
666 return RawFunction::kSignatureFunction; | 664 return RawFunction::kSignatureFunction; |
667 } else { | 665 } else { |
668 ASSERT(0 <= kind && kind <= Procedure::kFactory); | 666 ASSERT(0 <= kind && kind <= Procedure::kFactory); |
669 return static_cast<RawFunction::Kind>(lookuptable[kind]); | 667 return static_cast<RawFunction::Kind>(lookuptable[kind]); |
670 } | 668 } |
671 } | 669 } |
672 | 670 |
673 | 671 |
674 } // namespace kernel | 672 } // namespace kernel |
675 } // namespace dart | 673 } // namespace dart |
676 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 674 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |