| 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 Program* KernelReader::ReadPrecompiledProgram() { | 96 Program* KernelReader::ReadPrecompiledProgram() { |
| 97 Program* program = ReadPrecompiledKernelFromBuffer(buffer_, buffer_length_); | 97 Program* program = ReadPrecompiledKernelFromBuffer(buffer_, buffer_length_); |
| 98 if (program == NULL) return NULL; | 98 if (program == NULL) return NULL; |
| 99 intptr_t source_file_count = program->line_starting_table().size(); | 99 intptr_t source_file_count = program->line_starting_table().size(); |
| 100 scripts_ = Array::New(source_file_count); | 100 scripts_ = Array::New(source_file_count); |
| 101 program_ = program; | 101 program_ = program; |
| 102 return program; | 102 return program; |
| 103 } | 103 } |
| 104 | 104 |
| 105 Object& KernelReader::ReadProgram() { | 105 Object& KernelReader::ReadProgram() { |
| 106 ASSERT(!bootstrapping_); | 106 Program* program = ReadPrecompiledKernelFromBuffer(buffer_, buffer_length_); |
| 107 Program* program = ReadPrecompiledProgram(); | |
| 108 if (program == NULL) { | 107 if (program == NULL) { |
| 109 const dart::String& error = H.DartString("Failed to read .kernell file"); | 108 const dart::String& error = H.DartString("Failed to read .kernell file"); |
| 110 return Object::Handle(Z, ApiError::New(error)); | 109 return Object::Handle(Z, ApiError::New(error)); |
| 111 } | 110 } |
| 112 | 111 |
| 113 LongJumpScope jump; | 112 LongJumpScope jump; |
| 114 if (setjmp(*jump.Set()) == 0) { | 113 if (setjmp(*jump.Set()) == 0) { |
| 115 Procedure* main = program->main_method(); | 114 Procedure* main = program->main_method(); |
| 116 Library* kernel_main_library = Library::Cast(main->parent()); | 115 Library* kernel_main_library = Library::Cast(main->parent()); |
| 117 | 116 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 library.SetLoadInProgress(); | 166 library.SetLoadInProgress(); |
| 168 } | 167 } |
| 169 // Setup toplevel class (which contains library fields/procedures). | 168 // Setup toplevel class (which contains library fields/procedures). |
| 170 | 169 |
| 171 Script& script = ScriptAt(kernel_library->source_uri_index()); | 170 Script& script = ScriptAt(kernel_library->source_uri_index()); |
| 172 dart::Class& toplevel_class = dart::Class::Handle( | 171 dart::Class& toplevel_class = dart::Class::Handle( |
| 173 Z, dart::Class::New(library, Symbols::TopLevel(), script, | 172 Z, dart::Class::New(library, Symbols::TopLevel(), script, |
| 174 TokenPosition::kNoSource)); | 173 TokenPosition::kNoSource)); |
| 175 toplevel_class.set_is_cycle_free(); | 174 toplevel_class.set_is_cycle_free(); |
| 176 library.set_toplevel_class(toplevel_class); | 175 library.set_toplevel_class(toplevel_class); |
| 177 if (bootstrapping_) { | |
| 178 GrowableObjectArray::Handle(Z, I->object_store()->pending_classes()) | |
| 179 .Add(toplevel_class, Heap::kOld); | |
| 180 } | |
| 181 | 176 |
| 182 ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); | 177 ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); |
| 183 // Load toplevel fields. | 178 // Load toplevel fields. |
| 184 for (intptr_t i = 0; i < kernel_library->fields().length(); i++) { | 179 for (intptr_t i = 0; i < kernel_library->fields().length(); i++) { |
| 185 Field* kernel_field = kernel_library->fields()[i]; | 180 Field* kernel_field = kernel_library->fields()[i]; |
| 186 | 181 |
| 187 ActiveMemberScope active_member_scope(&active_class_, kernel_field); | 182 ActiveMemberScope active_member_scope(&active_class_, kernel_field); |
| 188 const dart::String& name = H.DartFieldName(kernel_field->name()); | 183 const dart::String& name = H.DartFieldName(kernel_field->name()); |
| 189 const Object& script_class = | 184 const Object& script_class = |
| 190 ClassForScriptAt(toplevel_class, kernel_field->source_uri_index()); | 185 ClassForScriptAt(toplevel_class, kernel_field->source_uri_index()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 208 } | 203 } |
| 209 | 204 |
| 210 const GrowableObjectArray& classes = | 205 const GrowableObjectArray& classes = |
| 211 GrowableObjectArray::Handle(I->object_store()->pending_classes()); | 206 GrowableObjectArray::Handle(I->object_store()->pending_classes()); |
| 212 | 207 |
| 213 // Load all classes. | 208 // Load all classes. |
| 214 for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { | 209 for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { |
| 215 Class* kernel_klass = kernel_library->classes()[i]; | 210 Class* kernel_klass = kernel_library->classes()[i]; |
| 216 classes.Add(ReadClass(library, kernel_klass), Heap::kOld); | 211 classes.Add(ReadClass(library, kernel_klass), Heap::kOld); |
| 217 } | 212 } |
| 213 |
| 214 classes.Add(toplevel_class, Heap::kOld); |
| 218 } | 215 } |
| 219 | 216 |
| 220 | 217 |
| 221 void KernelReader::ReadPreliminaryClass(dart::Class* klass, | 218 void KernelReader::ReadPreliminaryClass(dart::Class* klass, |
| 222 Class* kernel_klass) { | 219 Class* kernel_klass) { |
| 223 ASSERT(kernel_klass->IsNormalClass()); | 220 ASSERT(kernel_klass->IsNormalClass()); |
| 224 NormalClass* kernel_normal_class = NormalClass::Cast(kernel_klass); | 221 NormalClass* kernel_normal_class = NormalClass::Cast(kernel_klass); |
| 225 | 222 |
| 226 ActiveClassScope active_class_scope(&active_class_, kernel_klass, klass); | 223 ActiveClassScope active_class_scope(&active_class_, kernel_klass, klass); |
| 227 | 224 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 true, // is_method | 340 true, // is_method |
| 344 false); // is_closure | 341 false); // is_closure |
| 345 } | 342 } |
| 346 | 343 |
| 347 for (intptr_t i = 0; i < kernel_klass->procedures().length(); i++) { | 344 for (intptr_t i = 0; i < kernel_klass->procedures().length(); i++) { |
| 348 Procedure* kernel_procedure = kernel_klass->procedures()[i]; | 345 Procedure* kernel_procedure = kernel_klass->procedures()[i]; |
| 349 ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); | 346 ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); |
| 350 ReadProcedure(library, klass, kernel_procedure, kernel_klass); | 347 ReadProcedure(library, klass, kernel_procedure, kernel_klass); |
| 351 } | 348 } |
| 352 | 349 |
| 353 if (bootstrapping_ && !klass.is_marked_for_parsing()) { | 350 if (!klass.is_marked_for_parsing()) { |
| 354 klass.set_is_marked_for_parsing(); | 351 klass.set_is_marked_for_parsing(); |
| 355 GrowableObjectArray::Handle(Z, I->object_store()->pending_classes()) | |
| 356 .Add(klass, Heap::kOld); | |
| 357 } | 352 } |
| 358 | 353 |
| 359 return klass; | 354 return klass; |
| 360 } | 355 } |
| 361 | 356 |
| 362 | 357 |
| 363 void KernelReader::ReadProcedure(const dart::Library& library, | 358 void KernelReader::ReadProcedure(const dart::Library& library, |
| 364 const dart::Class& owner, | 359 const dart::Class& owner, |
| 365 Procedure* kernel_procedure, | 360 Procedure* kernel_procedure, |
| 366 Class* kernel_klass) { | 361 Class* kernel_klass) { |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 } else if (handle->script() == Script::null()) { | 660 } else if (handle->script() == Script::null()) { |
| 666 // When bootstrapping we can encounter classes that do not yet have a | 661 // When bootstrapping we can encounter classes that do not yet have a |
| 667 // dummy script. | 662 // dummy script. |
| 668 Script& script = ScriptAt(klass->source_uri_index()); | 663 Script& script = ScriptAt(klass->source_uri_index()); |
| 669 handle->set_script(script); | 664 handle->set_script(script); |
| 670 } | 665 } |
| 671 // Insert the class in the cache before calling ReadPreliminaryClass so | 666 // Insert the class in the cache before calling ReadPreliminaryClass so |
| 672 // we do not risk allocating the class again by calling LookupClass | 667 // we do not risk allocating the class again by calling LookupClass |
| 673 // recursively from ReadPreliminaryClass for the same class. | 668 // recursively from ReadPreliminaryClass for the same class. |
| 674 classes_.Insert(klass, handle); | 669 classes_.Insert(klass, handle); |
| 675 if (!handle->is_type_finalized()) { | 670 if (!handle->is_cycle_free()) { |
| 676 ReadPreliminaryClass(handle, klass); | 671 ReadPreliminaryClass(handle, klass); |
| 677 } | 672 } |
| 678 } | 673 } |
| 679 return *handle; | 674 return *handle; |
| 680 } | 675 } |
| 681 | 676 |
| 682 | 677 |
| 683 RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { | 678 RawFunction::Kind KernelReader::GetFunctionType(Procedure* kernel_procedure) { |
| 684 intptr_t lookuptable[] = { | 679 intptr_t lookuptable[] = { |
| 685 RawFunction::kRegularFunction, // Procedure::kMethod | 680 RawFunction::kRegularFunction, // Procedure::kMethod |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 initializer_fun.set_is_debuggable(false); | 718 initializer_fun.set_is_debuggable(false); |
| 724 initializer_fun.set_is_reflectable(false); | 719 initializer_fun.set_is_reflectable(false); |
| 725 initializer_fun.set_is_inlinable(false); | 720 initializer_fun.set_is_inlinable(false); |
| 726 return new (zone) ParsedFunction(thread, initializer_fun); | 721 return new (zone) ParsedFunction(thread, initializer_fun); |
| 727 } | 722 } |
| 728 | 723 |
| 729 | 724 |
| 730 } // namespace kernel | 725 } // namespace kernel |
| 731 } // namespace dart | 726 } // namespace dart |
| 732 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 727 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |