8#define H (translation_helper_)
9#define I Isolate::Current()
19 intptr_t data_program_offset)
28 return current * 31 + val;
32 void BuildHash(uint32_t val);
33 void CalculateConstructorFingerprint();
34 void CalculateArgumentsFingerprint();
35 void CalculateVariableDeclarationFingerprint();
36 void CalculateStatementListFingerprint();
37 void CalculateListOfExpressionsFingerprint();
38 void CalculateListOfNamedExpressionsFingerprint();
39 void CalculateListOfDartTypesFingerprint();
40 void CalculateListOfVariableDeclarationsFingerprint();
41 void CalculateStringReferenceFingerprint();
42 void CalculateListOfStringsFingerprint();
43 void CalculateTypeParameterFingerprint();
44 void CalculateTypeParametersListFingerprint();
45 void CalculateCanonicalNameFingerprint();
46 void CalculateInterfaceMemberNameFingerprint();
47 void CalculateInitializerFingerprint();
48 void CalculateDartTypeFingerprint();
49 void CalculateOptionalDartTypeFingerprint();
50 void CalculateInterfaceTypeFingerprint(
bool simple);
51 void CalculateFunctionTypeFingerprint(
bool simple);
52 void CalculateGetterNameFingerprint();
53 void CalculateSetterNameFingerprint();
54 void CalculateMethodNameFingerprint();
55 void CalculateExpressionFingerprint();
56 void CalculateStatementFingerprint();
57 void CalculateFunctionNodeFingerprint();
64void KernelFingerprintHelper::BuildHash(uint32_t val) {
68void KernelFingerprintHelper::CalculateConstructorFingerprint() {
72 CalculateListOfExpressionsFingerprint();
73 CalculateFunctionNodeFingerprint();
75 for (intptr_t i = 0; i < len; ++i) {
76 CalculateInitializerFingerprint();
79 BuildHash(helper.flags_);
82void KernelFingerprintHelper::CalculateArgumentsFingerprint() {
85 CalculateListOfDartTypesFingerprint();
86 CalculateListOfExpressionsFingerprint();
87 CalculateListOfNamedExpressionsFingerprint();
90void KernelFingerprintHelper::CalculateVariableDeclarationFingerprint() {
94 CalculateListOfExpressionsFingerprint();
99 CalculateDartTypeFingerprint();
101 CalculateExpressionFingerprint();
104 BuildHash(helper.flags_);
107void KernelFingerprintHelper::CalculateStatementListFingerprint() {
109 for (intptr_t i = 0; i < list_length; ++i) {
110 CalculateStatementFingerprint();
114void KernelFingerprintHelper::CalculateListOfExpressionsFingerprint() {
116 for (intptr_t i = 0; i < list_length; ++i) {
117 CalculateExpressionFingerprint();
121void KernelFingerprintHelper::CalculateListOfNamedExpressionsFingerprint() {
123 for (intptr_t i = 0; i < list_length; ++i) {
124 CalculateStringReferenceFingerprint();
125 CalculateExpressionFingerprint();
129void KernelFingerprintHelper::CalculateListOfDartTypesFingerprint() {
131 for (intptr_t i = 0; i < list_length; ++i) {
132 CalculateDartTypeFingerprint();
136void KernelFingerprintHelper::CalculateStringReferenceFingerprint() {
141void KernelFingerprintHelper::CalculateListOfStringsFingerprint() {
143 for (intptr_t i = 0; i < list_length; ++i) {
144 CalculateStringReferenceFingerprint();
148void KernelFingerprintHelper::CalculateListOfVariableDeclarationsFingerprint() {
150 for (intptr_t i = 0; i < list_length; ++i) {
152 CalculateVariableDeclarationFingerprint();
156void KernelFingerprintHelper::CalculateTypeParameterFingerprint() {
160 CalculateListOfExpressionsFingerprint();
170 CalculateDartTypeFingerprint();
171 CalculateDartTypeFingerprint();
172 BuildHash(helper.flags_);
175void KernelFingerprintHelper::CalculateTypeParametersListFingerprint() {
177 for (intptr_t i = 0; i < list_length; ++i) {
178 CalculateTypeParameterFingerprint();
182void KernelFingerprintHelper::CalculateCanonicalNameFingerprint() {
184 BuildHash(
H.DartString(i).Hash());
187void KernelFingerprintHelper::CalculateInterfaceMemberNameFingerprint() {
188 CalculateCanonicalNameFingerprint();
192void KernelFingerprintHelper::CalculateInitializerFingerprint() {
196 case kInvalidInitializer:
198 case kFieldInitializer:
201 CalculateExpressionFingerprint();
203 case kSuperInitializer:
205 CalculateCanonicalNameFingerprint();
206 CalculateArgumentsFingerprint();
208 case kRedirectingInitializer:
210 CalculateCanonicalNameFingerprint();
211 CalculateArgumentsFingerprint();
213 case kLocalInitializer:
214 CalculateVariableDeclarationFingerprint();
216 case kAssertInitializer:
217 CalculateStatementFingerprint();
225void KernelFingerprintHelper::CalculateDartTypeFingerprint() {
239 CalculateInterfaceTypeFingerprint(
false);
241 case kSimpleInterfaceType:
242 CalculateInterfaceTypeFingerprint(
true);
245 CalculateFunctionTypeFingerprint(
false);
247 case kSimpleFunctionType:
248 CalculateFunctionTypeFingerprint(
true);
250 case kTypeParameterType: {
252 BuildHash(
static_cast<uint32_t
>(nullability));
256 case kIntersectionType:
257 CalculateDartTypeFingerprint();
258 CalculateDartTypeFingerprint();
262 CalculateListOfDartTypesFingerprint();
264 BuildHash(named_count);
265 for (intptr_t i = 0; i < named_count; ++i) {
266 CalculateStringReferenceFingerprint();
267 CalculateDartTypeFingerprint();
272 case kExtensionType: {
277 CalculateDartTypeFingerprint();
282 CalculateDartTypeFingerprint();
290void KernelFingerprintHelper::CalculateOptionalDartTypeFingerprint() {
293 if (tag == kNothing) {
296 ASSERT(tag == kSomething);
297 CalculateDartTypeFingerprint();
300void KernelFingerprintHelper::CalculateInterfaceTypeFingerprint(
bool simple) {
302 BuildHash(
static_cast<uint32_t
>(nullability));
304 ASSERT(
H.IsClass(kernel_class));
305 const String&
class_name =
H.DartClassName(kernel_class);
306 NameIndex kernel_library =
H.CanonicalNameParent(kernel_class);
307 const String& library_name =
308 H.DartSymbolPlain(
H.CanonicalNameString(kernel_library));
310 BuildHash(library_name.Hash());
312 CalculateListOfDartTypesFingerprint();
316void KernelFingerprintHelper::CalculateFunctionTypeFingerprint(
bool simple) {
318 BuildHash(
static_cast<uint32_t
>(nullability));
321 CalculateTypeParametersListFingerprint();
326 CalculateListOfDartTypesFingerprint();
329 const intptr_t named_count =
331 BuildHash(named_count);
332 for (intptr_t i = 0; i < named_count; ++i) {
334 CalculateStringReferenceFingerprint();
335 CalculateDartTypeFingerprint();
340 CalculateDartTypeFingerprint();
343void KernelFingerprintHelper::CalculateGetterNameFingerprint() {
346 BuildHash(
H.DartGetterName(
name).Hash());
351void KernelFingerprintHelper::CalculateSetterNameFingerprint() {
353 if (!
H.IsRoot(
name)) {
354 BuildHash(
H.DartSetterName(
name).Hash());
359void KernelFingerprintHelper::CalculateMethodNameFingerprint() {
360 const NameIndex
name =
362 if (!
H.IsRoot(
name)) {
363 BuildHash(
H.DartProcedureName(
name).Hash());
368void KernelFingerprintHelper::CalculateExpressionFingerprint() {
373 case kInvalidExpression:
375 CalculateStringReferenceFingerprint();
377 CalculateExpressionFingerprint();
384 CalculateOptionalDartTypeFingerprint();
386 case kSpecializedVariableGet:
394 CalculateExpressionFingerprint();
396 case kSpecializedVariableSet:
399 CalculateExpressionFingerprint();
404 CalculateExpressionFingerprint();
407 CalculateGetterNameFingerprint();
412 CalculateExpressionFingerprint();
415 case kInstanceTearOff:
418 CalculateExpressionFingerprint();
421 CalculateGetterNameFingerprint();
423 case kFunctionTearOff:
430 CalculateExpressionFingerprint();
432 CalculateExpressionFingerprint();
433 CalculateSetterNameFingerprint();
438 CalculateExpressionFingerprint();
440 CalculateExpressionFingerprint();
442 case kAbstractSuperPropertyGet:
447 case kAbstractSuperPropertySet:
452 case kSuperPropertyGet:
455 CalculateGetterNameFingerprint();
457 case kSuperPropertySet:
460 CalculateExpressionFingerprint();
461 CalculateSetterNameFingerprint();
465 CalculateCanonicalNameFingerprint();
469 CalculateCanonicalNameFingerprint();
470 CalculateExpressionFingerprint();
472 case kInstanceInvocation:
476 CalculateExpressionFingerprint();
478 CalculateArgumentsFingerprint();
480 CalculateMethodNameFingerprint();
482 case kDynamicInvocation:
486 CalculateExpressionFingerprint();
488 CalculateArgumentsFingerprint();
490 case kLocalFunctionInvocation:
494 CalculateArgumentsFingerprint();
497 case kFunctionInvocation:
500 CalculateExpressionFingerprint();
501 CalculateArgumentsFingerprint();
506 CalculateExpressionFingerprint();
507 CalculateExpressionFingerprint();
509 CalculateMethodNameFingerprint();
513 CalculateExpressionFingerprint();
515 case kAbstractSuperMethodInvocation:
520 case kSuperMethodInvocation:
523 CalculateArgumentsFingerprint();
524 CalculateInterfaceMemberNameFingerprint();
526 case kStaticInvocation:
528 CalculateCanonicalNameFingerprint();
529 CalculateArgumentsFingerprint();
531 case kConstructorInvocation:
533 CalculateCanonicalNameFingerprint();
534 CalculateArgumentsFingerprint();
538 CalculateExpressionFingerprint();
542 CalculateExpressionFingerprint();
544 case kLogicalExpression:
546 CalculateExpressionFingerprint();
548 CalculateExpressionFingerprint();
550 case kConditionalExpression:
552 CalculateExpressionFingerprint();
553 CalculateExpressionFingerprint();
554 CalculateExpressionFingerprint();
555 CalculateOptionalDartTypeFingerprint();
557 case kStringConcatenation:
559 CalculateListOfExpressionsFingerprint();
564 CalculateExpressionFingerprint();
565 CalculateDartTypeFingerprint();
570 CalculateExpressionFingerprint();
571 CalculateDartTypeFingerprint();
575 CalculateDartTypeFingerprint();
577 case kThisExpression:
586 CalculateExpressionFingerprint();
590 CalculateDartTypeFingerprint();
591 CalculateListOfExpressionsFingerprint();
600 CalculateDartTypeFingerprint();
601 CalculateDartTypeFingerprint();
603 for (intptr_t i = 0; i < list_length; ++i) {
604 CalculateExpressionFingerprint();
605 CalculateExpressionFingerprint();
611 CalculateListOfExpressionsFingerprint();
612 CalculateListOfNamedExpressionsFingerprint();
613 CalculateDartTypeFingerprint();
615 case kRecordIndexGet:
617 CalculateExpressionFingerprint();
618 CalculateDartTypeFingerprint();
623 CalculateExpressionFingerprint();
624 CalculateDartTypeFingerprint();
625 CalculateStringReferenceFingerprint();
627 case kFunctionExpression:
629 CalculateFunctionNodeFingerprint();
633 CalculateVariableDeclarationFingerprint();
634 CalculateExpressionFingerprint();
636 case kBlockExpression:
638 CalculateStatementListFingerprint();
639 CalculateExpressionFingerprint();
643 CalculateExpressionFingerprint();
644 CalculateListOfDartTypesFingerprint();
648 CalculateStringReferenceFingerprint();
652 CalculateStringReferenceFingerprint();
654 case kSpecializedIntLiteral:
657 case kNegativeIntLiteral:
661 case kPositiveIntLiteral:
665 case kDoubleLiteral: {
668 uint64_t
data = bit_cast<uint64_t>(value);
669 BuildHash(
static_cast<uint32_t
>(
data >> 32));
670 BuildHash(
static_cast<uint32_t
>(
data));
682 case kConstantExpression:
687 case kFileUriConstantExpression:
694 case kCheckLibraryIsLoaded:
698 case kAwaitExpression:
700 CalculateExpressionFingerprint();
702 CalculateDartTypeFingerprint();
705 case kFileUriExpression:
708 CalculateExpressionFingerprint();
710 case kConstStaticInvocation:
711 case kConstConstructorInvocation:
712 case kConstListLiteral:
713 case kConstSetLiteral:
714 case kConstMapLiteral:
716 case kListConcatenation:
717 case kSetConcatenation:
718 case kMapConcatenation:
719 case kInstanceCreation:
721 case kSwitchExpression:
722 case kPatternAssignment:
731void KernelFingerprintHelper::CalculateStatementFingerprint() {
735 case kExpressionStatement:
736 CalculateExpressionFingerprint();
741 CalculateStatementListFingerprint();
743 case kEmptyStatement:
746 CalculateStatementListFingerprint();
748 case kAssertStatement:
749 CalculateExpressionFingerprint();
753 CalculateExpressionFingerprint();
756 case kLabeledStatement:
758 CalculateStatementFingerprint();
760 case kBreakStatement:
764 case kWhileStatement:
766 CalculateExpressionFingerprint();
767 CalculateStatementFingerprint();
771 CalculateStatementFingerprint();
772 CalculateExpressionFingerprint();
774 case kForStatement: {
776 CalculateListOfVariableDeclarationsFingerprint();
778 if (tag == kSomething) {
779 CalculateExpressionFingerprint();
781 CalculateListOfExpressionsFingerprint();
782 CalculateStatementFingerprint();
785 case kSwitchStatement: {
788 CalculateExpressionFingerprint();
789 CalculateOptionalDartTypeFingerprint();
791 for (intptr_t i = 0; i < case_count; ++i) {
794 for (intptr_t j = 0; j < expression_count; ++j) {
796 CalculateExpressionFingerprint();
798 BuildHash(
static_cast<uint32_t
>(
ReadBool()));
799 CalculateStatementFingerprint();
803 case kContinueSwitchStatement:
809 CalculateExpressionFingerprint();
810 CalculateStatementFingerprint();
811 CalculateStatementFingerprint();
813 case kReturnStatement: {
817 if (tag == kSomething) {
818 CalculateExpressionFingerprint();
824 CalculateStatementFingerprint();
827 for (intptr_t i = 0; i < catch_count; ++i) {
829 CalculateDartTypeFingerprint();
832 if (tag == kSomething) {
833 CalculateVariableDeclarationFingerprint();
837 if (tag == kSomething) {
838 CalculateVariableDeclarationFingerprint();
840 CalculateStatementFingerprint();
846 CalculateStatementFingerprint();
847 CalculateStatementFingerprint();
849 case kYieldStatement: {
852 CalculateExpressionFingerprint();
855 case kVariableDeclaration:
856 CalculateVariableDeclarationFingerprint();
860 CalculateVariableDeclarationFingerprint();
861 CalculateFunctionNodeFingerprint();
863 case kForInStatement:
864 case kAsyncForInStatement:
865 case kIfCaseStatement:
866 case kPatternSwitchStatement:
867 case kPatternVariableDeclaration:
885 CalculateDartTypeFingerprint();
889 if (
PeekTag() == kFunctionExpression) {
891 CalculateExpressionFingerprint();
896 BuildHash(
name.Hash());
897 BuildHash(field_helper.
flags_);
902void KernelFingerprintHelper::CalculateFunctionNodeFingerprint() {
906 CalculateTypeParametersListFingerprint();
909 function_node_helper.ReadUntilExcluding(
911 CalculateListOfVariableDeclarationsFingerprint();
912 CalculateListOfVariableDeclarationsFingerprint();
913 CalculateDartTypeFingerprint();
914 CalculateOptionalDartTypeFingerprint();
927 CalculateStatementFingerprint();
929 BuildHash(function_node_helper.total_parameter_count_);
930 BuildHash(function_node_helper.required_parameter_count_);
938 }
else if (tag == kConstructor) {
939 CalculateConstructorFingerprint();
948 CalculateFunctionNodeFingerprint();
950 BuildHash(procedure_helper.
kind_);
951 BuildHash(procedure_helper.
flags_);
954 BuildHash(
name.Hash());
959 const Class& klass) {
971 if (!
type.IsNull()) {
978 for (intptr_t i = 0; i < fields.
Length(); ++i) {
979 field ^= fields.
At(i);
986 for (intptr_t i = 0; i < functions.
Length(); ++i) {
987 func ^= functions.
At(i);
993 for (intptr_t i = 0; i < interfaces.
Length(); ++i) {
1003 const Field& field) {
1012 zone, &translation_helper,
1029 zone, &translation_helper,
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static uint32_t hash(const SkShaderBase::GradientInfo &v)
ObjectPtr At(intptr_t index) const
TypePtr super_type() const
ArrayPtr interfaces() const
ArrayPtr current_functions() const
intptr_t kernel_offset() const
intptr_t KernelLibraryOffset() const
TypedDataViewPtr KernelLibrary() const
KernelProgramInfoPtr KernelProgramInfo() const
intptr_t KernelLibraryOffset() const
intptr_t kernel_offset() const
TypedDataViewPtr KernelLibrary() const
KernelProgramInfoPtr KernelProgramInfo() const
static Thread * Current()
void ReadUntilExcluding(Field field)
void SetJustRead(Field field)
intptr_t annotation_count_
static uint32_t CalculateHash(uint32_t current, uint32_t val)
virtual ~KernelFingerprintHelper()
uint32_t CalculateFunctionFingerprint()
KernelFingerprintHelper(Zone *zone, TranslationHelper *translation_helper, const TypedDataView &data, intptr_t data_program_offset)
uint32_t CalculateFieldFingerprint()
friend class ConstructorHelper
friend class TypeParameterHelper
void SetOffset(intptr_t offset)
const String & ReadNameAsGetterName()
const String & ReadNameAsMethodName()
void SkipListOfDartTypes()
friend class VariableDeclarationHelper
void SkipConstantReference()
const String & ReadNameAsSetterName()
intptr_t ReadListLength()
TokenPosition ReadPosition()
Tag ReadTag(uint8_t *payload=nullptr)
virtual void ReportUnexpectedTag(const char *variant, Tag tag)
Tag PeekTag(uint8_t *payload=nullptr)
NameIndex ReadCanonicalNameReference()
const String & ReadNameAsFieldName()
void SkipCanonicalNameReference()
void SkipBytes(intptr_t skip)
StringIndex ReadStringReference()
Nullability ReadNullability()
static uint32_t CalculateFunctionFingerprint(const Function &func)
static uint32_t CalculateFieldFingerprint(const Field &field)
static uint32_t CalculateClassFingerprint(const Class &klass)
void ReadUntilExcluding(Field field)
void SetJustRead(Field field)
intptr_t annotation_count_
void InitFromKernelProgramInfo(const KernelProgramInfo &info)
const char *const class_name
static uint32_t Hash(uint32_t key)
static int8_t data[kExtLength]