Chromium Code Reviews| 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 |