// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_KERNEL_LOADER_H_ #define RUNTIME_VM_KERNEL_LOADER_H_ #if !defined(DART_PRECOMPILED_RUNTIME) #include #include "vm/compiler/frontend/kernel_binary_flowgraph.h" #include "vm/compiler/frontend/kernel_to_il.h" #include "vm/kernel.h" #include "vm/object.h" namespace dart { namespace kernel { class KernelLoader; class BuildingTranslationHelper : public TranslationHelper { public: BuildingTranslationHelper(KernelLoader* loader, Thread* thread) : TranslationHelper(thread), loader_(loader) {} virtual ~BuildingTranslationHelper() {} virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library); virtual RawClass* LookupClassByKernelClass(NameIndex klass); private: KernelLoader* loader_; }; template class Mapping { public: bool Lookup(intptr_t canonical_name, VmType** handle) { typename MapType::Pair* pair = map_.LookupPair(canonical_name); if (pair != NULL) { *handle = pair->value; return true; } return false; } void Insert(intptr_t canonical_name, VmType* object) { map_.Insert(canonical_name, object); } private: typedef IntMap MapType; MapType map_; }; class KernelLoader { public: explicit KernelLoader(Program* program); // Returns the library containing the main procedure, null if there // was no main procedure, or a failure object if there was an error. Object& LoadProgram(); // Finds all libraries that have been modified in this incremental // version of the kernel program file. void FindModifiedLibraries(Isolate* isolate, BitVector* modified_libs, bool force_reload); void LoadLibrary(intptr_t index); const String& DartSymbol(StringIndex index) { return translation_helper_.DartSymbol(index); } const String& LibraryUri(intptr_t library_index) { return translation_helper_.DartSymbol( translation_helper_.CanonicalNameString( library_canonical_name(library_index))); } intptr_t library_offset(intptr_t index) { kernel::Reader reader(program_->kernel_data(), program_->kernel_data_size()); return reader.ReadFromIndexNoReset(reader.size(), LibraryCountFieldCountFromEnd + 1, program_->library_count() + 1, index); } NameIndex library_canonical_name(intptr_t index) { kernel::Reader reader(program_->kernel_data(), program_->kernel_data_size()); reader.set_offset(library_offset(index)); // Start reading library. reader.ReadFlags(); return reader.ReadCanonicalNameReference(); } uint8_t CharacterAt(StringIndex string_index, intptr_t index); private: friend class BuildingTranslationHelper; void LoadPreliminaryClass(Class* klass, ClassHelper* class_helper, intptr_t type_parameter_count); Class& LoadClass(const Library& library, const Class& toplevel_class, intptr_t class_end); void LoadProcedure(const Library& library, const Class& owner, bool in_class, intptr_t procedure_end); void LoadAndSetupTypeParameters(const Object& set_on, intptr_t type_parameter_count, const Class& parameterized_class, const Function& parameterized_function); RawArray* MakeFunctionsArray(); // If klass's script is not the script at the uri index, return a PatchClass // for klass whose script corresponds to the uri index. // Otherwise return klass. const Object& ClassForScriptAt(const Class& klass, intptr_t source_uri_index); Script& ScriptAt(intptr_t source_uri_index, StringIndex import_uri = StringIndex()); void GenerateFieldAccessors(const Class& klass, const Field& field, FieldHelper* field_helper, intptr_t field_offset); void SetupFieldAccessorFunction(const Class& klass, const Function& function); void LoadLibraryImportsAndExports(Library* library); Library& LookupLibrary(NameIndex library); Class& LookupClass(NameIndex klass); RawFunction::Kind GetFunctionType(ProcedureHelper::Kind procedure_kind); Program* program_; Thread* thread_; Zone* zone_; Isolate* isolate_; Array& scripts_; Array& patch_classes_; ActiveClass active_class_; BuildingTranslationHelper translation_helper_; StreamingFlowGraphBuilder builder_; Mapping libraries_; Mapping classes_; GrowableArray functions_; GrowableArray fields_; }; } // namespace kernel } // namespace dart #endif // !defined(DART_PRECOMPILED_RUNTIME) #endif // RUNTIME_VM_KERNEL_LOADER_H_