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_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 void* operator new(size_t size); | 447 void* operator new(size_t size); |
448 // Disallow copy constructor. | 448 // Disallow copy constructor. |
449 DISALLOW_COPY_AND_ASSIGN(Object); | 449 DISALLOW_COPY_AND_ASSIGN(Object); |
450 }; | 450 }; |
451 | 451 |
452 | 452 |
453 class Class : public Object { | 453 class Class : public Object { |
454 public: | 454 public: |
455 intptr_t instance_size() const { | 455 intptr_t instance_size() const { |
456 ASSERT(is_finalized() || is_prefinalized()); | 456 ASSERT(is_finalized() || is_prefinalized()); |
457 return raw_ptr()->instance_size_; | 457 return (raw_ptr()->instance_size_in_words_ * kWordSize); |
458 } | 458 } |
459 void set_instance_size(intptr_t value) const { | 459 void set_instance_size(intptr_t value_in_bytes) const { |
460 ASSERT(Utils::IsAligned(value, kObjectAlignment)); | 460 ASSERT(kWordSize != 0); |
461 raw_ptr()->instance_size_ = value; | 461 set_instance_size_in_words(value_in_bytes / kWordSize); |
462 } | 462 } |
463 static intptr_t instance_size_offset() { | 463 void set_instance_size_in_words(intptr_t value) const { |
464 return OFFSET_OF(RawClass, instance_size_); | 464 ASSERT(Utils::IsAligned((value * kWordSize), kObjectAlignment)); |
| 465 raw_ptr()->instance_size_in_words_ = value; |
465 } | 466 } |
466 | 467 |
467 intptr_t next_field_offset() const { | 468 intptr_t next_field_offset() const { |
468 return raw_ptr()->next_field_offset_; | 469 return raw_ptr()->next_field_offset_in_words_ * kWordSize; |
469 } | 470 } |
470 void set_next_field_offset(intptr_t value) const { | 471 void set_next_field_offset(intptr_t value_in_bytes) const { |
471 ASSERT((Utils::IsAligned(value, kObjectAlignment) && | 472 ASSERT(kWordSize != 0); |
472 (value == raw_ptr()->instance_size_)) || | 473 set_next_field_offset_in_words(value_in_bytes / kWordSize); |
473 (!Utils::IsAligned(value, kObjectAlignment) && | 474 } |
474 (value + kWordSize == raw_ptr()->instance_size_))); | 475 void set_next_field_offset_in_words(intptr_t value) const { |
475 raw_ptr()->next_field_offset_ = value; | 476 ASSERT((Utils::IsAligned((value * kWordSize), kObjectAlignment) && |
| 477 (value == raw_ptr()->instance_size_in_words_)) || |
| 478 (!Utils::IsAligned((value * kWordSize), kObjectAlignment) && |
| 479 ((value + 1) == raw_ptr()->instance_size_in_words_))); |
| 480 raw_ptr()->next_field_offset_in_words_ = value; |
476 } | 481 } |
477 | 482 |
478 cpp_vtable handle_vtable() const { return raw_ptr()->handle_vtable_; } | 483 cpp_vtable handle_vtable() const { return raw_ptr()->handle_vtable_; } |
479 void set_handle_vtable(cpp_vtable value) const { | 484 void set_handle_vtable(cpp_vtable value) const { |
480 raw_ptr()->handle_vtable_ = value; | 485 raw_ptr()->handle_vtable_ = value; |
481 } | 486 } |
482 | 487 |
483 intptr_t id() const { return raw_ptr()->id_; } | 488 intptr_t id() const { return raw_ptr()->id_; } |
484 void set_id(intptr_t value) const { | 489 void set_id(intptr_t value) const { |
485 raw_ptr()->id_ = value; | 490 raw_ptr()->id_ = value; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 | 540 |
536 // The type argument vector is flattened and includes the type arguments of | 541 // The type argument vector is flattened and includes the type arguments of |
537 // the super class. | 542 // the super class. |
538 bool HasTypeArguments() const; | 543 bool HasTypeArguments() const; |
539 intptr_t NumTypeArguments() const; | 544 intptr_t NumTypeArguments() const; |
540 | 545 |
541 // If this class is parameterized, each instance has a type_arguments field. | 546 // If this class is parameterized, each instance has a type_arguments field. |
542 static const intptr_t kNoTypeArguments = -1; | 547 static const intptr_t kNoTypeArguments = -1; |
543 intptr_t type_arguments_field_offset() const { | 548 intptr_t type_arguments_field_offset() const { |
544 ASSERT(is_finalized() || is_prefinalized()); | 549 ASSERT(is_finalized() || is_prefinalized()); |
545 return raw_ptr()->type_arguments_field_offset_; | 550 if (raw_ptr()->type_arguments_field_offset_in_words_ == kNoTypeArguments) { |
| 551 return kNoTypeArguments; |
| 552 } |
| 553 return raw_ptr()->type_arguments_field_offset_in_words_ * kWordSize; |
546 } | 554 } |
547 void set_type_arguments_field_offset(intptr_t value) const { | 555 void set_type_arguments_field_offset(intptr_t value_in_bytes) const { |
548 raw_ptr()->type_arguments_field_offset_ = value; | 556 intptr_t value; |
| 557 if (value_in_bytes == kNoTypeArguments) { |
| 558 value = kNoTypeArguments; |
| 559 } else { |
| 560 ASSERT(kWordSize != 0); |
| 561 value = value_in_bytes / kWordSize; |
| 562 } |
| 563 set_type_arguments_field_offset_in_words(value); |
549 } | 564 } |
550 static intptr_t type_arguments_field_offset_offset() { | 565 void set_type_arguments_field_offset_in_words(intptr_t value) const { |
551 return OFFSET_OF(RawClass, type_arguments_field_offset_); | 566 raw_ptr()->type_arguments_field_offset_in_words_ = value; |
| 567 } |
| 568 static intptr_t type_arguments_field_offset_in_words_offset() { |
| 569 return OFFSET_OF(RawClass, type_arguments_field_offset_in_words_); |
552 } | 570 } |
553 | 571 |
554 // The super type of this class, Object type if not explicitly specified. | 572 // The super type of this class, Object type if not explicitly specified. |
555 RawType* super_type() const { return raw_ptr()->super_type_; } | 573 RawType* super_type() const { return raw_ptr()->super_type_; } |
556 void set_super_type(const Type& value) const; | 574 void set_super_type(const Type& value) const; |
557 static intptr_t super_type_offset() { | 575 static intptr_t super_type_offset() { |
558 return OFFSET_OF(RawClass, super_type_); | 576 return OFFSET_OF(RawClass, super_type_); |
559 } | 577 } |
560 | 578 |
561 // Asserts that the class of the super type has been resolved. | 579 // Asserts that the class of the super type has been resolved. |
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1571 public: | 1589 public: |
1572 RawString* name() const { return raw_ptr()->name_; } | 1590 RawString* name() const { return raw_ptr()->name_; } |
1573 RawString* UserVisibleName() const; | 1591 RawString* UserVisibleName() const; |
1574 virtual RawString* DictionaryName() const { return name(); } | 1592 virtual RawString* DictionaryName() const { return name(); } |
1575 | 1593 |
1576 bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); } | 1594 bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); } |
1577 bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); } | 1595 bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); } |
1578 bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); } | 1596 bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); } |
1579 | 1597 |
1580 inline intptr_t Offset() const; | 1598 inline intptr_t Offset() const; |
1581 inline void SetOffset(intptr_t value) const; | 1599 inline void SetOffset(intptr_t value_in_bytes) const; |
1582 | 1600 |
1583 RawInstance* value() const; | 1601 RawInstance* value() const; |
1584 void set_value(const Instance& value) const; | 1602 void set_value(const Instance& value) const; |
1585 | 1603 |
1586 RawClass* owner() const { return raw_ptr()->owner_; } | 1604 RawClass* owner() const { return raw_ptr()->owner_; } |
1587 | 1605 |
1588 RawAbstractType* type() const { return raw_ptr()->type_; } | 1606 RawAbstractType* type() const { return raw_ptr()->type_; } |
1589 void set_type(const AbstractType& value) const; | 1607 void set_type(const AbstractType& value) const; |
1590 | 1608 |
1591 static intptr_t InstanceSize() { | 1609 static intptr_t InstanceSize() { |
(...skipping 4317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5909 } | 5927 } |
5910 | 5928 |
5911 | 5929 |
5912 bool Function::HasCode() const { | 5930 bool Function::HasCode() const { |
5913 return raw_ptr()->code_ != Code::null(); | 5931 return raw_ptr()->code_ != Code::null(); |
5914 } | 5932 } |
5915 | 5933 |
5916 | 5934 |
5917 intptr_t Field::Offset() const { | 5935 intptr_t Field::Offset() const { |
5918 ASSERT(!is_static()); // Offset is valid only for instance fields. | 5936 ASSERT(!is_static()); // Offset is valid only for instance fields. |
5919 return Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->value_)); | 5937 intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->value_)); |
| 5938 return (value * kWordSize); |
5920 } | 5939 } |
5921 | 5940 |
5922 | 5941 |
5923 void Field::SetOffset(intptr_t value) const { | 5942 void Field::SetOffset(intptr_t value_in_bytes) const { |
5924 ASSERT(!is_static()); // SetOffset is valid only for instance fields. | 5943 ASSERT(!is_static()); // SetOffset is valid only for instance fields. |
5925 raw_ptr()->value_ = Smi::New(value); | 5944 ASSERT(kWordSize != 0); |
| 5945 raw_ptr()->value_ = Smi::New(value_in_bytes / kWordSize); |
5926 } | 5946 } |
5927 | 5947 |
5928 | 5948 |
5929 void Context::SetAt(intptr_t index, const Instance& value) const { | 5949 void Context::SetAt(intptr_t index, const Instance& value) const { |
5930 StorePointer(InstanceAddr(index), value.raw()); | 5950 StorePointer(InstanceAddr(index), value.raw()); |
5931 } | 5951 } |
5932 | 5952 |
5933 | 5953 |
5934 intptr_t Instance::GetNativeField(Isolate* isolate, int index) const { | 5954 intptr_t Instance::GetNativeField(Isolate* isolate, int index) const { |
5935 ASSERT(IsValidNativeIndex(index)); | 5955 ASSERT(IsValidNativeIndex(index)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5968 if (this->CharAt(i) != str.CharAt(begin_index + i)) { | 5988 if (this->CharAt(i) != str.CharAt(begin_index + i)) { |
5969 return false; | 5989 return false; |
5970 } | 5990 } |
5971 } | 5991 } |
5972 return true; | 5992 return true; |
5973 } | 5993 } |
5974 | 5994 |
5975 } // namespace dart | 5995 } // namespace dart |
5976 | 5996 |
5977 #endif // VM_OBJECT_H_ | 5997 #endif // VM_OBJECT_H_ |
OLD | NEW |