| Index: runtime/vm/kernel_reader.cc
|
| diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc
|
| index d9c9d20912588965b18e5a1170c5cf5bac352108..0879f95ed2e713ab619368227eda0b8b03e121cf 100644
|
| --- a/runtime/vm/kernel_reader.cc
|
| +++ b/runtime/vm/kernel_reader.cc
|
| @@ -7,6 +7,7 @@
|
| #include <string.h>
|
|
|
| #include "vm/dart_api_impl.h"
|
| +#include "vm/kernel_binary.h"
|
| #include "vm/longjump.h"
|
| #include "vm/object_store.h"
|
| #include "vm/parser.h"
|
| @@ -118,24 +119,32 @@ KernelReader::KernelReader(Program* program)
|
| intptr_t source_file_count = program->source_table().size();
|
| scripts_ = Array::New(source_file_count, Heap::kOld);
|
|
|
| - // Copy the Kernel strings out of the binary and into the VM's heap. The size
|
| - // of the string data can be computed from the offset and size of the last
|
| - // string. This relies on the strings occurring in order in the program's
|
| - // string table.
|
| - List<String>& strings = program->string_table().strings();
|
| - String* last_string = strings[strings.length() - 1];
|
| - intptr_t size = last_string->offset() + last_string->size();
|
| - TypedData& data = TypedData::Handle(
|
| - Z, TypedData::New(kTypedDataUint8ArrayCid, size, Heap::kOld));
|
| - ASSERT(program->string_data_offset() >= 0);
|
| // We need at least one library to get access to the binary.
|
| ASSERT(program->libraries().length() > 0);
|
| + Library* library = program->libraries()[0];
|
| + Reader reader(library->kernel_data(), library->kernel_data_size());
|
| +
|
| + // Copy the Kernel string offsets out of the binary and into the VM's heap.
|
| + ASSERT(program->string_table_offset() >= 0);
|
| + reader.set_offset(program->string_table_offset());
|
| + intptr_t count = reader.ReadUInt() + 1;
|
| + TypedData& offsets = TypedData::Handle(
|
| + Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld));
|
| + offsets.SetUint32(0, 0);
|
| + intptr_t end_offset = 0;
|
| + for (intptr_t i = 1; i < count; ++i) {
|
| + end_offset = reader.ReadUInt();
|
| + offsets.SetUint32(i << 2, end_offset);
|
| + }
|
| +
|
| + // Copy the string data out of the binary and into the VM's heap.
|
| + TypedData& data = TypedData::Handle(
|
| + Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld));
|
| {
|
| NoSafepointScope no_safepoint;
|
| - memmove(data.DataAddr(0), program->libraries()[0]->kernel_data() +
|
| - program->string_data_offset(),
|
| - size);
|
| + memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset);
|
| }
|
| + H.SetStringOffsets(offsets);
|
| H.SetStringData(data);
|
| }
|
|
|
| @@ -487,12 +496,12 @@ void KernelReader::ReadProcedure(const dart::Library& library,
|
| ConstructorInvocation::Cast(annotation);
|
| CanonicalName* annotation_class = H.EnclosingName(invocation->target());
|
| ASSERT(H.IsClass(annotation_class));
|
| - String* class_name = annotation_class->name();
|
| + intptr_t class_name_index = annotation_class->name();
|
| // Just compare by name, do not generate the annotation class.
|
| - if (!H.StringEquals(class_name, "ExternalName")) continue;
|
| + if (!H.StringEquals(class_name_index, "ExternalName")) continue;
|
| ASSERT(H.IsLibrary(annotation_class->parent()));
|
| - String* library_name = annotation_class->parent()->name();
|
| - if (!H.StringEquals(library_name, "dart:_internal")) continue;
|
| + intptr_t library_name_index = annotation_class->parent()->name();
|
| + if (!H.StringEquals(library_name_index, "dart:_internal")) continue;
|
|
|
| is_external = false;
|
| ASSERT(invocation->arguments()->positional().length() == 1 &&
|
| @@ -607,7 +616,7 @@ static RawArray* AsSortedDuplicateFreeArray(
|
| }
|
| }
|
|
|
| -Script& KernelReader::ScriptAt(intptr_t index, String* import_uri) {
|
| +Script& KernelReader::ScriptAt(intptr_t index, intptr_t import_uri) {
|
| Script& script = Script::ZoneHandle(Z);
|
| script ^= scripts_.At(index);
|
| if (script.IsNull()) {
|
| @@ -616,14 +625,15 @@ Script& KernelReader::ScriptAt(intptr_t index, String* import_uri) {
|
| intptr_t uri_size = program_->source_table().UriSizeFor(index);
|
| dart::String& uri_string = H.DartString(uri_buffer, uri_size, Heap::kOld);
|
| dart::String& import_uri_string =
|
| - import_uri == NULL ? uri_string : H.DartString(import_uri, Heap::kOld);
|
| + import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld);
|
| uint8_t* source_buffer = program_->source_table().SourceCodeFor(index);
|
| intptr_t source_size = program_->source_table().SourceCodeSizeFor(index);
|
| dart::String& source_code =
|
| H.DartString(source_buffer, source_size, Heap::kOld);
|
| script = Script::New(import_uri_string, uri_string, source_code,
|
| RawScript::kKernelTag);
|
| - script.set_kernel_strings(H.string_data());
|
| + script.set_kernel_string_offsets(H.string_offsets());
|
| + script.set_kernel_string_data(H.string_data());
|
| scripts_.SetAt(index, script);
|
|
|
| // Create line_starts array for the script.
|
|
|