5#if !defined(DART_PRECOMPILED_RUNTIME)
21KernelLineStartsReader::KernelLineStartsReader(
24 : line_starts_data_(line_starts_data) {
26 if (
type == kUint16ArrayElement) {
27 helper_ =
new KernelUint16LineStartsHelper();
28 }
else if (
type == kUint32ArrayElement) {
29 helper_ =
new KernelUint32LineStartsHelper();
35uint32_t KernelLineStartsReader::MaxPosition()
const {
36 const intptr_t line_count = line_starts_data_.Length();
37 if (line_count == 0) {
40 return helper_->At(line_starts_data_, line_count - 1);
43bool KernelLineStartsReader::LocationForPosition(intptr_t position,
45 intptr_t* col)
const {
46 const intptr_t line_count = line_starts_data_.Length();
47 if (position < 0 ||
static_cast<uint32_t
>(position) > MaxPosition() ||
53 intptr_t hi = line_count;
55 const intptr_t mid = lo + (hi - lo) / 2;
56 const intptr_t mid_position = helper_->At(line_starts_data_, mid);
57 if (mid_position > position) {
65 *col = position - helper_->At(line_starts_data_, lo) + 1;
71bool KernelLineStartsReader::TokenRangeAtLine(
73 TokenPosition* first_token_index,
74 TokenPosition* last_token_index)
const {
75 const intptr_t line_count = line_starts_data_.Length();
76 if (line_number <= 0 || line_number > line_count) {
80 helper_->At(line_starts_data_, line_number - 1));
81 if (line_number == line_count) {
82 *last_token_index = *first_token_index;
85 helper_->At(line_starts_data_, line_number) - 1);
90uint32_t KernelLineStartsReader::KernelUint16LineStartsHelper::At(
92 intptr_t index)
const {
93 return data.GetUint16(index << 1);
96uint32_t KernelLineStartsReader::KernelUint32LineStartsHelper::At(
98 intptr_t index)
const {
99 return data.GetUint32(index << 2);
109 intptr_t data_program_offset,
110 intptr_t initial_script_index,
111 intptr_t record_for_script_id,
114 current_script_id_(initial_script_index),
115 record_for_script_id_(record_for_script_id),
116 record_token_positions_into_(record_token_positions_into) {}
118 void CollectTokenPositions(intptr_t kernel_offset);
125 intptr_t current_script_id_;
126 intptr_t record_for_script_id_;
132void KernelTokenPositionCollector::CollectTokenPositions(
133 intptr_t kernel_offset) {
134 SetOffset(kernel_offset);
136 const Tag tag = PeekTag();
137 if (tag == kProcedure) {
140 }
else if (tag == kConstructor) {
143 }
else if (tag == kFunctionNode) {
146 }
else if (tag == kField) {
149 }
else if (tag == kClass) {
153 ReportUnexpectedTag(
"a class or a member", tag);
158void KernelTokenPositionCollector::RecordTokenPosition(
TokenPosition position) {
159 if (record_for_script_id_ == current_script_id_ &&
160 record_token_positions_into_ !=
nullptr && position.
IsReal()) {
161 record_token_positions_into_->Add(position.
Serialize());
178 intptr_t size =
source->length();
180 return Object::empty_array().ptr();
186 for (intptr_t current = 1; current < size; ++current) {
188 (*source)[++last] =
source->At(current);
191 Array& array_object = Array::Handle();
192 array_object = Array::New(last + 1, Heap::kOld);
193 Smi& smi_value = Smi::Handle();
194 for (intptr_t i = 0; i <= last; ++i) {
195 smi_value = Smi::New(
source->At(i));
196 array_object.
SetAt(i, smi_value);
198 return array_object.
ptr();
204 intptr_t kernel_offset,
205 intptr_t data_kernel_offset,
209 if (kernel_data.
IsNull()) {
214 zone, helper, script, kernel_data, data_kernel_offset,
215 script.kernel_script_index(), script.kernel_script_index(),
223void Script::CollectTokenPositionsFor()
const {
224 Thread* thread = Thread::Current();
227 const auto& kernel_info =
228 KernelProgramInfo::Handle(zone, kernel_program_info());
237 zone, isolate_group->object_store()->libraries());
238 Library& lib = Library::Handle(zone);
239 Object& entry = Object::Handle(zone);
240 Script& entry_script = Script::Handle(zone);
241 auto& data = TypedDataView::Handle(zone);
243 auto& interesting_script = *
this;
245 auto& temp_array = Array::Handle(zone);
246 auto& temp_field = Field::Handle(zone);
247 auto& temp_function = Function::Handle(zone);
248 for (intptr_t i = 0; i < libs.Length(); i++) {
254 data = TypedDataView::null();
255 if (entry.IsClass()) {
256 const Class& klass = Class::Cast(entry);
257 if (klass.
script() == interesting_script.ptr()) {
262 temp_array = klass.
fields();
263 for (intptr_t i = 0; i < temp_array.Length(); ++i) {
264 temp_field ^= temp_array.At(i);
265 if (temp_field.kernel_offset() <= 0) {
269 entry_script = temp_field.Script();
270 if (entry_script.
ptr() != interesting_script.ptr()) {
273 data = temp_field.KernelLibrary();
274 CollectKernelLibraryTokenPositions(data, interesting_script,
275 temp_field.kernel_offset(),
276 temp_field.KernelLibraryOffset(),
277 zone, &helper, &token_positions);
280 for (intptr_t i = 0; i < temp_array.Length(); ++i) {
281 temp_function ^= temp_array.At(i);
282 entry_script = temp_function.script();
283 if (entry_script.
ptr() != interesting_script.ptr()) {
286 data = temp_function.KernelLibrary();
287 CollectKernelLibraryTokenPositions(
288 data, interesting_script, temp_function.kernel_offset(),
289 temp_function.KernelLibraryOffset(), zone, &helper,
298 ASSERT(library_kernel_offset > 0);
301 entry_script = klass.
script();
302 if (entry_script.
ptr() != interesting_script.ptr()) {
305 CollectKernelLibraryTokenPositions(
306 data, interesting_script, class_offset, library_kernel_offset,
307 zone, &helper, &token_positions);
309 }
else if (entry.IsFunction()) {
310 temp_function ^= entry.
ptr();
311 entry_script = temp_function.script();
312 if (entry_script.
ptr() != interesting_script.ptr()) {
315 data = temp_function.KernelLibrary();
316 CollectKernelLibraryTokenPositions(data, interesting_script,
317 temp_function.kernel_offset(),
318 temp_function.KernelLibraryOffset(),
319 zone, &helper, &token_positions);
320 }
else if (entry.IsField()) {
321 const Field& field = Field::Cast(entry);
326 entry_script = field.
Script();
327 if (entry_script.
ptr() != interesting_script.ptr()) {
331 CollectKernelLibraryTokenPositions(
338 Script& script = Script::Handle(zone, interesting_script.ptr());
339 Array& array_object = Array::Handle(zone);
340 array_object = kernel::AsSortedDuplicateFreeArray(&token_positions);
341 script.set_debug_positions(array_object);
344#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
345ArrayPtr Script::CollectConstConstructorCoverageFrom()
const {
346 Thread* thread = Thread::Current();
350 const auto& interesting_script = *
this;
352 const auto& kernel_info =
353 KernelProgramInfo::Handle(zone, kernel_program_info());
357 TypedDataView::Handle(zone, interesting_script.constant_coverage());
362 const intptr_t constant_coverage_constructors =
364 const Array& constructors =
365 Array::Handle(Array::New(constant_coverage_constructors));
366 for (intptr_t i = 0; i < constant_coverage_constructors; ++i) {
368 Class& klass = Class::ZoneHandle(
375 return constructors.
ptr();
381ObjectPtr EvaluateStaticConstFieldInitializer(
const Field& field) {
385 if (setjmp(*jump.
Set()) == 0) {
386 Thread* thread = Thread::Current();
388 TranslationHelper helper(thread);
389 auto& kernel_program_info =
391 helper.InitFromKernelProgramInfo(kernel_program_info);
393 const Class& owner_class = Class::Handle(zone, field.
Owner());
394 ActiveClass active_class;
395 ActiveClassScope active_class_scope(&active_class, &owner_class);
397 KernelReaderHelper kernel_reader(
398 zone, &helper, TypedDataView::Handle(zone, field.
KernelLibrary()),
401 ConstantReader constant_reader(&kernel_reader, &active_class);
403 FieldHelper field_helper(&kernel_reader);
404 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
405 ASSERT(field_helper.IsConst());
407 return constant_reader.ReadConstantInitializer();
409 return Thread::Current()->StealStickyError();
413class MetadataEvaluator :
public KernelReaderHelper {
415 MetadataEvaluator(Zone* zone,
416 TranslationHelper* translation_helper,
417 const TypedDataView& data,
418 intptr_t data_program_offset,
419 ActiveClass* active_class)
420 : KernelReaderHelper(zone, translation_helper,
data, data_program_offset),
421 constant_reader_(this, active_class) {}
423 ObjectPtr EvaluateMetadata(intptr_t kernel_offset,
424 bool is_annotations_offset) {
425 SetOffset(kernel_offset);
430 if (!is_annotations_offset) {
431 const Tag tag = PeekTag();
434 ClassHelper class_helper(
this);
435 class_helper.ReadUntilExcluding(ClassHelper::kAnnotations);
436 }
else if (tag == kProcedure) {
437 ProcedureHelper procedure_helper(
this);
438 procedure_helper.ReadUntilExcluding(ProcedureHelper::kAnnotations);
439 }
else if (tag == kField) {
440 FieldHelper field_helper(
this);
441 field_helper.ReadUntilExcluding(FieldHelper::kAnnotations);
442 }
else if (tag == kConstructor) {
443 ConstructorHelper constructor_helper(
this);
444 constructor_helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
445 }
else if (tag == kFunctionDeclaration) {
448 VariableDeclarationHelper variable_declaration_helper(
this);
449 variable_declaration_helper.ReadUntilExcluding(
450 VariableDeclarationHelper::kAnnotations);
452 FATAL(
"No support for metadata on this type of kernel node: %" Pd32
458 return constant_reader_.ReadAnnotations();
462 ConstantReader constant_reader_;
467ObjectPtr EvaluateMetadata(
const Library& library,
468 intptr_t kernel_offset,
469 bool is_annotations_offset) {
471 if (setjmp(*jump.Set()) == 0) {
472 Thread* thread = Thread::Current();
473 Zone* zone = thread->zone();
474 TranslationHelper helper(thread);
475 const auto& kernel_info =
476 KernelProgramInfo::Handle(zone, library.kernel_program_info());
477 helper.InitFromKernelProgramInfo(kernel_info);
479 const Class& owner_class = Class::Handle(zone, library.toplevel_class());
480 ActiveClass active_class;
481 ActiveClassScope active_class_scope(&active_class, &owner_class);
483 MetadataEvaluator metadata_evaluator(
484 zone, &helper, TypedDataView::Handle(zone, library.KernelLibrary()),
485 library.KernelLibraryOffset(), &active_class);
487 return metadata_evaluator.EvaluateMetadata(kernel_offset,
488 is_annotations_offset);
491 return Thread::Current()->StealStickyError();
495class ParameterDescriptorBuilder :
public KernelReaderHelper {
497 ParameterDescriptorBuilder(TranslationHelper* translation_helper,
499 const TypedDataView& data,
500 intptr_t data_program_offset,
501 ActiveClass* active_class)
502 : KernelReaderHelper(zone, translation_helper,
data, data_program_offset),
503 constant_reader_(this, active_class) {}
505 ObjectPtr BuildParameterDescriptor(
const Function&
function);
508 ConstantReader constant_reader_;
513ObjectPtr ParameterDescriptorBuilder::BuildParameterDescriptor(
515 SetOffset(
function.kernel_offset());
516 ReadUntilFunctionNode();
517 FunctionNodeHelper function_node_helper(
this);
518 function_node_helper.ReadUntilExcluding(
519 FunctionNodeHelper::kPositionalParameters);
520 intptr_t param_count = function_node_helper.total_parameter_count_;
521 intptr_t positional_count = ReadListLength();
522 intptr_t named_parameter_count = param_count - positional_count;
524 const Array& param_descriptor = Array::Handle(
525 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld));
526 for (intptr_t i = 0; i < param_count; ++i) {
527 const intptr_t entry_start = i * Parser::kParameterEntrySize;
529 if (i == positional_count) {
530 intptr_t named_parameter_count_check =
532 ASSERT(named_parameter_count_check == named_parameter_count);
536 intptr_t param_kernel_offset = reader_.offset();
537 VariableDeclarationHelper helper(
this);
538 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
539 param_descriptor.SetAt(entry_start + Parser::kParameterIsFinalOffset,
540 helper.IsFinal() ? Bool::True() : Bool::
False());
543 if ((tag == kSomething) && !
function.is_abstract()) {
545 Instance& constant = Instance::ZoneHandle(
546 zone_, constant_reader_.ReadConstantExpression());
547 param_descriptor.SetAt(entry_start + Parser::kParameterDefaultValueOffset,
550 if (tag == kSomething) {
553 param_descriptor.SetAt(entry_start + Parser::kParameterDefaultValueOffset,
554 Object::null_instance());
557 if (FLAG_enable_mirrors && (helper.annotation_count_ > 0)) {
558 AlternativeReadingScope alt(&reader_, param_kernel_offset);
559 VariableDeclarationHelper helper(
this);
560 helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
562 Object::ZoneHandle(zone_, constant_reader_.ReadAnnotations());
563 param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset,
566 param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset,
567 Object::null_instance());
570 return param_descriptor.ptr();
573ObjectPtr BuildParameterDescriptor(
const Function&
function) {
575 if (setjmp(*jump.Set()) == 0) {
576 Thread* thread = Thread::Current();
577 Zone* zone = thread->zone();
579 const auto& kernel_info =
580 KernelProgramInfo::Handle(zone,
function.KernelProgramInfo());
582 TranslationHelper helper(thread);
583 helper.InitFromKernelProgramInfo(kernel_info);
585 const Class& owner_class = Class::Handle(zone,
function.Owner());
586 ActiveClass active_class;
587 ActiveClassScope active_class_scope(&active_class, &owner_class);
589 ParameterDescriptorBuilder
builder(
590 &helper, zone, TypedDataView::Handle(zone,
function.KernelLibrary()),
591 function.KernelLibraryOffset(), &active_class);
595 return Thread::Current()->StealStickyError();
599void ReadParameterCovariance(
const Function&
function,
600 BitVector* is_covariant,
601 BitVector* is_generic_covariant_impl) {
602 Thread* thread = Thread::Current();
603 Zone* zone = thread->zone();
605 const intptr_t num_params =
function.NumParameters();
606 ASSERT(is_covariant->length() == num_params);
607 ASSERT(is_generic_covariant_impl->length() == num_params);
609 const auto& kernel_info =
610 KernelProgramInfo::Handle(zone,
function.KernelProgramInfo());
612 TranslationHelper translation_helper(thread);
613 translation_helper.InitFromKernelProgramInfo(kernel_info);
615 KernelReaderHelper reader_helper(
616 zone, &translation_helper,
617 TypedDataView::Handle(zone,
function.KernelLibrary()),
620 reader_helper.SetOffset(
function.kernel_offset());
621 reader_helper.ReadUntilFunctionNode();
623 FunctionNodeHelper function_node_helper(&reader_helper);
624 function_node_helper.ReadUntilExcluding(
625 FunctionNodeHelper::kPositionalParameters);
628 const intptr_t num_positional_params = reader_helper.ReadListLength();
629 intptr_t param_index =
function.NumImplicitParameters();
630 for (intptr_t i = 0; i < num_positional_params; ++i, ++param_index) {
631 VariableDeclarationHelper helper(&reader_helper);
632 helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
634 if (helper.IsCovariant()) {
635 is_covariant->Add(param_index);
637 if (helper.IsGenericCovariantImpl()) {
638 is_generic_covariant_impl->Add(param_index);
643 const intptr_t num_named_params = reader_helper.ReadListLength();
644 for (intptr_t i = 0; i < num_named_params; ++i, ++param_index) {
645 VariableDeclarationHelper helper(&reader_helper);
646 helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
648 if (helper.IsCovariant()) {
649 is_covariant->Add(param_index);
651 if (helper.IsGenericCovariantImpl()) {
652 is_generic_covariant_impl->Add(param_index);
658 Zone* zone = Thread::Current()->zone();
662 if (
function.IsClosureFunction())
return false;
671 if (
function.IsRecordFieldGetter()) {
680 if (
function.IsInvokeFieldDispatcher()) {
691 if (
function.MaxNumberOfParametersInRegisters(zone) > 0) {
697 if (
function.IsImplicitGetterFunction()) {
705 if (
function.IsImplicitSetterFunction()) {
706 const auto& field = Field::Handle(zone,
function.accessor_field());
710 const auto& type_params =
711 TypeParameters::Handle(zone,
function.type_parameters());
712 if (!type_params.IsNull()) {
713 auto& bound = AbstractType::Handle(zone);
714 for (intptr_t i = 0, n = type_params.Length(); i < n; ++i) {
715 bound = type_params.BoundAt(i);
716 if (!bound.IsTopTypeForSubtyping() &&
717 !type_params.IsGenericCovariantImplAt(i)) {
723 const intptr_t num_params =
function.NumParameters();
724 BitVector is_covariant(zone, num_params);
725 BitVector is_generic_covariant_impl(zone, num_params);
726 ReadParameterCovariance(
function, &is_covariant, &is_generic_covariant_impl);
728 auto&
type = AbstractType::Handle(zone);
729 for (intptr_t i =
function.NumImplicitParameters(); i < num_params; ++i) {
731 if (!
type.IsTopTypeForSubtyping() &&
744 intptr_t kernel_data_program_offset,
745 intptr_t kernel_offset) {
747 translation_helper.InitFromKernelProgramInfo(kernel_program_info);
749 kernel_data_program_offset);
753 procedure_attributes_metadata_helper.GetProcedureAttributes(
760 const auto& kernel_program_info =
761 KernelProgramInfo::Handle(zone,
function.KernelProgramInfo());
762 return ProcedureAttributesOf(
763 zone, kernel_program_info,
764 TypedDataView::Handle(zone,
function.KernelLibrary()),
768ProcedureAttributesMetadata ProcedureAttributesOf(
const Field& field,
770 const auto& kernel_program_info =
771 KernelProgramInfo::Handle(zone, field.KernelProgramInfo());
772 return ProcedureAttributesOf(
773 zone, kernel_program_info,
774 TypedDataView::Handle(zone, field.KernelLibrary()),
775 field.KernelLibraryOffset(), field.kernel_offset());
778static UnboxingInfoMetadata* UnboxingInfoMetadataOf(
780 const KernelProgramInfo& kernel_program_info,
781 const TypedDataView& kernel_data,
782 intptr_t kernel_data_program_offset,
783 intptr_t kernel_offset) {
784 TranslationHelper translation_helper(Thread::Current());
785 translation_helper.InitFromKernelProgramInfo(kernel_program_info);
786 KernelReaderHelper reader_helper(zone, &translation_helper, kernel_data,
787 kernel_data_program_offset);
788 UnboxingInfoMetadataHelper unboxing_info_metadata_helper(&reader_helper);
789 return unboxing_info_metadata_helper.GetUnboxingInfoMetadata(kernel_offset);
792UnboxingInfoMetadata* UnboxingInfoMetadataOf(
const Function&
function,
794 const auto& kernel_program_info =
795 KernelProgramInfo::Handle(zone,
function.KernelProgramInfo());
796 return UnboxingInfoMetadataOf(
797 zone, kernel_program_info,
798 TypedDataView::Handle(zone,
function.KernelLibrary()),
802TableSelectorMetadata* TableSelectorMetadataForProgram(
803 const KernelProgramInfo&
info,
805 TranslationHelper translation_helper(Thread::Current());
806 translation_helper.InitFromKernelProgramInfo(
info);
807 const auto&
data = TypedDataView::Handle(zone,
info.metadata_payloads());
808 KernelReaderHelper reader_helper(zone, &translation_helper, data, 0);
809 TableSelectorMetadataHelper table_selector_metadata_helper(&reader_helper);
810 return table_selector_metadata_helper.GetTableSelectorMetadata(zone);
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
void SetAt(intptr_t index, const Object &value) const
bool Contains(intptr_t i) const
intptr_t kernel_offset() const
TokenPosition token_pos() const
TokenPosition end_token_pos() const
bool is_finalized() const
ArrayPtr current_functions() const
intptr_t kernel_offset() const
intptr_t KernelLibraryOffset() const
bool is_covariant() const
TypedDataViewPtr KernelLibrary() const
bool is_generic_covariant_impl() const
KernelProgramInfoPtr KernelProgramInfo() const
void EnsureTopLevelClassIsFinalized() const
TypedDataViewPtr KernelLibrary() const
intptr_t KernelLibraryOffset() const
IsolateGroup * isolate_group() const
int32_t Serialize() const
static TokenPosition Deserialize(int32_t value)
void ReadUntilExcluding(Field field)
void ReadUntilExcluding(Field field)
void ReadUntilExcluding(Field field)
void ReadUntilExcluding(Field field)
intptr_t ReadListLength()
NameIndex ReadCanonicalNameReference()
KernelTokenPositionCollector(Zone *zone, TranslationHelper *translation_helper, const Script &script, const TypedDataView &data, intptr_t data_program_offset, intptr_t initial_script_index, intptr_t record_for_script_id, GrowableArray< intptr_t > *record_token_positions_into)
void CollectTokenPositions(intptr_t kernel_offset)
void set_current_script_id(intptr_t id) override
void ReadUntilExcluding(Field field)
void InitFromKernelProgramInfo(const KernelProgramInfo &info)
FunctionPtr LookupConstructorByKernelConstructor(NameIndex constructor, bool required=true)
NameIndex EnclosingName(NameIndex name)
virtual ClassPtr LookupClassByKernelClass(NameIndex klass, bool required=true)
Dart_NativeFunction function
static void CollectKernelLibraryTokenPositions(const TypedDataView &kernel_data, const Script &script, intptr_t kernel_offset, intptr_t data_kernel_offset, Zone *zone, TranslationHelper *helper, GrowableArray< intptr_t > *token_positions)
static ArrayPtr AsSortedDuplicateFreeArray(GrowableArray< intptr_t > *source)
int LowestFirst(const TokenPosition *a, const TokenPosition *b)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data