OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef RUNTIME_VM_METHOD_RECOGNIZER_H_ | 5 #ifndef RUNTIME_VM_METHOD_RECOGNIZER_H_ |
6 #define RUNTIME_VM_METHOD_RECOGNIZER_H_ | 6 #define RUNTIME_VM_METHOD_RECOGNIZER_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 | 9 |
10 namespace dart { | 10 namespace dart { |
11 | 11 |
| 12 // clang-format off |
12 // (class-name, function-name, recognized enum, result type, fingerprint). | 13 // (class-name, function-name, recognized enum, result type, fingerprint). |
13 // When adding a new function add a 0 as fingerprint, build and run to get the | 14 // When adding a new function add a 0 as fingerprint, build and run to get the |
14 // correct fingerprint from the mismatch error. | 15 // correct fingerprint from the mismatch error. |
15 #define OTHER_RECOGNIZED_LIST(V) \ | 16 #define OTHER_RECOGNIZED_LIST(V) \ |
16 V(::, identical, ObjectIdentical, Bool, 0x49c6e96a) \ | 17 V(::, identical, ObjectIdentical, Bool, 0x49c6e96a) \ |
17 V(ClassID, getID, ClassIDgetID, Smi, 0x528fd455) \ | 18 V(ClassID, getID, ClassIDgetID, Smi, 0x528fd455) \ |
18 V(Object, Object., ObjectConstructor, Dynamic, 0x681617fe) \ | 19 V(Object, Object., ObjectConstructor, Dynamic, 0x681617fe) \ |
19 V(_List, ., ObjectArrayAllocate, Array, 0x63078b15) \ | 20 V(_List, ., ObjectArrayAllocate, Array, 0x63078b15) \ |
20 V(_TypedList, _getInt8, ByteArrayBaseGetInt8, Smi, 0x59e7291d) \ | 21 V(_TypedList, _getInt8, ByteArrayBaseGetInt8, Smi, 0x59e7291d) \ |
21 V(_TypedList, _getUint8, ByteArrayBaseGetUint8, Smi, 0x38d3e5bf) \ | 22 V(_TypedList, _getUint8, ByteArrayBaseGetUint8, Smi, 0x38d3e5bf) \ |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0x4e82d1e9) \ | 484 V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0x4e82d1e9) \ |
484 V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 0x4f3587fc) \ | 485 V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 0x4f3587fc) \ |
485 V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0x6cef30ee) \ | 486 V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0x6cef30ee) \ |
486 V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 0x64f938ac) \ | 487 V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 0x64f938ac) \ |
487 V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0x3693c029) \ | 488 V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0x3693c029) \ |
488 V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0x74bbf260) \ | 489 V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0x74bbf260) \ |
489 V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0x6e72f2a4) \ | 490 V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0x6e72f2a4) \ |
490 V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0x4765edda) \ | 491 V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0x4765edda) \ |
491 V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x7cca4533) \ | 492 V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x7cca4533) \ |
492 V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0x7631bdbc) \ | 493 V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0x7631bdbc) \ |
493 V(Object, get:runtimeType, ObjectRuntimeType, 0x00e7c26b) \ | 494 V(Object, get:runtimeType, ObjectRuntimeType, 0x00e7c26b) |
| 495 |
| 496 // clang-format on |
494 | 497 |
495 // Forward declarations. | 498 // Forward declarations. |
496 class Function; | 499 class Function; |
497 | 500 |
498 // Class that recognizes the name and owner of a function and returns the | 501 // Class that recognizes the name and owner of a function and returns the |
499 // corresponding enum. See RECOGNIZED_LIST above for list of recognizable | 502 // corresponding enum. See RECOGNIZED_LIST above for list of recognizable |
500 // functions. | 503 // functions. |
501 class MethodRecognizer : public AllStatic { | 504 class MethodRecognizer : public AllStatic { |
502 public: | 505 public: |
503 enum Kind { | 506 enum Kind { |
504 kUnknown, | 507 kUnknown, |
505 #define DEFINE_ENUM_LIST(class_name, function_name, enum_name, type, fp) \ | 508 #define DEFINE_ENUM_LIST(class_name, function_name, enum_name, type, fp) \ |
506 k##enum_name, | 509 k##enum_name, |
507 RECOGNIZED_LIST(DEFINE_ENUM_LIST) | 510 RECOGNIZED_LIST(DEFINE_ENUM_LIST) |
508 #undef DEFINE_ENUM_LIST | 511 #undef DEFINE_ENUM_LIST |
509 kNumRecognizedMethods | 512 kNumRecognizedMethods |
510 }; | 513 }; |
511 | 514 |
512 static Kind RecognizeKind(const Function& function); | 515 static Kind RecognizeKind(const Function& function); |
513 static bool AlwaysInline(const Function& function); | 516 static bool AlwaysInline(const Function& function); |
514 static bool PolymorphicTarget(const Function& function); | 517 static bool PolymorphicTarget(const Function& function); |
515 static intptr_t ResultCid(const Function& function); | 518 static intptr_t ResultCid(const Function& function); |
516 static intptr_t MethodKindToReceiverCid(Kind kind); | 519 static intptr_t MethodKindToReceiverCid(Kind kind); |
517 static const char* KindToCString(Kind kind); | 520 static const char* KindToCString(Kind kind); |
518 #if defined(DART_NO_SNAPSHOT) | 521 #if defined(DART_NO_SNAPSHOT) |
519 static void InitializeState(); | 522 static void InitializeState(); |
520 #endif // defined(DART_NO_SNAPSHOT). | 523 #endif // defined(DART_NO_SNAPSHOT). |
521 }; | 524 }; |
522 | 525 |
523 | 526 |
524 #if defined(DART_NO_SNAPSHOT) | 527 #if defined(DART_NO_SNAPSHOT) |
525 #define CHECK_FINGERPRINT2(f, p0, p1, fp) \ | 528 #define CHECK_FINGERPRINT2(f, p0, p1, fp) \ |
526 ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1, fp)) | 529 ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1, fp)) |
527 | 530 |
528 #define CHECK_FINGERPRINT3(f, p0, p1, p2, fp) \ | 531 #define CHECK_FINGERPRINT3(f, p0, p1, p2, fp) \ |
529 ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1 ", " #p2, fp)) | 532 ASSERT(f.CheckSourceFingerprint(#p0 ", " #p1 ", " #p2, fp)) |
530 #endif // defined(DART_NO_SNAPSHOT). | 533 #endif // defined(DART_NO_SNAPSHOT). |
531 | 534 |
532 | 535 |
| 536 // clang-format off |
533 // List of recognized list factories: | 537 // List of recognized list factories: |
534 // (factory-name-symbol, result-cid, fingerprint). | 538 // (factory-name-symbol, result-cid, fingerprint). |
535 #define RECOGNIZED_LIST_FACTORY_LIST(V) \ | 539 #define RECOGNIZED_LIST_FACTORY_LIST(V) \ |
536 V(_ListFactory, kArrayCid, 0x63078b15) \ | 540 V(_ListFactory, kArrayCid, 0x63078b15) \ |
537 V(_GrowableListWithData, kGrowableObjectArrayCid, 0x25a786de) \ | 541 V(_GrowableListWithData, kGrowableObjectArrayCid, 0x25a786de) \ |
538 V(_GrowableListFactory, kGrowableObjectArrayCid, 0x4f4d4790) \ | 542 V(_GrowableListFactory, kGrowableObjectArrayCid, 0x4f4d4790) \ |
539 V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 0x2e7749e3) \ | 543 V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 0x2e7749e3) \ |
540 V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 0x6ab75439) \ | 544 V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 0x6ab75439) \ |
541 V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 0x183129d7) \ | 545 V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 0x183129d7) \ |
542 V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 0x14b563ea) \ | 546 V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 0x14b563ea) \ |
543 V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 0x07456be4) \ | 547 V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 0x07456be4) \ |
544 V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 0x5bd49250) \ | 548 V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 0x5bd49250) \ |
545 V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 0x3c59b3a4) \ | 549 V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 0x3c59b3a4) \ |
546 V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 0x57d85ac7) \ | 550 V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 0x57d85ac7) \ |
547 V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 0x2c093004) \ | 551 V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 0x2c093004) \ |
548 V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 0x501be4f1) \ | 552 V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 0x501be4f1) \ |
549 V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 0x738e124b) \ | 553 V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 0x738e124b) \ |
550 V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 0x7a7dd718) \ | 554 V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 0x7a7dd718) |
551 | 555 |
| 556 // clang-format on |
552 | 557 |
553 // Class that recognizes factories and returns corresponding result cid. | 558 // Class that recognizes factories and returns corresponding result cid. |
554 class FactoryRecognizer : public AllStatic { | 559 class FactoryRecognizer : public AllStatic { |
555 public: | 560 public: |
556 // Return kDynamicCid if factory is not recognized. | 561 // Return kDynamicCid if factory is not recognized. |
557 static intptr_t ResultCid(const Function& factory); | 562 static intptr_t ResultCid(const Function& factory); |
558 }; | 563 }; |
559 | 564 |
560 } // namespace dart | 565 } // namespace dart |
561 | 566 |
562 #endif // RUNTIME_VM_METHOD_RECOGNIZER_H_ | 567 #endif // RUNTIME_VM_METHOD_RECOGNIZER_H_ |
OLD | NEW |