cfac48179b
reload instead of computing it based on the source modification information. 2. Fix for failure in Unit test case https://github.com/dart-lang/sdk/issues/30322 3. Fix crash in test that was being skipped in https://github.com/dart-lang/sdk/issues/30109 and turn that test on. This CL is work towards completing issue https://github.com/dart-lang/sdk/issues/28051 R=aam@google.com Review-Url: https://codereview.chromium.org/2998983002 .
165 lines
5.1 KiB
C++
165 lines
5.1 KiB
C++
// 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_READER_H_
|
|
#define RUNTIME_VM_KERNEL_READER_H_
|
|
|
|
#if !defined(DART_PRECOMPILED_RUNTIME)
|
|
#include <map>
|
|
|
|
#include "vm/kernel.h"
|
|
#include "vm/kernel_binary_flowgraph.h"
|
|
#include "vm/kernel_to_il.h"
|
|
#include "vm/object.h"
|
|
|
|
namespace dart {
|
|
namespace kernel {
|
|
|
|
class KernelReader;
|
|
|
|
class BuildingTranslationHelper : public TranslationHelper {
|
|
public:
|
|
BuildingTranslationHelper(KernelReader* reader, Thread* thread)
|
|
: TranslationHelper(thread), reader_(reader) {}
|
|
virtual ~BuildingTranslationHelper() {}
|
|
|
|
virtual RawLibrary* LookupLibraryByKernelLibrary(NameIndex library);
|
|
virtual RawClass* LookupClassByKernelClass(NameIndex klass);
|
|
|
|
private:
|
|
KernelReader* reader_;
|
|
};
|
|
|
|
template <typename VmType>
|
|
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<VmType*> MapType;
|
|
MapType map_;
|
|
};
|
|
|
|
class KernelReader {
|
|
public:
|
|
explicit KernelReader(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& ReadProgram();
|
|
|
|
// 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 ReadLibrary(intptr_t kernel_offset);
|
|
|
|
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());
|
|
reader.set_offset(reader.size() - 4 -
|
|
(program_->library_count() - index) * 4);
|
|
return reader.ReadUInt32();
|
|
}
|
|
|
|
NameIndex library_canonical_name(intptr_t index) {
|
|
kernel::Reader reader(program_->kernel_data(),
|
|
program_->kernel_data_size());
|
|
reader.set_offset(reader.size() - 4 -
|
|
(program_->library_count() - index) * 4);
|
|
reader.set_offset(reader.ReadUInt32());
|
|
|
|
// Start reading library.
|
|
reader.ReadFlags(); // read flags.
|
|
return reader.ReadCanonicalNameReference();
|
|
}
|
|
|
|
uint8_t CharacterAt(StringIndex string_index, intptr_t index);
|
|
|
|
static bool FieldHasFunctionLiteralInitializer(const Field& field,
|
|
TokenPosition* start,
|
|
TokenPosition* end);
|
|
|
|
private:
|
|
friend class BuildingTranslationHelper;
|
|
|
|
void ReadPreliminaryClass(Class* klass,
|
|
ClassHelper* class_helper,
|
|
intptr_t type_parameter_count);
|
|
Class& ReadClass(const Library& library, const Class& toplevel_class);
|
|
void ReadProcedure(const Library& library, const Class& owner, bool in_class);
|
|
|
|
void ReadAndSetupTypeParameters(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);
|
|
|
|
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<Library> libraries_;
|
|
Mapping<Class> classes_;
|
|
|
|
GrowableArray<const Function*> functions_;
|
|
GrowableArray<const Field*> fields_;
|
|
};
|
|
|
|
} // namespace kernel
|
|
} // namespace dart
|
|
|
|
#endif // !defined(DART_PRECOMPILED_RUNTIME)
|
|
#endif // RUNTIME_VM_KERNEL_READER_H_
|