Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(957)

Unified Diff: runtime/vm/kernel_reader.cc

Issue 2853423002: Move the Kernel canonical name table into the VM's heap (Closed)
Patch Set: Merge a bugfix Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/kernel_reader.cc
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc
index 0879f95ed2e713ab619368227eda0b8b03e121cf..2d51f997034edd290dd49cb0b68a640599a7b1ad 100644
--- a/runtime/vm/kernel_reader.cc
+++ b/runtime/vm/kernel_reader.cc
@@ -95,13 +95,12 @@ RawArray* KernelReader::MakeFunctionsArray() {
RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary(
- CanonicalName* library) {
+ intptr_t library) {
return reader_->LookupLibrary(library).raw();
}
-RawClass* BuildingTranslationHelper::LookupClassByKernelClass(
- CanonicalName* klass) {
+RawClass* BuildingTranslationHelper::LookupClassByKernelClass(intptr_t klass) {
Vyacheslav Egorov (Google) 2017/05/03 06:28:48 I think we *do* need need named type for these ind
return reader_->LookupClass(klass).raw();
}
@@ -144,8 +143,20 @@ KernelReader::KernelReader(Program* program)
NoSafepointScope no_safepoint;
memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset);
}
+
+ // Copy the canonical names into the VM's heap. Encode them as unsigned, so
+ // the parent indexes are adjusted when extracted.
+ reader.set_offset(program->name_table_offset());
+ count = reader.ReadUInt() * 2;
+ TypedData& names = TypedData::Handle(
+ Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld));
+ for (intptr_t i = 0; i < count; ++i) {
+ names.SetUint32(i << 2, reader.ReadUInt());
+ }
+
H.SetStringOffsets(offsets);
H.SetStringData(data);
+ H.SetCanonicalNames(names);
}
@@ -171,8 +182,8 @@ Object& KernelReader::ReadProgram() {
// If there is no main method then we have compiled a partial Kernel file
// and do not need to patch here.
- CanonicalName* main = program_->main_method();
- if (main == NULL) {
+ intptr_t main = program_->main_method();
+ if (main == -1) {
return dart::Library::Handle(Z);
}
@@ -184,7 +195,7 @@ Object& KernelReader::ReadProgram() {
return dart::Library::Handle(Z);
}
- CanonicalName* main_library = H.EnclosingName(main);
+ intptr_t main_library = H.EnclosingName(main);
dart::Library& library = LookupLibrary(main_library);
// Sanity check that we can find the main entrypoint.
Object& main_obj = Object::Handle(
@@ -494,13 +505,14 @@ void KernelReader::ReadProcedure(const dart::Library& library,
if (!annotation->IsConstructorInvocation()) continue;
ConstructorInvocation* invocation =
ConstructorInvocation::Cast(annotation);
- CanonicalName* annotation_class = H.EnclosingName(invocation->target());
+ intptr_t annotation_class = H.EnclosingName(invocation->target());
ASSERT(H.IsClass(annotation_class));
- intptr_t class_name_index = annotation_class->name();
+ intptr_t class_name_index = H.CanonicalNameString(annotation_class);
// Just compare by name, do not generate the annotation class.
if (!H.StringEquals(class_name_index, "ExternalName")) continue;
- ASSERT(H.IsLibrary(annotation_class->parent()));
- intptr_t library_name_index = annotation_class->parent()->name();
+ ASSERT(H.IsLibrary(H.CanonicalNameParent(annotation_class)));
+ intptr_t library_name_index =
+ H.CanonicalNameString(H.CanonicalNameParent(annotation_class));
if (!H.StringEquals(library_name_index, "dart:_internal")) continue;
is_external = false;
@@ -634,6 +646,7 @@ Script& KernelReader::ScriptAt(intptr_t index, intptr_t import_uri) {
RawScript::kKernelTag);
script.set_kernel_string_offsets(H.string_offsets());
script.set_kernel_string_data(H.string_data());
+ script.set_kernel_canonical_names(H.canonical_names());
scripts_.SetAt(index, script);
// Create line_starts array for the script.
@@ -847,10 +860,10 @@ void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass,
}
-dart::Library& KernelReader::LookupLibrary(CanonicalName* library) {
+dart::Library& KernelReader::LookupLibrary(intptr_t library) {
dart::Library* handle = NULL;
if (!libraries_.Lookup(library, &handle)) {
- const dart::String& url = H.DartSymbol(library->name());
+ const dart::String& url = H.DartSymbol(H.CanonicalNameString(library));
handle =
&dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url));
if (handle->IsNull()) {
@@ -864,10 +877,10 @@ dart::Library& KernelReader::LookupLibrary(CanonicalName* library) {
}
-dart::Class& KernelReader::LookupClass(CanonicalName* klass) {
+dart::Class& KernelReader::LookupClass(intptr_t klass) {
dart::Class* handle = NULL;
if (!classes_.Lookup(klass, &handle)) {
- dart::Library& library = LookupLibrary(klass->parent());
+ dart::Library& library = LookupLibrary(H.CanonicalNameParent(klass));
const dart::String& name = H.DartClassName(klass);
handle = &dart::Class::Handle(Z, library.LookupClass(name));
if (handle->IsNull()) {

Powered by Google App Engine
This is Rietveld 408576698