Chromium Code Reviews| Index: runtime/vm/kernel_reader.cc |
| diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc |
| index aa5ae4db2e902d55584f8b6d848238c642c0c4bb..99b8496f4d4f0baf094d434df7ac2eb5e9236dc9 100644 |
| --- a/runtime/vm/kernel_reader.cc |
| +++ b/runtime/vm/kernel_reader.cc |
| @@ -153,12 +153,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. |
| @@ -280,11 +276,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& body_data = builder_.reader_->CopyDataToVMHeap( |
| + Z, field_offset, builder_.ReaderOffset()); |
| + field.set_kernel_body(body_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, |
| + &body_data); |
| } |
| fields_.Add(&field); |
| library.AddObject(field, name); |
| @@ -361,6 +367,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. |
| @@ -417,11 +425,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& body_data = builder_.reader_->CopyDataToVMHeap( |
| + Z, field_offset, builder_.ReaderOffset()); |
| + field.set_kernel_body(body_data); |
|
Kevin Millikin (Google)
2017/08/09 12:08:52
kernel_body (and body_data) are not the correct na
jensj
2017/08/10 07:37:34
Done.
|
| + { |
| + // 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, |
| + &body_data); |
| } |
| fields_.Add(&field); |
| } |
| @@ -462,10 +479,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& body_data = builder_.reader_->CopyDataToVMHeap( |
| + Z, constructor_offset, builder_.ReaderOffset()); |
| + function.set_kernel_body(body_data); |
|
Kevin Millikin (Google)
2017/08/09 12:08:52
kernel_body (and body_data) are misleading names.
jensj
2017/08/10 07:37:34
Done.
|
| if (FLAG_enable_mirrors && constructor_helper.annotation_count_ > 0) { |
| library.AddFunctionMetadata(function, TokenPosition::kNoSource, |
| - constructor_offset); |
| + constructor_offset, &body_data); |
| } |
| } |
| class_helper.SetJustRead(ClassHelper::kConstructors); |
| @@ -484,8 +504,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); |
| @@ -634,12 +656,16 @@ void KernelReader::ReadProcedure(const dart::Library& library, |
| H.DartProcedureName(procedure_helper.canonical_name_))) |
| .IsNull()); |
| } |
| + |
| + procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd); |
| + TypedData& body_data = builder_.reader_->CopyDataToVMHeap( |
| + Z, procedure_offset, builder_.ReaderOffset()); |
| + function.set_kernel_body(body_data); |
| + |
| if (FLAG_enable_mirrors && annotation_count > 0) { |
| library.AddFunctionMetadata(function, TokenPosition::kNoSource, |
| - procedure_offset); |
| + procedure_offset, &body_data); |
| } |
| - |
| - procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd); |
| } |
| template <typename U> |
| @@ -715,16 +741,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())); |
| } |
| @@ -790,6 +814,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
| false, // is_native |
| script_class, field_helper->position_)); |
| functions_.Add(&getter); |
| + getter.set_kernel_body(TypedData::Handle(Z, field.kernel_body())); |
| getter.set_end_token_pos(field_helper->end_position_); |
| getter.set_kernel_offset(field_offset); |
| getter.set_result_type(AbstractType::Handle(Z, field.type())); |
| @@ -810,6 +835,7 @@ void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
| false, // is_native |
| script_class, field_helper->position_)); |
| functions_.Add(&setter); |
| + setter.set_kernel_body(TypedData::Handle(Z, field.kernel_body())); |
| setter.set_end_token_pos(field_helper->end_position_); |
| setter.set_kernel_offset(field_offset); |
| setter.set_result_type(Object::void_type()); |
| @@ -907,17 +933,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_body())); |
| + 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, |
| @@ -938,6 +959,7 @@ ParsedFunction* ParseStaticFieldInitializer(Zone* zone, |
| false, // is_external |
| false, // is_native |
| owner, TokenPosition::kNoSource)); |
| + initializer_fun.set_kernel_body(TypedData::Handle(zone, field.kernel_body())); |
| initializer_fun.set_kernel_offset(field.kernel_offset()); |
| initializer_fun.set_result_type(AbstractType::Handle(zone, field.type())); |
| initializer_fun.set_is_debuggable(false); |