OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 VM_RAW_OBJECT_H_ | 5 #ifndef VM_RAW_OBJECT_H_ |
6 #define VM_RAW_OBJECT_H_ | 6 #define VM_RAW_OBJECT_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/atomic.h" | 9 #include "vm/atomic.h" |
10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
11 #include "vm/snapshot.h" | 11 #include "vm/snapshot.h" |
12 #include "vm/token.h" | 12 #include "vm/token.h" |
| 13 #include "vm/token_position.h" |
13 #include "vm/verified_memory.h" | 14 #include "vm/verified_memory.h" |
14 | 15 |
15 namespace dart { | 16 namespace dart { |
16 | 17 |
17 // Macrobatics to define the Object hierarchy of VM implementation classes. | 18 // Macrobatics to define the Object hierarchy of VM implementation classes. |
18 #define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V) \ | 19 #define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V) \ |
19 V(Class) \ | 20 V(Class) \ |
20 V(UnresolvedClass) \ | 21 V(UnresolvedClass) \ |
21 V(TypeArguments) \ | 22 V(TypeArguments) \ |
22 V(PatchClass) \ | 23 V(PatchClass) \ |
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
671 RawObject* canonical_types_; // An array of canonicalized types of this class | 672 RawObject* canonical_types_; // An array of canonicalized types of this class |
672 // or the canonical type. | 673 // or the canonical type. |
673 RawArray* invocation_dispatcher_cache_; // Cache for dispatcher functions. | 674 RawArray* invocation_dispatcher_cache_; // Cache for dispatcher functions. |
674 RawArray* cha_codes_; // CHA optimized codes. | 675 RawArray* cha_codes_; // CHA optimized codes. |
675 RawCode* allocation_stub_; // Stub code for allocation of instances. | 676 RawCode* allocation_stub_; // Stub code for allocation of instances. |
676 RawObject** to() { | 677 RawObject** to() { |
677 return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_); | 678 return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_); |
678 } | 679 } |
679 | 680 |
680 cpp_vtable handle_vtable_; | 681 cpp_vtable handle_vtable_; |
681 int32_t token_pos_; | 682 TokenPosition token_pos_; |
682 int32_t instance_size_in_words_; // Size if fixed len or 0 if variable len. | 683 int32_t instance_size_in_words_; // Size if fixed len or 0 if variable len. |
683 int32_t type_arguments_field_offset_in_words_; // Offset of type args fld. | 684 int32_t type_arguments_field_offset_in_words_; // Offset of type args fld. |
684 int32_t next_field_offset_in_words_; // Offset of the next instance field. | 685 int32_t next_field_offset_in_words_; // Offset of the next instance field. |
685 classid_t id_; // Class Id, also index in the class table. | 686 classid_t id_; // Class Id, also index in the class table. |
686 int16_t num_type_arguments_; // Number of type arguments in flattened vector. | 687 int16_t num_type_arguments_; // Number of type arguments in flattened vector. |
687 int16_t num_own_type_arguments_; // Number of non-overlapping type arguments. | 688 int16_t num_own_type_arguments_; // Number of non-overlapping type arguments. |
688 uint16_t num_native_fields_; // Number of native fields in class. | 689 uint16_t num_native_fields_; // Number of native fields in class. |
689 uint16_t state_bits_; | 690 uint16_t state_bits_; |
690 | 691 |
691 friend class Instance; | 692 friend class Instance; |
692 friend class Object; | 693 friend class Object; |
693 friend class RawInstance; | 694 friend class RawInstance; |
694 friend class RawInstructions; | 695 friend class RawInstructions; |
695 friend class SnapshotReader; | 696 friend class SnapshotReader; |
696 }; | 697 }; |
697 | 698 |
698 | 699 |
699 class RawUnresolvedClass : public RawObject { | 700 class RawUnresolvedClass : public RawObject { |
700 RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass); | 701 RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass); |
701 | 702 |
702 RawObject** from() { | 703 RawObject** from() { |
703 return reinterpret_cast<RawObject**>(&ptr()->library_prefix_); | 704 return reinterpret_cast<RawObject**>(&ptr()->library_prefix_); |
704 } | 705 } |
705 RawLibraryPrefix* library_prefix_; // Library prefix qualifier for the ident. | 706 RawLibraryPrefix* library_prefix_; // Library prefix qualifier for the ident. |
706 RawString* ident_; // Name of the unresolved identifier. | 707 RawString* ident_; // Name of the unresolved identifier. |
707 RawObject** to() { | 708 RawObject** to() { |
708 return reinterpret_cast<RawObject**>(&ptr()->ident_); | 709 return reinterpret_cast<RawObject**>(&ptr()->ident_); |
709 } | 710 } |
710 int32_t token_pos_; | 711 TokenPosition token_pos_; |
711 }; | 712 }; |
712 | 713 |
713 | 714 |
714 class RawTypeArguments : public RawObject { | 715 class RawTypeArguments : public RawObject { |
715 private: | 716 private: |
716 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments); | 717 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments); |
717 | 718 |
718 RawObject** from() { | 719 RawObject** from() { |
719 return reinterpret_cast<RawObject**>(&ptr()->instantiations_); | 720 return reinterpret_cast<RawObject**>(&ptr()->instantiations_); |
720 } | 721 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 RawObject** to_no_code() { | 810 RawObject** to_no_code() { |
810 return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_); | 811 return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_); |
811 } | 812 } |
812 RawCode* code_; // Currently active code. | 813 RawCode* code_; // Currently active code. |
813 RawCode* unoptimized_code_; // Unoptimized code, keep it after optimization. | 814 RawCode* unoptimized_code_; // Unoptimized code, keep it after optimization. |
814 RawObject** to() { | 815 RawObject** to() { |
815 return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_); | 816 return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_); |
816 } | 817 } |
817 uword entry_point_; | 818 uword entry_point_; |
818 | 819 |
819 int32_t token_pos_; | 820 TokenPosition token_pos_; |
820 int32_t end_token_pos_; | 821 TokenPosition end_token_pos_; |
821 int32_t usage_counter_; // Incremented while function is running. | 822 int32_t usage_counter_; // Incremented while function is running. |
822 int16_t num_fixed_parameters_; | 823 int16_t num_fixed_parameters_; |
823 int16_t num_optional_parameters_; // > 0: positional; < 0: named. | 824 int16_t num_optional_parameters_; // > 0: positional; < 0: named. |
824 int16_t deoptimization_counter_; | 825 int16_t deoptimization_counter_; |
825 uint32_t kind_tag_; // See Function::KindTagBits. | 826 uint32_t kind_tag_; // See Function::KindTagBits. |
826 uint16_t optimized_instruction_count_; | 827 uint16_t optimized_instruction_count_; |
827 uint16_t optimized_call_site_count_; | 828 uint16_t optimized_call_site_count_; |
828 }; | 829 }; |
829 | 830 |
830 | 831 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 } initializer_; | 887 } initializer_; |
887 RawObject** to_precompiled_snapshot() { | 888 RawObject** to_precompiled_snapshot() { |
888 return reinterpret_cast<RawObject**>(&ptr()->initializer_); | 889 return reinterpret_cast<RawObject**>(&ptr()->initializer_); |
889 } | 890 } |
890 RawArray* dependent_code_; | 891 RawArray* dependent_code_; |
891 RawSmi* guarded_list_length_; | 892 RawSmi* guarded_list_length_; |
892 RawObject** to() { | 893 RawObject** to() { |
893 return reinterpret_cast<RawObject**>(&ptr()->guarded_list_length_); | 894 return reinterpret_cast<RawObject**>(&ptr()->guarded_list_length_); |
894 } | 895 } |
895 | 896 |
896 int32_t token_pos_; | 897 TokenPosition token_pos_; |
897 classid_t guarded_cid_; | 898 classid_t guarded_cid_; |
898 classid_t is_nullable_; // kNullCid if field can contain null value and | 899 classid_t is_nullable_; // kNullCid if field can contain null value and |
899 // any other value otherwise. | 900 // any other value otherwise. |
900 // Offset to the guarded length field inside an instance of class matching | 901 // Offset to the guarded length field inside an instance of class matching |
901 // guarded_cid_. Stored corrected by -kHeapObjectTag to simplify code | 902 // guarded_cid_. Stored corrected by -kHeapObjectTag to simplify code |
902 // generated on platforms with weak addressing modes (ARM, MIPS). | 903 // generated on platforms with weak addressing modes (ARM, MIPS). |
903 int8_t guarded_list_length_in_object_offset_; | 904 int8_t guarded_list_length_in_object_offset_; |
904 | 905 |
905 uint8_t kind_bits_; // static, final, const, has initializer.... | 906 uint8_t kind_bits_; // static, final, const, has initializer.... |
906 }; | 907 }; |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 kIndexBias = 1 << (kIndexSize - 1), | 1273 kIndexBias = 1 << (kIndexSize - 1), |
1273 kMaxIndex = (1 << (kIndexSize - 1)) - 1, | 1274 kMaxIndex = (1 << (kIndexSize - 1)) - 1, |
1274 }; | 1275 }; |
1275 | 1276 |
1276 class IndexBits : public BitField<int32_t, kIndexPos, kIndexSize> {}; | 1277 class IndexBits : public BitField<int32_t, kIndexPos, kIndexSize> {}; |
1277 class KindBits : public BitField<int8_t, kKindPos, kKindSize>{}; | 1278 class KindBits : public BitField<int8_t, kKindPos, kKindSize>{}; |
1278 | 1279 |
1279 struct VarInfo { | 1280 struct VarInfo { |
1280 int32_t index_kind; // Bitfield for slot index on stack or in context, | 1281 int32_t index_kind; // Bitfield for slot index on stack or in context, |
1281 // and Entry kind of type VarInfoKind. | 1282 // and Entry kind of type VarInfoKind. |
1282 int32_t begin_pos; // Token position of scope start. | 1283 TokenPosition begin_pos; // Token position of scope start. |
1283 int32_t end_pos; // Token position of scope end. | 1284 TokenPosition end_pos; // Token position of scope end. |
1284 int16_t scope_id; // Scope to which the variable belongs. | 1285 int16_t scope_id; // Scope to which the variable belongs. |
1285 | 1286 |
1286 VarInfoKind kind() const { | 1287 VarInfoKind kind() const { |
1287 return static_cast<VarInfoKind>(KindBits::decode(index_kind)); | 1288 return static_cast<VarInfoKind>(KindBits::decode(index_kind)); |
1288 } | 1289 } |
1289 void set_kind(VarInfoKind kind) { | 1290 void set_kind(VarInfoKind kind) { |
1290 index_kind = KindBits::update(kind, index_kind); | 1291 index_kind = KindBits::update(kind, index_kind); |
1291 } | 1292 } |
1292 int32_t index() const { | 1293 int32_t index() const { |
1293 return IndexBits::decode(index_kind) - kIndexBias; | 1294 return IndexBits::decode(index_kind) - kIndexBias; |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1488 RawObject** from() { | 1489 RawObject** from() { |
1489 return reinterpret_cast<RawObject**>(&ptr()->previous_error_); | 1490 return reinterpret_cast<RawObject**>(&ptr()->previous_error_); |
1490 } | 1491 } |
1491 RawError* previous_error_; // May be null. | 1492 RawError* previous_error_; // May be null. |
1492 RawScript* script_; | 1493 RawScript* script_; |
1493 RawString* message_; | 1494 RawString* message_; |
1494 RawString* formatted_message_; // Incl. previous error's formatted message. | 1495 RawString* formatted_message_; // Incl. previous error's formatted message. |
1495 RawObject** to() { | 1496 RawObject** to() { |
1496 return reinterpret_cast<RawObject**>(&ptr()->formatted_message_); | 1497 return reinterpret_cast<RawObject**>(&ptr()->formatted_message_); |
1497 } | 1498 } |
1498 int32_t token_pos_; // Source position in script_. | 1499 TokenPosition token_pos_; // Source position in script_. |
1499 bool report_after_token_; // Report message at or after the token. | 1500 bool report_after_token_; // Report message at or after the token. |
1500 int8_t kind_; // Of type LanguageError::Kind. | 1501 int8_t kind_; // Of type LanguageError::Kind. |
1501 }; | 1502 }; |
1502 | 1503 |
1503 | 1504 |
1504 class RawUnhandledException : public RawError { | 1505 class RawUnhandledException : public RawError { |
1505 RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException); | 1506 RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException); |
1506 | 1507 |
1507 RawObject** from() { | 1508 RawObject** from() { |
1508 return reinterpret_cast<RawObject**>(&ptr()->exception_); | 1509 return reinterpret_cast<RawObject**>(&ptr()->exception_); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 | 1577 |
1577 RawObject** from() { | 1578 RawObject** from() { |
1578 return reinterpret_cast<RawObject**>(&ptr()->type_class_); | 1579 return reinterpret_cast<RawObject**>(&ptr()->type_class_); |
1579 } | 1580 } |
1580 RawObject* type_class_; // Either resolved class or unresolved class. | 1581 RawObject* type_class_; // Either resolved class or unresolved class. |
1581 RawTypeArguments* arguments_; | 1582 RawTypeArguments* arguments_; |
1582 RawLanguageError* error_; // Error object if type is malformed or malbounded. | 1583 RawLanguageError* error_; // Error object if type is malformed or malbounded. |
1583 RawObject** to() { | 1584 RawObject** to() { |
1584 return reinterpret_cast<RawObject**>(&ptr()->error_); | 1585 return reinterpret_cast<RawObject**>(&ptr()->error_); |
1585 } | 1586 } |
1586 int32_t token_pos_; | 1587 TokenPosition token_pos_; |
1587 int8_t type_state_; | 1588 int8_t type_state_; |
1588 }; | 1589 }; |
1589 | 1590 |
1590 | 1591 |
1591 class RawFunctionType : public RawAbstractType { | 1592 class RawFunctionType : public RawAbstractType { |
1592 private: | 1593 private: |
1593 RAW_HEAP_OBJECT_IMPLEMENTATION(FunctionType); | 1594 RAW_HEAP_OBJECT_IMPLEMENTATION(FunctionType); |
1594 | 1595 |
1595 RawObject** from() { | 1596 RawObject** from() { |
1596 return reinterpret_cast<RawObject**>(&ptr()->scope_class_); | 1597 return reinterpret_cast<RawObject**>(&ptr()->scope_class_); |
1597 } | 1598 } |
1598 RawClass* scope_class_; | 1599 RawClass* scope_class_; |
1599 RawTypeArguments* arguments_; | 1600 RawTypeArguments* arguments_; |
1600 RawFunction* signature_; | 1601 RawFunction* signature_; |
1601 RawLanguageError* error_; // Error object if type is malformed or malbounded. | 1602 RawLanguageError* error_; // Error object if type is malformed or malbounded. |
1602 RawObject** to() { | 1603 RawObject** to() { |
1603 return reinterpret_cast<RawObject**>(&ptr()->error_); | 1604 return reinterpret_cast<RawObject**>(&ptr()->error_); |
1604 } | 1605 } |
1605 int32_t token_pos_; | 1606 TokenPosition token_pos_; |
1606 int8_t type_state_; | 1607 int8_t type_state_; |
1607 }; | 1608 }; |
1608 | 1609 |
1609 | 1610 |
1610 class RawTypeRef : public RawAbstractType { | 1611 class RawTypeRef : public RawAbstractType { |
1611 private: | 1612 private: |
1612 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef); | 1613 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef); |
1613 | 1614 |
1614 RawObject** from() { | 1615 RawObject** from() { |
1615 return reinterpret_cast<RawObject**>(&ptr()->type_); | 1616 return reinterpret_cast<RawObject**>(&ptr()->type_); |
1616 } | 1617 } |
1617 RawAbstractType* type_; // The referenced type. | 1618 RawAbstractType* type_; // The referenced type. |
1618 RawObject** to() { | 1619 RawObject** to() { |
1619 return reinterpret_cast<RawObject**>(&ptr()->type_); | 1620 return reinterpret_cast<RawObject**>(&ptr()->type_); |
1620 } | 1621 } |
1621 }; | 1622 }; |
1622 | 1623 |
1623 | 1624 |
1624 class RawTypeParameter : public RawAbstractType { | 1625 class RawTypeParameter : public RawAbstractType { |
1625 private: | 1626 private: |
1626 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter); | 1627 RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter); |
1627 | 1628 |
1628 RawObject** from() { | 1629 RawObject** from() { |
1629 return reinterpret_cast<RawObject**>(&ptr()->parameterized_class_); | 1630 return reinterpret_cast<RawObject**>(&ptr()->parameterized_class_); |
1630 } | 1631 } |
1631 RawClass* parameterized_class_; | 1632 RawClass* parameterized_class_; |
1632 RawString* name_; | 1633 RawString* name_; |
1633 RawAbstractType* bound_; // ObjectType if no explicit bound specified. | 1634 RawAbstractType* bound_; // ObjectType if no explicit bound specified. |
1634 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->bound_); } | 1635 RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->bound_); } |
1635 int32_t token_pos_; | 1636 TokenPosition token_pos_; |
1636 int16_t index_; | 1637 int16_t index_; |
1637 int8_t type_state_; | 1638 int8_t type_state_; |
1638 }; | 1639 }; |
1639 | 1640 |
1640 | 1641 |
1641 class RawBoundedType : public RawAbstractType { | 1642 class RawBoundedType : public RawAbstractType { |
1642 private: | 1643 private: |
1643 RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType); | 1644 RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType); |
1644 | 1645 |
1645 RawObject** from() { | 1646 RawObject** from() { |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2333 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == | 2334 COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid == |
2334 kTypedDataInt8ArrayViewCid + 15); | 2335 kTypedDataInt8ArrayViewCid + 15); |
2335 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); | 2336 COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14); |
2336 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); | 2337 COMPILE_ASSERT(kNullCid == kByteBufferCid + 1); |
2337 return (kNullCid - kTypedDataInt8ArrayCid); | 2338 return (kNullCid - kTypedDataInt8ArrayCid); |
2338 } | 2339 } |
2339 | 2340 |
2340 } // namespace dart | 2341 } // namespace dart |
2341 | 2342 |
2342 #endif // VM_RAW_OBJECT_H_ | 2343 #endif // VM_RAW_OBJECT_H_ |
OLD | NEW |