| Index: runtime/vm/kernel_reader.cc
|
| diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc
|
| index 3fcbf5bc7ff1c6a6be3a48b1f2b3a415fae58537..b0b7bc810844f3e9452bb9dc90ca97642abec61a 100644
|
| --- a/runtime/vm/kernel_reader.cc
|
| +++ b/runtime/vm/kernel_reader.cc
|
| @@ -155,12 +155,8 @@ KernelReader::KernelReader(Program* program)
|
| }
|
|
|
| // 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), reader.buffer() + reader.offset(), end_offset);
|
| - }
|
| + TypedData& data =
|
| + reader.CopyDataToVMHeap(Z, reader.offset(), 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.
|
| @@ -282,11 +278,21 @@ void KernelReader::ReadLibrary(intptr_t kernel_offset) {
|
| field.SetFieldType(type);
|
| field_helper.SetJustRead(FieldHelper::kType);
|
| field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
|
| + intptr_t field_initializer_offset = builder_.ReaderOffset();
|
| field.set_has_initializer(builder_.PeekTag() == kSomething);
|
| - GenerateFieldAccessors(toplevel_class, field, &field_helper, field_offset);
|
| field_helper.ReadUntilExcluding(FieldHelper::kEnd);
|
| + TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
|
| + Z, field_offset, builder_.ReaderOffset());
|
| + field.set_kernel_data(kernel_data);
|
| + {
|
| + // GenerateFieldAccessors reads (some of) the initializer.
|
| + AlternativeReadingScope alt(builder_.reader_, field_initializer_offset);
|
| + GenerateFieldAccessors(toplevel_class, field, &field_helper,
|
| + field_offset);
|
| + }
|
| if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) {
|
| - library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset);
|
| + library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
|
| + &kernel_data);
|
| }
|
| fields_.Add(&field);
|
| library.AddObject(field, name);
|
| @@ -363,6 +369,8 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
|
| klass.set_token_pos(class_helper.position_);
|
| }
|
|
|
| + class_helper.ReadUntilIncluding(ClassHelper::kAnnotations);
|
| + intptr_t class_offset_after_annotations = builder_.ReaderOffset();
|
| class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters);
|
| intptr_t type_parameter_counts =
|
| builder_.ReadListLength(); // read type_parameters list length.
|
| @@ -419,11 +427,20 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
|
| type, field_helper.position_));
|
| field.set_kernel_offset(field_offset);
|
| field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
|
| + intptr_t field_initializer_offset = builder_.ReaderOffset();
|
| field.set_has_initializer(builder_.PeekTag() == kSomething);
|
| - GenerateFieldAccessors(klass, field, &field_helper, field_offset);
|
| field_helper.ReadUntilExcluding(FieldHelper::kEnd);
|
| + TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
|
| + Z, field_offset, builder_.ReaderOffset());
|
| + field.set_kernel_data(kernel_data);
|
| + {
|
| + // GenerateFieldAccessors reads (some of) the initializer.
|
| + AlternativeReadingScope alt(builder_.reader_, field_initializer_offset);
|
| + GenerateFieldAccessors(klass, field, &field_helper, field_offset);
|
| + }
|
| if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) {
|
| - library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset);
|
| + library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
|
| + &kernel_data);
|
| }
|
| fields_.Add(&field);
|
| }
|
| @@ -464,10 +481,13 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
|
| function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
|
| constructor_helper.SetJustRead(ConstructorHelper::kFunction);
|
| constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd);
|
| + TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
|
| + Z, constructor_offset, builder_.ReaderOffset());
|
| + function.set_kernel_data(kernel_data);
|
|
|
| if (FLAG_enable_mirrors && constructor_helper.annotation_count_ > 0) {
|
| library.AddFunctionMetadata(function, TokenPosition::kNoSource,
|
| - constructor_offset);
|
| + constructor_offset, &kernel_data);
|
| }
|
| }
|
| class_helper.SetJustRead(ClassHelper::kConstructors);
|
| @@ -486,8 +506,10 @@ dart::Class& KernelReader::ReadClass(const dart::Library& library,
|
| }
|
|
|
| if (FLAG_enable_mirrors && class_helper.annotation_count_ > 0) {
|
| + TypedData& header_data = builder_.reader_->CopyDataToVMHeap(
|
| + Z, class_offset, class_offset_after_annotations);
|
| library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource,
|
| - class_offset);
|
| + class_offset, &header_data);
|
| }
|
|
|
| class_helper.ReadUntilExcluding(ClassHelper::kEnd);
|
| @@ -636,12 +658,16 @@ void KernelReader::ReadProcedure(const dart::Library& library,
|
| H.DartProcedureName(procedure_helper.canonical_name_)))
|
| .IsNull());
|
| }
|
| +
|
| + procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
|
| + TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
|
| + Z, procedure_offset, builder_.ReaderOffset());
|
| + function.set_kernel_data(kernel_data);
|
| +
|
| if (FLAG_enable_mirrors && annotation_count > 0) {
|
| library.AddFunctionMetadata(function, TokenPosition::kNoSource,
|
| - procedure_offset);
|
| + procedure_offset, &kernel_data);
|
| }
|
| -
|
| - procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
|
| }
|
|
|
| void KernelReader::ReadAndSetupTypeParameters(
|
| @@ -728,16 +754,14 @@ Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) {
|
| dart::String& import_uri_string =
|
| import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld);
|
| script = Script::New(import_uri_string, uri_string,
|
| - String::Handle(String::null()), RawScript::kKernelTag);
|
| - script.set_kernel_data(program_->kernel_data());
|
| - script.set_kernel_data_size(program_->kernel_data_size());
|
| + builder_.GetSourceFor(index), RawScript::kKernelTag);
|
| script.set_kernel_script_index(index);
|
| 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);
|
|
|
| - script.set_line_starts(Array::Handle(Array::null()));
|
| + script.set_line_starts(builder_.GetLineStartsFor(index));
|
| script.set_debug_positions(Array::Handle(Array::null()));
|
| script.set_yield_positions(Array::Handle(Array::null()));
|
| }
|
| @@ -803,6 +827,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
|
| false, // is_native
|
| script_class, field_helper->position_));
|
| functions_.Add(&getter);
|
| + getter.set_kernel_data(TypedData::Handle(Z, field.kernel_data()));
|
| getter.set_end_token_pos(field_helper->end_position_);
|
| getter.set_kernel_offset(field_offset);
|
| getter.set_result_type(AbstractType::Handle(Z, field.type()));
|
| @@ -823,6 +848,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
|
| false, // is_native
|
| script_class, field_helper->position_));
|
| functions_.Add(&setter);
|
| + setter.set_kernel_data(TypedData::Handle(Z, field.kernel_data()));
|
| setter.set_end_token_pos(field_helper->end_position_);
|
| setter.set_kernel_offset(field_offset);
|
| setter.set_result_type(Object::void_type());
|
| @@ -920,17 +946,12 @@ bool KernelReader::FieldHasFunctionLiteralInitializer(const dart::Field& field,
|
| Thread::Current(), script.kernel_string_offsets(),
|
| script.kernel_string_data(), script.kernel_canonical_names());
|
|
|
| - kernel::StreamingFlowGraphBuilder* builder =
|
| - new kernel::StreamingFlowGraphBuilder(&translation_helper, zone,
|
| - script.kernel_data(),
|
| - script.kernel_data_size());
|
| -
|
| - kernel::FieldHelper field_helper(builder, field.kernel_offset());
|
| + StreamingFlowGraphBuilder builder(
|
| + &translation_helper, zone, field.kernel_offset(),
|
| + TypedData::Handle(zone, field.kernel_data()));
|
| + kernel::FieldHelper field_helper(&builder);
|
| field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
|
| - bool result = field_helper.FieldHasFunctionLiteralInitializer(start, end);
|
| -
|
| - delete builder;
|
| - return result;
|
| + return field_helper.FieldHasFunctionLiteralInitializer(start, end);
|
| }
|
|
|
| ParsedFunction* ParseStaticFieldInitializer(Zone* zone,
|
| @@ -951,6 +972,7 @@ ParsedFunction* ParseStaticFieldInitializer(Zone* zone,
|
| false, // is_external
|
| false, // is_native
|
| owner, TokenPosition::kNoSource));
|
| + initializer_fun.set_kernel_data(TypedData::Handle(zone, field.kernel_data()));
|
| initializer_fun.set_kernel_offset(field.kernel_offset());
|
| initializer_fun.set_result_type(AbstractType::Handle(zone, field.type()));
|
| initializer_fun.set_is_debuggable(false);
|
|
|