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

Side by Side Diff: runtime/vm/kernel_reader.cc

Issue 2852943003: Move the Kernel string offsets into the VM's heap. (Closed)
Patch Set: Incorporate review comments. Created 3 years, 7 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 unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel_reader.h ('k') | runtime/vm/kernel_to_il.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/kernel_binary.h"
10 #include "vm/longjump.h" 11 #include "vm/longjump.h"
11 #include "vm/object_store.h" 12 #include "vm/object_store.h"
12 #include "vm/parser.h" 13 #include "vm/parser.h"
13 #include "vm/symbols.h" 14 #include "vm/symbols.h"
14 15
15 #if !defined(DART_PRECOMPILED_RUNTIME) 16 #if !defined(DART_PRECOMPILED_RUNTIME)
16 namespace dart { 17 namespace dart {
17 namespace kernel { 18 namespace kernel {
18 19
19 #define Z (zone_) 20 #define Z (zone_)
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 zone_(thread_->zone()), 112 zone_(thread_->zone()),
112 isolate_(thread_->isolate()), 113 isolate_(thread_->isolate()),
113 scripts_(Array::ZoneHandle(zone_)), 114 scripts_(Array::ZoneHandle(zone_)),
114 translation_helper_(this, thread_), 115 translation_helper_(this, thread_),
115 type_translator_(&translation_helper_, 116 type_translator_(&translation_helper_,
116 &active_class_, 117 &active_class_,
117 /*finalize=*/false) { 118 /*finalize=*/false) {
118 intptr_t source_file_count = program->source_table().size(); 119 intptr_t source_file_count = program->source_table().size();
119 scripts_ = Array::New(source_file_count, Heap::kOld); 120 scripts_ = Array::New(source_file_count, Heap::kOld);
120 121
121 // Copy the Kernel strings out of the binary and into the VM's heap. The size
122 // of the string data can be computed from the offset and size of the last
123 // string. This relies on the strings occurring in order in the program's
124 // string table.
125 List<String>& strings = program->string_table().strings();
126 String* last_string = strings[strings.length() - 1];
127 intptr_t size = last_string->offset() + last_string->size();
128 TypedData& data = TypedData::Handle(
129 Z, TypedData::New(kTypedDataUint8ArrayCid, size, Heap::kOld));
130 ASSERT(program->string_data_offset() >= 0);
131 // We need at least one library to get access to the binary. 122 // We need at least one library to get access to the binary.
132 ASSERT(program->libraries().length() > 0); 123 ASSERT(program->libraries().length() > 0);
124 Library* library = program->libraries()[0];
125 Reader reader(library->kernel_data(), library->kernel_data_size());
126
127 // Copy the Kernel string offsets out of the binary and into the VM's heap.
128 ASSERT(program->string_table_offset() >= 0);
129 reader.set_offset(program->string_table_offset());
130 intptr_t count = reader.ReadUInt() + 1;
131 TypedData& offsets = TypedData::Handle(
132 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld));
133 offsets.SetUint32(0, 0);
134 intptr_t end_offset = 0;
135 for (intptr_t i = 1; i < count; ++i) {
136 end_offset = reader.ReadUInt();
137 offsets.SetUint32(i << 2, end_offset);
138 }
139
140 // Copy the string data out of the binary and into the VM's heap.
141 TypedData& data = TypedData::Handle(
142 Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld));
133 { 143 {
134 NoSafepointScope no_safepoint; 144 NoSafepointScope no_safepoint;
135 memmove(data.DataAddr(0), program->libraries()[0]->kernel_data() + 145 memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset);
136 program->string_data_offset(),
137 size);
138 } 146 }
147 H.SetStringOffsets(offsets);
139 H.SetStringData(data); 148 H.SetStringData(data);
140 } 149 }
141 150
142 151
143 Object& KernelReader::ReadProgram() { 152 Object& KernelReader::ReadProgram() {
144 LongJumpScope jump; 153 LongJumpScope jump;
145 if (setjmp(*jump.Set()) == 0) { 154 if (setjmp(*jump.Set()) == 0) {
146 intptr_t length = program_->libraries().length(); 155 intptr_t length = program_->libraries().length();
147 for (intptr_t i = 0; i < length; i++) { 156 for (intptr_t i = 0; i < length; i++) {
148 Library* kernel_library = program_->libraries()[i]; 157 Library* kernel_library = program_->libraries()[i];
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 // Maybe it has a native implementation, which is not external as far as 489 // Maybe it has a native implementation, which is not external as far as
481 // the VM is concerned because it does have an implementation. Check for 490 // the VM is concerned because it does have an implementation. Check for
482 // an ExternalName annotation and extract the string from it. 491 // an ExternalName annotation and extract the string from it.
483 for (int i = 0; i < kernel_procedure->annotations().length(); ++i) { 492 for (int i = 0; i < kernel_procedure->annotations().length(); ++i) {
484 Expression* annotation = kernel_procedure->annotations()[i]; 493 Expression* annotation = kernel_procedure->annotations()[i];
485 if (!annotation->IsConstructorInvocation()) continue; 494 if (!annotation->IsConstructorInvocation()) continue;
486 ConstructorInvocation* invocation = 495 ConstructorInvocation* invocation =
487 ConstructorInvocation::Cast(annotation); 496 ConstructorInvocation::Cast(annotation);
488 CanonicalName* annotation_class = H.EnclosingName(invocation->target()); 497 CanonicalName* annotation_class = H.EnclosingName(invocation->target());
489 ASSERT(H.IsClass(annotation_class)); 498 ASSERT(H.IsClass(annotation_class));
490 String* class_name = annotation_class->name(); 499 intptr_t class_name_index = annotation_class->name();
491 // Just compare by name, do not generate the annotation class. 500 // Just compare by name, do not generate the annotation class.
492 if (!H.StringEquals(class_name, "ExternalName")) continue; 501 if (!H.StringEquals(class_name_index, "ExternalName")) continue;
493 ASSERT(H.IsLibrary(annotation_class->parent())); 502 ASSERT(H.IsLibrary(annotation_class->parent()));
494 String* library_name = annotation_class->parent()->name(); 503 intptr_t library_name_index = annotation_class->parent()->name();
495 if (!H.StringEquals(library_name, "dart:_internal")) continue; 504 if (!H.StringEquals(library_name_index, "dart:_internal")) continue;
496 505
497 is_external = false; 506 is_external = false;
498 ASSERT(invocation->arguments()->positional().length() == 1 && 507 ASSERT(invocation->arguments()->positional().length() == 1 &&
499 invocation->arguments()->named().length() == 0); 508 invocation->arguments()->named().length() == 0);
500 StringLiteral* literal = 509 StringLiteral* literal =
501 StringLiteral::Cast(invocation->arguments()->positional()[0]); 510 StringLiteral::Cast(invocation->arguments()->positional()[0]);
502 native_name = &H.DartSymbol(literal->value()); 511 native_name = &H.DartSymbol(literal->value());
503 break; 512 break;
504 } 513 }
505 } 514 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 for (intptr_t i = 0; i <= last; ++i) { 609 for (intptr_t i = 0; i <= last; ++i) {
601 smi_value = Smi::New(source->At(i)); 610 smi_value = Smi::New(source->At(i));
602 array_object.SetAt(i, smi_value); 611 array_object.SetAt(i, smi_value);
603 } 612 }
604 return array_object.raw(); 613 return array_object.raw();
605 } else { 614 } else {
606 return Array::New(0); 615 return Array::New(0);
607 } 616 }
608 } 617 }
609 618
610 Script& KernelReader::ScriptAt(intptr_t index, String* import_uri) { 619 Script& KernelReader::ScriptAt(intptr_t index, intptr_t import_uri) {
611 Script& script = Script::ZoneHandle(Z); 620 Script& script = Script::ZoneHandle(Z);
612 script ^= scripts_.At(index); 621 script ^= scripts_.At(index);
613 if (script.IsNull()) { 622 if (script.IsNull()) {
614 // Create script with correct uri(s). 623 // Create script with correct uri(s).
615 uint8_t* uri_buffer = program_->source_table().UriFor(index); 624 uint8_t* uri_buffer = program_->source_table().UriFor(index);
616 intptr_t uri_size = program_->source_table().UriSizeFor(index); 625 intptr_t uri_size = program_->source_table().UriSizeFor(index);
617 dart::String& uri_string = H.DartString(uri_buffer, uri_size, Heap::kOld); 626 dart::String& uri_string = H.DartString(uri_buffer, uri_size, Heap::kOld);
618 dart::String& import_uri_string = 627 dart::String& import_uri_string =
619 import_uri == NULL ? uri_string : H.DartString(import_uri, Heap::kOld); 628 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld);
620 uint8_t* source_buffer = program_->source_table().SourceCodeFor(index); 629 uint8_t* source_buffer = program_->source_table().SourceCodeFor(index);
621 intptr_t source_size = program_->source_table().SourceCodeSizeFor(index); 630 intptr_t source_size = program_->source_table().SourceCodeSizeFor(index);
622 dart::String& source_code = 631 dart::String& source_code =
623 H.DartString(source_buffer, source_size, Heap::kOld); 632 H.DartString(source_buffer, source_size, Heap::kOld);
624 script = Script::New(import_uri_string, uri_string, source_code, 633 script = Script::New(import_uri_string, uri_string, source_code,
625 RawScript::kKernelTag); 634 RawScript::kKernelTag);
626 script.set_kernel_strings(H.string_data()); 635 script.set_kernel_string_offsets(H.string_offsets());
636 script.set_kernel_string_data(H.string_data());
627 scripts_.SetAt(index, script); 637 scripts_.SetAt(index, script);
628 638
629 // Create line_starts array for the script. 639 // Create line_starts array for the script.
630 intptr_t* line_starts = program_->source_table().LineStartsFor(index); 640 intptr_t* line_starts = program_->source_table().LineStartsFor(index);
631 intptr_t line_count = program_->source_table().LineCountFor(index); 641 intptr_t line_count = program_->source_table().LineCountFor(index);
632 Array& array_object = Array::Handle(Z, Array::New(line_count, Heap::kOld)); 642 Array& array_object = Array::Handle(Z, Array::New(line_count, Heap::kOld));
633 Smi& value = Smi::Handle(Z); 643 Smi& value = Smi::Handle(Z);
634 for (intptr_t i = 0; i < line_count; ++i) { 644 for (intptr_t i = 0; i < line_count; ++i) {
635 value = Smi::New(line_starts[i]); 645 value = Smi::New(line_starts[i]);
636 array_object.SetAt(i, value); 646 array_object.SetAt(i, value);
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 initializer_fun.set_is_debuggable(false); 927 initializer_fun.set_is_debuggable(false);
918 initializer_fun.set_is_reflectable(false); 928 initializer_fun.set_is_reflectable(false);
919 initializer_fun.set_is_inlinable(false); 929 initializer_fun.set_is_inlinable(false);
920 return new (zone) ParsedFunction(thread, initializer_fun); 930 return new (zone) ParsedFunction(thread, initializer_fun);
921 } 931 }
922 932
923 933
924 } // namespace kernel 934 } // namespace kernel
925 } // namespace dart 935 } // namespace dart
926 #endif // !defined(DART_PRECOMPILED_RUNTIME) 936 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_reader.h ('k') | runtime/vm/kernel_to_il.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698