| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Review notes: | 5 // Review notes: |
| 6 // | 6 // |
| 7 // - The use of macros in these inline functions may seem superfluous | 7 // - The use of macros in these inline functions may seem superfluous |
| 8 // but it is absolutely needed to make sure gcc generates optimal | 8 // but it is absolutely needed to make sure gcc generates optimal |
| 9 // code. gcc is not happy when attempting to inline too deep. | 9 // code. gcc is not happy when attempting to inline too deep. |
| 10 // | 10 // |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 } | 47 } |
| 48 | 48 |
| 49 | 49 |
| 50 int PropertyDetails::field_width_in_words() const { | 50 int PropertyDetails::field_width_in_words() const { |
| 51 DCHECK(location() == kField); | 51 DCHECK(location() == kField); |
| 52 if (!FLAG_unbox_double_fields) return 1; | 52 if (!FLAG_unbox_double_fields) return 1; |
| 53 if (kDoubleSize == kPointerSize) return 1; | 53 if (kDoubleSize == kPointerSize) return 1; |
| 54 return representation().IsDouble() ? kDoubleSize / kPointerSize : 1; | 54 return representation().IsDouble() ? kDoubleSize / kPointerSize : 1; |
| 55 } | 55 } |
| 56 | 56 |
| 57 | 57 #define TYPE_CHECKER(type, instancetype) \ |
| 58 #define TYPE_CHECKER(type, instancetype) \ | 58 bool HeapObject::Is##type() const { \ |
| 59 bool Object::Is##type() const { \ | 59 return map()->instance_type() == instancetype; \ |
| 60 return Object::IsHeapObject() && \ | |
| 61 HeapObject::cast(this)->map()->instance_type() == instancetype; \ | |
| 62 } | 60 } |
| 63 | 61 |
| 64 | |
| 65 #define CAST_ACCESSOR(type) \ | 62 #define CAST_ACCESSOR(type) \ |
| 66 type* type::cast(Object* object) { \ | 63 type* type::cast(Object* object) { \ |
| 67 SLOW_DCHECK(object->Is##type()); \ | 64 SLOW_DCHECK(object->Is##type()); \ |
| 68 return reinterpret_cast<type*>(object); \ | 65 return reinterpret_cast<type*>(object); \ |
| 69 } \ | 66 } \ |
| 70 const type* type::cast(const Object* object) { \ | 67 const type* type::cast(const Object* object) { \ |
| 71 SLOW_DCHECK(object->Is##type()); \ | 68 SLOW_DCHECK(object->Is##type()); \ |
| 72 return reinterpret_cast<const type*>(object); \ | 69 return reinterpret_cast<const type*>(object); \ |
| 73 } | 70 } |
| 74 | 71 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 | 118 |
| 122 | 119 |
| 123 #define BOOL_ACCESSORS(holder, field, name, offset) \ | 120 #define BOOL_ACCESSORS(holder, field, name, offset) \ |
| 124 bool holder::name() const { \ | 121 bool holder::name() const { \ |
| 125 return BooleanBit::get(field(), offset); \ | 122 return BooleanBit::get(field(), offset); \ |
| 126 } \ | 123 } \ |
| 127 void holder::set_##name(bool value) { \ | 124 void holder::set_##name(bool value) { \ |
| 128 set_##field(BooleanBit::set(field(), offset, value)); \ | 125 set_##field(BooleanBit::set(field(), offset, value)); \ |
| 129 } | 126 } |
| 130 | 127 |
| 131 | 128 bool HeapObject::IsFixedArrayBase() const { |
| 132 bool Object::IsFixedArrayBase() const { | |
| 133 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); | 129 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); |
| 134 } | 130 } |
| 135 | 131 |
| 136 | 132 bool HeapObject::IsFixedArray() const { |
| 137 bool Object::IsFixedArray() const { | 133 InstanceType instance_type = map()->instance_type(); |
| 138 if (!IsHeapObject()) return false; | |
| 139 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type(); | |
| 140 return instance_type == FIXED_ARRAY_TYPE || | 134 return instance_type == FIXED_ARRAY_TYPE || |
| 141 instance_type == TRANSITION_ARRAY_TYPE; | 135 instance_type == TRANSITION_ARRAY_TYPE; |
| 142 } | 136 } |
| 143 | 137 |
| 144 | 138 |
| 145 // External objects are not extensible, so the map check is enough. | 139 // External objects are not extensible, so the map check is enough. |
| 146 bool Object::IsExternal() const { | 140 bool HeapObject::IsExternal() const { |
| 147 return Object::IsHeapObject() && | 141 return map() == GetHeap()->external_map(); |
| 148 HeapObject::cast(this)->map() == | |
| 149 HeapObject::cast(this)->GetHeap()->external_map(); | |
| 150 } | 142 } |
| 151 | 143 |
| 152 | 144 |
| 153 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) | 145 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) |
| 154 TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE) | 146 TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE) |
| 155 TYPE_CHECKER(Symbol, SYMBOL_TYPE) | 147 TYPE_CHECKER(Symbol, SYMBOL_TYPE) |
| 156 TYPE_CHECKER(Simd128Value, SIMD128_VALUE_TYPE) | 148 TYPE_CHECKER(Simd128Value, SIMD128_VALUE_TYPE) |
| 157 | 149 |
| 158 | |
| 159 #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \ | 150 #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \ |
| 160 bool Object::Is##Type() const { \ | 151 bool HeapObject::Is##Type() const { return map() == GetHeap()->type##_map(); } |
| 161 return Object::IsHeapObject() && \ | |
| 162 HeapObject::cast(this)->map() == \ | |
| 163 HeapObject::cast(this)->GetHeap()->type##_map(); \ | |
| 164 } | |
| 165 SIMD128_TYPES(SIMD128_TYPE_CHECKER) | 152 SIMD128_TYPES(SIMD128_TYPE_CHECKER) |
| 166 #undef SIMD128_TYPE_CHECKER | 153 #undef SIMD128_TYPE_CHECKER |
| 167 | 154 |
| 155 #define IS_TYPE_FUNCTION_DEF(type_) \ |
| 156 bool Object::Is##type_() const { \ |
| 157 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \ |
| 158 } |
| 159 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF) |
| 160 ODDBALL_LIST(IS_TYPE_FUNCTION_DEF) |
| 161 #undef IS_TYPE_FUNCTION_DEF |
| 168 | 162 |
| 169 bool Object::IsString() const { | 163 bool HeapObject::IsString() const { |
| 170 return Object::IsHeapObject() | 164 return map()->instance_type() < FIRST_NONSTRING_TYPE; |
| 171 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; | |
| 172 } | 165 } |
| 173 | 166 |
| 174 | 167 bool HeapObject::IsName() const { |
| 175 bool Object::IsName() const { | 168 return map()->instance_type() <= LAST_NAME_TYPE; |
| 176 STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE); | |
| 177 return Object::IsHeapObject() && | |
| 178 HeapObject::cast(this)->map()->instance_type() <= LAST_NAME_TYPE; | |
| 179 } | 169 } |
| 180 | 170 |
| 181 | 171 bool HeapObject::IsUniqueName() const { |
| 182 bool Object::IsUniqueName() const { | |
| 183 return IsInternalizedString() || IsSymbol(); | 172 return IsInternalizedString() || IsSymbol(); |
| 184 } | 173 } |
| 185 | 174 |
| 186 | 175 bool HeapObject::IsFunction() const { |
| 187 bool Object::IsFunction() const { | |
| 188 STATIC_ASSERT(LAST_FUNCTION_TYPE == LAST_TYPE); | 176 STATIC_ASSERT(LAST_FUNCTION_TYPE == LAST_TYPE); |
| 189 return Object::IsHeapObject() && | 177 return map()->instance_type() >= FIRST_FUNCTION_TYPE; |
| 190 HeapObject::cast(this)->map()->instance_type() >= FIRST_FUNCTION_TYPE; | |
| 191 } | 178 } |
| 192 | 179 |
| 180 bool HeapObject::IsCallable() const { return map()->is_callable(); } |
| 193 | 181 |
| 194 bool Object::IsCallable() const { | 182 bool HeapObject::IsConstructor() const { return map()->is_constructor(); } |
| 195 return Object::IsHeapObject() && HeapObject::cast(this)->map()->is_callable(); | |
| 196 } | |
| 197 | 183 |
| 198 | 184 bool HeapObject::IsTemplateInfo() const { |
| 199 bool Object::IsConstructor() const { | |
| 200 return Object::IsHeapObject() && | |
| 201 HeapObject::cast(this)->map()->is_constructor(); | |
| 202 } | |
| 203 | |
| 204 | |
| 205 bool Object::IsTemplateInfo() const { | |
| 206 return IsObjectTemplateInfo() || IsFunctionTemplateInfo(); | 185 return IsObjectTemplateInfo() || IsFunctionTemplateInfo(); |
| 207 } | 186 } |
| 208 | 187 |
| 209 | 188 bool HeapObject::IsInternalizedString() const { |
| 210 bool Object::IsInternalizedString() const { | 189 uint32_t type = map()->instance_type(); |
| 211 if (!this->IsHeapObject()) return false; | |
| 212 uint32_t type = HeapObject::cast(this)->map()->instance_type(); | |
| 213 STATIC_ASSERT(kNotInternalizedTag != 0); | 190 STATIC_ASSERT(kNotInternalizedTag != 0); |
| 214 return (type & (kIsNotStringMask | kIsNotInternalizedMask)) == | 191 return (type & (kIsNotStringMask | kIsNotInternalizedMask)) == |
| 215 (kStringTag | kInternalizedTag); | 192 (kStringTag | kInternalizedTag); |
| 216 } | 193 } |
| 217 | 194 |
| 218 | 195 bool HeapObject::IsConsString() const { |
| 219 bool Object::IsConsString() const { | |
| 220 if (!IsString()) return false; | 196 if (!IsString()) return false; |
| 221 return StringShape(String::cast(this)).IsCons(); | 197 return StringShape(String::cast(this)).IsCons(); |
| 222 } | 198 } |
| 223 | 199 |
| 224 | 200 bool HeapObject::IsSlicedString() const { |
| 225 bool Object::IsSlicedString() const { | |
| 226 if (!IsString()) return false; | 201 if (!IsString()) return false; |
| 227 return StringShape(String::cast(this)).IsSliced(); | 202 return StringShape(String::cast(this)).IsSliced(); |
| 228 } | 203 } |
| 229 | 204 |
| 230 | 205 bool HeapObject::IsSeqString() const { |
| 231 bool Object::IsSeqString() const { | |
| 232 if (!IsString()) return false; | 206 if (!IsString()) return false; |
| 233 return StringShape(String::cast(this)).IsSequential(); | 207 return StringShape(String::cast(this)).IsSequential(); |
| 234 } | 208 } |
| 235 | 209 |
| 236 | 210 bool HeapObject::IsSeqOneByteString() const { |
| 237 bool Object::IsSeqOneByteString() const { | |
| 238 if (!IsString()) return false; | 211 if (!IsString()) return false; |
| 239 return StringShape(String::cast(this)).IsSequential() && | 212 return StringShape(String::cast(this)).IsSequential() && |
| 240 String::cast(this)->IsOneByteRepresentation(); | 213 String::cast(this)->IsOneByteRepresentation(); |
| 241 } | 214 } |
| 242 | 215 |
| 243 | 216 bool HeapObject::IsSeqTwoByteString() const { |
| 244 bool Object::IsSeqTwoByteString() const { | |
| 245 if (!IsString()) return false; | 217 if (!IsString()) return false; |
| 246 return StringShape(String::cast(this)).IsSequential() && | 218 return StringShape(String::cast(this)).IsSequential() && |
| 247 String::cast(this)->IsTwoByteRepresentation(); | 219 String::cast(this)->IsTwoByteRepresentation(); |
| 248 } | 220 } |
| 249 | 221 |
| 250 | 222 bool HeapObject::IsExternalString() const { |
| 251 bool Object::IsExternalString() const { | |
| 252 if (!IsString()) return false; | 223 if (!IsString()) return false; |
| 253 return StringShape(String::cast(this)).IsExternal(); | 224 return StringShape(String::cast(this)).IsExternal(); |
| 254 } | 225 } |
| 255 | 226 |
| 256 | 227 bool HeapObject::IsExternalOneByteString() const { |
| 257 bool Object::IsExternalOneByteString() const { | |
| 258 if (!IsString()) return false; | 228 if (!IsString()) return false; |
| 259 return StringShape(String::cast(this)).IsExternal() && | 229 return StringShape(String::cast(this)).IsExternal() && |
| 260 String::cast(this)->IsOneByteRepresentation(); | 230 String::cast(this)->IsOneByteRepresentation(); |
| 261 } | 231 } |
| 262 | 232 |
| 263 | 233 bool HeapObject::IsExternalTwoByteString() const { |
| 264 bool Object::IsExternalTwoByteString() const { | |
| 265 if (!IsString()) return false; | 234 if (!IsString()) return false; |
| 266 return StringShape(String::cast(this)).IsExternal() && | 235 return StringShape(String::cast(this)).IsExternal() && |
| 267 String::cast(this)->IsTwoByteRepresentation(); | 236 String::cast(this)->IsTwoByteRepresentation(); |
| 268 } | 237 } |
| 269 | 238 |
| 270 | 239 |
| 271 bool Object::HasValidElements() { | 240 bool Object::HasValidElements() { |
| 272 // Dictionary is covered under FixedArray. | 241 // Dictionary is covered under FixedArray. |
| 273 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); | 242 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); |
| 274 } | 243 } |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 | 623 |
| 655 bool Object::IsNumber() const { | 624 bool Object::IsNumber() const { |
| 656 return IsSmi() || IsHeapNumber(); | 625 return IsSmi() || IsHeapNumber(); |
| 657 } | 626 } |
| 658 | 627 |
| 659 | 628 |
| 660 TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) | 629 TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) |
| 661 TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE) | 630 TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE) |
| 662 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) | 631 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) |
| 663 | 632 |
| 664 | 633 bool HeapObject::IsFiller() const { |
| 665 bool Object::IsFiller() const { | 634 InstanceType instance_type = map()->instance_type(); |
| 666 if (!Object::IsHeapObject()) return false; | |
| 667 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type(); | |
| 668 return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE; | 635 return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE; |
| 669 } | 636 } |
| 670 | 637 |
| 671 | 638 |
| 672 | 639 |
| 673 #define TYPED_ARRAY_TYPE_CHECKER(Type, type, TYPE, ctype, size) \ | 640 #define TYPED_ARRAY_TYPE_CHECKER(Type, type, TYPE, ctype, size) \ |
| 674 TYPE_CHECKER(Fixed##Type##Array, FIXED_##TYPE##_ARRAY_TYPE) | 641 TYPE_CHECKER(Fixed##Type##Array, FIXED_##TYPE##_ARRAY_TYPE) |
| 675 | 642 |
| 676 TYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER) | 643 TYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER) |
| 677 #undef TYPED_ARRAY_TYPE_CHECKER | 644 #undef TYPED_ARRAY_TYPE_CHECKER |
| 678 | 645 |
| 679 | 646 bool HeapObject::IsFixedTypedArrayBase() const { |
| 680 bool Object::IsFixedTypedArrayBase() const { | 647 InstanceType instance_type = map()->instance_type(); |
| 681 if (!Object::IsHeapObject()) return false; | |
| 682 | |
| 683 InstanceType instance_type = | |
| 684 HeapObject::cast(this)->map()->instance_type(); | |
| 685 return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && | 648 return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && |
| 686 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE); | 649 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE); |
| 687 } | 650 } |
| 688 | 651 |
| 689 | 652 bool HeapObject::IsJSReceiver() const { |
| 690 bool Object::IsJSReceiver() const { | |
| 691 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | 653 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
| 692 return IsHeapObject() && | 654 return map()->instance_type() >= FIRST_JS_RECEIVER_TYPE; |
| 693 HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE; | |
| 694 } | 655 } |
| 695 | 656 |
| 696 | 657 bool HeapObject::IsJSObject() const { |
| 697 bool Object::IsJSObject() const { | |
| 698 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 658 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); |
| 699 return IsHeapObject() && HeapObject::cast(this)->map()->IsJSObjectMap(); | 659 return map()->IsJSObjectMap(); |
| 700 } | 660 } |
| 701 | 661 |
| 702 | 662 bool HeapObject::IsJSProxy() const { return map()->IsJSProxyMap(); } |
| 703 bool Object::IsJSProxy() const { | |
| 704 if (!Object::IsHeapObject()) return false; | |
| 705 return HeapObject::cast(this)->map()->IsJSProxyMap(); | |
| 706 } | |
| 707 | |
| 708 | 663 |
| 709 TYPE_CHECKER(JSSet, JS_SET_TYPE) | 664 TYPE_CHECKER(JSSet, JS_SET_TYPE) |
| 710 TYPE_CHECKER(JSMap, JS_MAP_TYPE) | 665 TYPE_CHECKER(JSMap, JS_MAP_TYPE) |
| 711 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) | 666 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) |
| 712 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE) | 667 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE) |
| 713 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) | 668 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) |
| 714 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE) | 669 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE) |
| 715 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) | 670 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) |
| 716 TYPE_CHECKER(Map, MAP_TYPE) | 671 TYPE_CHECKER(Map, MAP_TYPE) |
| 717 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) | 672 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) |
| 718 TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE) | 673 TYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE) |
| 719 TYPE_CHECKER(TransitionArray, TRANSITION_ARRAY_TYPE) | 674 TYPE_CHECKER(TransitionArray, TRANSITION_ARRAY_TYPE) |
| 720 | 675 |
| 721 | 676 bool HeapObject::IsJSWeakCollection() const { |
| 722 bool Object::IsJSWeakCollection() const { | |
| 723 return IsJSWeakMap() || IsJSWeakSet(); | 677 return IsJSWeakMap() || IsJSWeakSet(); |
| 724 } | 678 } |
| 725 | 679 |
| 680 bool HeapObject::IsDescriptorArray() const { return IsFixedArray(); } |
| 726 | 681 |
| 727 bool Object::IsDescriptorArray() const { | 682 bool HeapObject::IsArrayList() const { return IsFixedArray(); } |
| 728 return IsFixedArray(); | |
| 729 } | |
| 730 | |
| 731 | |
| 732 bool Object::IsArrayList() const { return IsFixedArray(); } | |
| 733 | |
| 734 | 683 |
| 735 bool Object::IsLayoutDescriptor() const { | 684 bool Object::IsLayoutDescriptor() const { |
| 736 return IsSmi() || IsFixedTypedArrayBase(); | 685 return IsSmi() || IsFixedTypedArrayBase(); |
| 737 } | 686 } |
| 738 | 687 |
| 688 bool HeapObject::IsTypeFeedbackVector() const { return IsFixedArray(); } |
| 739 | 689 |
| 740 bool Object::IsTypeFeedbackVector() const { return IsFixedArray(); } | 690 bool HeapObject::IsTypeFeedbackMetadata() const { return IsFixedArray(); } |
| 741 | 691 |
| 692 bool HeapObject::IsLiteralsArray() const { return IsFixedArray(); } |
| 742 | 693 |
| 743 bool Object::IsTypeFeedbackMetadata() const { return IsFixedArray(); } | 694 bool HeapObject::IsDeoptimizationInputData() const { |
| 744 | |
| 745 | |
| 746 bool Object::IsLiteralsArray() const { return IsFixedArray(); } | |
| 747 | |
| 748 | |
| 749 bool Object::IsDeoptimizationInputData() const { | |
| 750 // Must be a fixed array. | 695 // Must be a fixed array. |
| 751 if (!IsFixedArray()) return false; | 696 if (!IsFixedArray()) return false; |
| 752 | 697 |
| 753 // There's no sure way to detect the difference between a fixed array and | 698 // There's no sure way to detect the difference between a fixed array and |
| 754 // a deoptimization data array. Since this is used for asserts we can | 699 // a deoptimization data array. Since this is used for asserts we can |
| 755 // check that the length is zero or else the fixed size plus a multiple of | 700 // check that the length is zero or else the fixed size plus a multiple of |
| 756 // the entry size. | 701 // the entry size. |
| 757 int length = FixedArray::cast(this)->length(); | 702 int length = FixedArray::cast(this)->length(); |
| 758 if (length == 0) return true; | 703 if (length == 0) return true; |
| 759 | 704 |
| 760 length -= DeoptimizationInputData::kFirstDeoptEntryIndex; | 705 length -= DeoptimizationInputData::kFirstDeoptEntryIndex; |
| 761 return length >= 0 && length % DeoptimizationInputData::kDeoptEntrySize == 0; | 706 return length >= 0 && length % DeoptimizationInputData::kDeoptEntrySize == 0; |
| 762 } | 707 } |
| 763 | 708 |
| 764 | 709 bool HeapObject::IsDeoptimizationOutputData() const { |
| 765 bool Object::IsDeoptimizationOutputData() const { | |
| 766 if (!IsFixedArray()) return false; | 710 if (!IsFixedArray()) return false; |
| 767 // There's actually no way to see the difference between a fixed array and | 711 // There's actually no way to see the difference between a fixed array and |
| 768 // a deoptimization data array. Since this is used for asserts we can check | 712 // a deoptimization data array. Since this is used for asserts we can check |
| 769 // that the length is plausible though. | 713 // that the length is plausible though. |
| 770 if (FixedArray::cast(this)->length() % 2 != 0) return false; | 714 if (FixedArray::cast(this)->length() % 2 != 0) return false; |
| 771 return true; | 715 return true; |
| 772 } | 716 } |
| 773 | 717 |
| 774 | 718 bool HeapObject::IsHandlerTable() const { |
| 775 bool Object::IsHandlerTable() const { | |
| 776 if (!IsFixedArray()) return false; | 719 if (!IsFixedArray()) return false; |
| 777 // There's actually no way to see the difference between a fixed array and | 720 // There's actually no way to see the difference between a fixed array and |
| 778 // a handler table array. | 721 // a handler table array. |
| 779 return true; | 722 return true; |
| 780 } | 723 } |
| 781 | 724 |
| 782 | 725 bool HeapObject::IsDependentCode() const { |
| 783 bool Object::IsDependentCode() const { | |
| 784 if (!IsFixedArray()) return false; | 726 if (!IsFixedArray()) return false; |
| 785 // There's actually no way to see the difference between a fixed array and | 727 // There's actually no way to see the difference between a fixed array and |
| 786 // a dependent codes array. | 728 // a dependent codes array. |
| 787 return true; | 729 return true; |
| 788 } | 730 } |
| 789 | 731 |
| 790 | 732 bool HeapObject::IsContext() const { |
| 791 bool Object::IsContext() const { | 733 Map* map = this->map(); |
| 792 if (!Object::IsHeapObject()) return false; | 734 Heap* heap = GetHeap(); |
| 793 Map* map = HeapObject::cast(this)->map(); | |
| 794 Heap* heap = map->GetHeap(); | |
| 795 return (map == heap->function_context_map() || | 735 return (map == heap->function_context_map() || |
| 796 map == heap->catch_context_map() || | 736 map == heap->catch_context_map() || |
| 797 map == heap->with_context_map() || | 737 map == heap->with_context_map() || |
| 798 map == heap->native_context_map() || | 738 map == heap->native_context_map() || |
| 799 map == heap->block_context_map() || | 739 map == heap->block_context_map() || |
| 800 map == heap->module_context_map() || | 740 map == heap->module_context_map() || |
| 801 map == heap->script_context_map()); | 741 map == heap->script_context_map()); |
| 802 } | 742 } |
| 803 | 743 |
| 744 bool HeapObject::IsNativeContext() const { |
| 745 return map() == GetHeap()->native_context_map(); |
| 746 } |
| 804 | 747 |
| 805 bool Object::IsNativeContext() const { | 748 bool HeapObject::IsScriptContextTable() const { |
| 806 return Object::IsHeapObject() && | 749 return map() == GetHeap()->script_context_table_map(); |
| 807 HeapObject::cast(this)->map() == | 750 } |
| 808 HeapObject::cast(this)->GetHeap()->native_context_map(); | 751 |
| 752 bool HeapObject::IsScopeInfo() const { |
| 753 return map() == GetHeap()->scope_info_map(); |
| 809 } | 754 } |
| 810 | 755 |
| 811 | 756 |
| 812 bool Object::IsScriptContextTable() const { | |
| 813 if (!Object::IsHeapObject()) return false; | |
| 814 Map* map = HeapObject::cast(this)->map(); | |
| 815 Heap* heap = map->GetHeap(); | |
| 816 return map == heap->script_context_table_map(); | |
| 817 } | |
| 818 | |
| 819 | |
| 820 bool Object::IsScopeInfo() const { | |
| 821 return Object::IsHeapObject() && | |
| 822 HeapObject::cast(this)->map() == | |
| 823 HeapObject::cast(this)->GetHeap()->scope_info_map(); | |
| 824 } | |
| 825 | |
| 826 | |
| 827 TYPE_CHECKER(JSBoundFunction, JS_BOUND_FUNCTION_TYPE) | 757 TYPE_CHECKER(JSBoundFunction, JS_BOUND_FUNCTION_TYPE) |
| 828 TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE) | 758 TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE) |
| 829 | 759 |
| 830 | 760 |
| 831 template <> inline bool Is<JSFunction>(Object* obj) { | 761 template <> inline bool Is<JSFunction>(Object* obj) { |
| 832 return obj->IsJSFunction(); | 762 return obj->IsJSFunction(); |
| 833 } | 763 } |
| 834 | 764 |
| 835 | 765 |
| 836 TYPE_CHECKER(Code, CODE_TYPE) | 766 TYPE_CHECKER(Code, CODE_TYPE) |
| 837 TYPE_CHECKER(Oddball, ODDBALL_TYPE) | 767 TYPE_CHECKER(Oddball, ODDBALL_TYPE) |
| 838 TYPE_CHECKER(Cell, CELL_TYPE) | 768 TYPE_CHECKER(Cell, CELL_TYPE) |
| 839 TYPE_CHECKER(PropertyCell, PROPERTY_CELL_TYPE) | 769 TYPE_CHECKER(PropertyCell, PROPERTY_CELL_TYPE) |
| 840 TYPE_CHECKER(WeakCell, WEAK_CELL_TYPE) | 770 TYPE_CHECKER(WeakCell, WEAK_CELL_TYPE) |
| 841 TYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE) | 771 TYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE) |
| 842 TYPE_CHECKER(JSGeneratorObject, JS_GENERATOR_OBJECT_TYPE) | 772 TYPE_CHECKER(JSGeneratorObject, JS_GENERATOR_OBJECT_TYPE) |
| 843 TYPE_CHECKER(JSModule, JS_MODULE_TYPE) | 773 TYPE_CHECKER(JSModule, JS_MODULE_TYPE) |
| 844 TYPE_CHECKER(JSValue, JS_VALUE_TYPE) | 774 TYPE_CHECKER(JSValue, JS_VALUE_TYPE) |
| 845 TYPE_CHECKER(JSDate, JS_DATE_TYPE) | 775 TYPE_CHECKER(JSDate, JS_DATE_TYPE) |
| 846 TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE) | 776 TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE) |
| 847 | 777 |
| 848 bool Object::IsAbstractCode() const { return IsBytecodeArray() || IsCode(); } | 778 bool HeapObject::IsAbstractCode() const { |
| 779 return IsBytecodeArray() || IsCode(); |
| 780 } |
| 849 | 781 |
| 850 bool Object::IsStringWrapper() const { | 782 bool HeapObject::IsStringWrapper() const { |
| 851 return IsJSValue() && JSValue::cast(this)->value()->IsString(); | 783 return IsJSValue() && JSValue::cast(this)->value()->IsString(); |
| 852 } | 784 } |
| 853 | 785 |
| 854 | 786 |
| 855 TYPE_CHECKER(Foreign, FOREIGN_TYPE) | 787 TYPE_CHECKER(Foreign, FOREIGN_TYPE) |
| 856 | 788 |
| 857 | 789 bool HeapObject::IsBoolean() const { |
| 858 bool Object::IsBoolean() const { | |
| 859 return IsOddball() && | 790 return IsOddball() && |
| 860 ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0); | 791 ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0); |
| 861 } | 792 } |
| 862 | 793 |
| 863 | 794 |
| 864 TYPE_CHECKER(JSArray, JS_ARRAY_TYPE) | 795 TYPE_CHECKER(JSArray, JS_ARRAY_TYPE) |
| 865 TYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE) | 796 TYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE) |
| 866 TYPE_CHECKER(JSTypedArray, JS_TYPED_ARRAY_TYPE) | 797 TYPE_CHECKER(JSTypedArray, JS_TYPED_ARRAY_TYPE) |
| 867 TYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE) | 798 TYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE) |
| 868 | 799 |
| 869 | 800 bool HeapObject::IsJSArrayBufferView() const { |
| 870 bool Object::IsJSArrayBufferView() const { | |
| 871 return IsJSDataView() || IsJSTypedArray(); | 801 return IsJSDataView() || IsJSTypedArray(); |
| 872 } | 802 } |
| 873 | 803 |
| 874 | 804 |
| 875 TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE) | 805 TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE) |
| 876 | 806 |
| 877 | 807 |
| 878 template <> inline bool Is<JSArray>(Object* obj) { | 808 template <> inline bool Is<JSArray>(Object* obj) { |
| 879 return obj->IsJSArray(); | 809 return obj->IsJSArray(); |
| 880 } | 810 } |
| 881 | 811 |
| 812 bool HeapObject::IsHashTable() const { |
| 813 return map() == GetHeap()->hash_table_map(); |
| 814 } |
| 882 | 815 |
| 883 bool Object::IsHashTable() const { | 816 bool HeapObject::IsWeakHashTable() const { return IsHashTable(); } |
| 884 return Object::IsHeapObject() && | 817 |
| 885 HeapObject::cast(this)->map() == | 818 bool HeapObject::IsDictionary() const { |
| 886 HeapObject::cast(this)->GetHeap()->hash_table_map(); | 819 return IsHashTable() && this != GetHeap()->string_table(); |
| 887 } | 820 } |
| 888 | 821 |
| 889 | 822 |
| 890 bool Object::IsWeakHashTable() const { | |
| 891 return IsHashTable(); | |
| 892 } | |
| 893 | |
| 894 | |
| 895 bool Object::IsDictionary() const { | |
| 896 return IsHashTable() && | |
| 897 this != HeapObject::cast(this)->GetHeap()->string_table(); | |
| 898 } | |
| 899 | |
| 900 | |
| 901 bool Object::IsNameDictionary() const { | 823 bool Object::IsNameDictionary() const { |
| 902 return IsDictionary(); | 824 return IsDictionary(); |
| 903 } | 825 } |
| 904 | 826 |
| 905 | 827 |
| 906 bool Object::IsGlobalDictionary() const { return IsDictionary(); } | 828 bool Object::IsGlobalDictionary() const { return IsDictionary(); } |
| 907 | 829 |
| 908 | 830 |
| 909 bool Object::IsSeededNumberDictionary() const { | 831 bool Object::IsSeededNumberDictionary() const { |
| 910 return IsDictionary(); | 832 return IsDictionary(); |
| 911 } | 833 } |
| 912 | 834 |
| 913 | 835 |
| 914 bool Object::IsUnseededNumberDictionary() const { | 836 bool Object::IsUnseededNumberDictionary() const { |
| 915 return IsDictionary(); | 837 return IsDictionary(); |
| 916 } | 838 } |
| 917 | 839 |
| 840 bool HeapObject::IsStringTable() const { return IsHashTable(); } |
| 918 | 841 |
| 919 bool Object::IsStringTable() const { | 842 bool HeapObject::IsNormalizedMapCache() const { |
| 920 return IsHashTable(); | |
| 921 } | |
| 922 | |
| 923 | |
| 924 bool Object::IsNormalizedMapCache() const { | |
| 925 return NormalizedMapCache::IsNormalizedMapCache(this); | 843 return NormalizedMapCache::IsNormalizedMapCache(this); |
| 926 } | 844 } |
| 927 | 845 |
| 928 | 846 |
| 929 int NormalizedMapCache::GetIndex(Handle<Map> map) { | 847 int NormalizedMapCache::GetIndex(Handle<Map> map) { |
| 930 return map->Hash() % NormalizedMapCache::kEntries; | 848 return map->Hash() % NormalizedMapCache::kEntries; |
| 931 } | 849 } |
| 932 | 850 |
| 933 | 851 bool NormalizedMapCache::IsNormalizedMapCache(const HeapObject* obj) { |
| 934 bool NormalizedMapCache::IsNormalizedMapCache(const Object* obj) { | |
| 935 if (!obj->IsFixedArray()) return false; | 852 if (!obj->IsFixedArray()) return false; |
| 936 if (FixedArray::cast(obj)->length() != NormalizedMapCache::kEntries) { | 853 if (FixedArray::cast(obj)->length() != NormalizedMapCache::kEntries) { |
| 937 return false; | 854 return false; |
| 938 } | 855 } |
| 939 #ifdef VERIFY_HEAP | 856 #ifdef VERIFY_HEAP |
| 940 if (FLAG_verify_heap) { | 857 if (FLAG_verify_heap) { |
| 941 reinterpret_cast<NormalizedMapCache*>(const_cast<Object*>(obj))-> | 858 reinterpret_cast<NormalizedMapCache*>(const_cast<HeapObject*>(obj)) |
| 942 NormalizedMapCacheVerify(); | 859 ->NormalizedMapCacheVerify(); |
| 943 } | 860 } |
| 944 #endif | 861 #endif |
| 945 return true; | 862 return true; |
| 946 } | 863 } |
| 947 | 864 |
| 865 bool HeapObject::IsCompilationCacheTable() const { return IsHashTable(); } |
| 948 | 866 |
| 949 bool Object::IsCompilationCacheTable() const { | 867 bool HeapObject::IsCodeCacheHashTable() const { return IsHashTable(); } |
| 868 |
| 869 bool HeapObject::IsPolymorphicCodeCacheHashTable() const { |
| 950 return IsHashTable(); | 870 return IsHashTable(); |
| 951 } | 871 } |
| 952 | 872 |
| 873 bool HeapObject::IsMapCache() const { return IsHashTable(); } |
| 953 | 874 |
| 954 bool Object::IsCodeCacheHashTable() const { | 875 bool HeapObject::IsObjectHashTable() const { return IsHashTable(); } |
| 955 return IsHashTable(); | 876 |
| 877 bool HeapObject::IsOrderedHashTable() const { |
| 878 return map() == GetHeap()->ordered_hash_table_map(); |
| 956 } | 879 } |
| 957 | 880 |
| 958 | 881 |
| 959 bool Object::IsPolymorphicCodeCacheHashTable() const { | |
| 960 return IsHashTable(); | |
| 961 } | |
| 962 | |
| 963 | |
| 964 bool Object::IsMapCache() const { | |
| 965 return IsHashTable(); | |
| 966 } | |
| 967 | |
| 968 | |
| 969 bool Object::IsObjectHashTable() const { | |
| 970 return IsHashTable(); | |
| 971 } | |
| 972 | |
| 973 | |
| 974 bool Object::IsOrderedHashTable() const { | |
| 975 return IsHeapObject() && | |
| 976 HeapObject::cast(this)->map() == | |
| 977 HeapObject::cast(this)->GetHeap()->ordered_hash_table_map(); | |
| 978 } | |
| 979 | |
| 980 | |
| 981 bool Object::IsOrderedHashSet() const { | 882 bool Object::IsOrderedHashSet() const { |
| 982 return IsOrderedHashTable(); | 883 return IsOrderedHashTable(); |
| 983 } | 884 } |
| 984 | 885 |
| 985 | 886 |
| 986 bool Object::IsOrderedHashMap() const { | 887 bool Object::IsOrderedHashMap() const { |
| 987 return IsOrderedHashTable(); | 888 return IsOrderedHashTable(); |
| 988 } | 889 } |
| 989 | 890 |
| 990 | 891 |
| 991 bool Object::IsPrimitive() const { | 892 bool Object::IsPrimitive() const { |
| 992 return IsSmi() || HeapObject::cast(this)->map()->IsPrimitiveMap(); | 893 return IsSmi() || HeapObject::cast(this)->map()->IsPrimitiveMap(); |
| 993 } | 894 } |
| 994 | 895 |
| 995 | 896 bool HeapObject::IsJSGlobalProxy() const { |
| 996 bool Object::IsJSGlobalProxy() const { | 897 bool result = map()->instance_type() == JS_GLOBAL_PROXY_TYPE; |
| 997 bool result = IsHeapObject() && | 898 DCHECK(!result || map()->is_access_check_needed()); |
| 998 (HeapObject::cast(this)->map()->instance_type() == | |
| 999 JS_GLOBAL_PROXY_TYPE); | |
| 1000 DCHECK(!result || | |
| 1001 HeapObject::cast(this)->map()->is_access_check_needed()); | |
| 1002 return result; | 899 return result; |
| 1003 } | 900 } |
| 1004 | 901 |
| 1005 | 902 |
| 1006 TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE) | 903 TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE) |
| 1007 | 904 |
| 1008 | 905 bool HeapObject::IsUndetectableObject() const { |
| 1009 bool Object::IsUndetectableObject() const { | 906 return map()->is_undetectable(); |
| 1010 return IsHeapObject() | |
| 1011 && HeapObject::cast(this)->map()->is_undetectable(); | |
| 1012 } | 907 } |
| 1013 | 908 |
| 1014 | 909 bool HeapObject::IsAccessCheckNeeded() const { |
| 1015 bool Object::IsAccessCheckNeeded() const { | |
| 1016 if (!IsHeapObject()) return false; | |
| 1017 if (IsJSGlobalProxy()) { | 910 if (IsJSGlobalProxy()) { |
| 1018 const JSGlobalProxy* proxy = JSGlobalProxy::cast(this); | 911 const JSGlobalProxy* proxy = JSGlobalProxy::cast(this); |
| 1019 JSGlobalObject* global = proxy->GetIsolate()->context()->global_object(); | 912 JSGlobalObject* global = proxy->GetIsolate()->context()->global_object(); |
| 1020 return proxy->IsDetachedFrom(global); | 913 return proxy->IsDetachedFrom(global); |
| 1021 } | 914 } |
| 1022 return HeapObject::cast(this)->map()->is_access_check_needed(); | 915 return map()->is_access_check_needed(); |
| 1023 } | 916 } |
| 1024 | 917 |
| 1025 | 918 bool HeapObject::IsStruct() const { |
| 1026 bool Object::IsStruct() const { | 919 switch (map()->instance_type()) { |
| 1027 if (!IsHeapObject()) return false; | |
| 1028 switch (HeapObject::cast(this)->map()->instance_type()) { | |
| 1029 #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true; | 920 #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true; |
| 1030 STRUCT_LIST(MAKE_STRUCT_CASE) | 921 STRUCT_LIST(MAKE_STRUCT_CASE) |
| 1031 #undef MAKE_STRUCT_CASE | 922 #undef MAKE_STRUCT_CASE |
| 1032 default: return false; | 923 default: return false; |
| 1033 } | 924 } |
| 1034 } | 925 } |
| 1035 | 926 |
| 1036 | 927 #define MAKE_STRUCT_PREDICATE(NAME, Name, name) \ |
| 1037 #define MAKE_STRUCT_PREDICATE(NAME, Name, name) \ | 928 bool Object::Is##Name() const { \ |
| 1038 bool Object::Is##Name() const { \ | 929 return IsHeapObject() && HeapObject::cast(this)->Is##Name(); \ |
| 1039 return Object::IsHeapObject() \ | 930 } \ |
| 1040 && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \ | 931 bool HeapObject::Is##Name() const { \ |
| 932 return map()->instance_type() == NAME##_TYPE; \ |
| 1041 } | 933 } |
| 1042 STRUCT_LIST(MAKE_STRUCT_PREDICATE) | 934 STRUCT_LIST(MAKE_STRUCT_PREDICATE) |
| 1043 #undef MAKE_STRUCT_PREDICATE | 935 #undef MAKE_STRUCT_PREDICATE |
| 1044 | 936 |
| 937 #define MAKE_ODDBALL_PREDICATE(Name) \ |
| 938 bool HeapObject::Is##Name() const { \ |
| 939 return IsOddball() && Oddball::cast(this)->kind() == Oddball::k##Name; \ |
| 940 } |
| 941 ODDBALL_LIST(MAKE_ODDBALL_PREDICATE) |
| 1045 | 942 |
| 1046 bool Object::IsUndefined() const { | 943 #undef MAKE_ODDBALL_PREDICATE |
| 1047 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined; | |
| 1048 } | |
| 1049 | |
| 1050 | |
| 1051 bool Object::IsNull() const { | |
| 1052 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull; | |
| 1053 } | |
| 1054 | |
| 1055 | |
| 1056 bool Object::IsTheHole() const { | |
| 1057 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole; | |
| 1058 } | |
| 1059 | |
| 1060 | |
| 1061 bool Object::IsException() const { | |
| 1062 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kException; | |
| 1063 } | |
| 1064 | |
| 1065 | |
| 1066 bool Object::IsUninitialized() const { | |
| 1067 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUninitialized; | |
| 1068 } | |
| 1069 | |
| 1070 | |
| 1071 bool Object::IsTrue() const { | |
| 1072 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue; | |
| 1073 } | |
| 1074 | |
| 1075 | |
| 1076 bool Object::IsFalse() const { | |
| 1077 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse; | |
| 1078 } | |
| 1079 | |
| 1080 | |
| 1081 bool Object::IsArgumentsMarker() const { | |
| 1082 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker; | |
| 1083 } | |
| 1084 | |
| 1085 | |
| 1086 double Object::Number() const { | 944 double Object::Number() const { |
| 1087 DCHECK(IsNumber()); | 945 DCHECK(IsNumber()); |
| 1088 return IsSmi() | 946 return IsSmi() |
| 1089 ? static_cast<double>(reinterpret_cast<const Smi*>(this)->value()) | 947 ? static_cast<double>(reinterpret_cast<const Smi*>(this)->value()) |
| 1090 : reinterpret_cast<const HeapNumber*>(this)->value(); | 948 : reinterpret_cast<const HeapNumber*>(this)->value(); |
| 1091 } | 949 } |
| 1092 | 950 |
| 1093 | 951 |
| 1094 bool Object::IsNaN() const { | 952 bool Object::IsNaN() const { |
| 1095 return this->IsHeapNumber() && std::isnan(HeapNumber::cast(this)->value()); | 953 return this->IsHeapNumber() && std::isnan(HeapNumber::cast(this)->value()); |
| (...skipping 5663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6759 bool JSObject::HasSlowStringWrapperElements() { | 6617 bool JSObject::HasSlowStringWrapperElements() { |
| 6760 return GetElementsKind() == SLOW_STRING_WRAPPER_ELEMENTS; | 6618 return GetElementsKind() == SLOW_STRING_WRAPPER_ELEMENTS; |
| 6761 } | 6619 } |
| 6762 | 6620 |
| 6763 bool JSObject::HasFixedTypedArrayElements() { | 6621 bool JSObject::HasFixedTypedArrayElements() { |
| 6764 HeapObject* array = elements(); | 6622 HeapObject* array = elements(); |
| 6765 DCHECK(array != NULL); | 6623 DCHECK(array != NULL); |
| 6766 return array->IsFixedTypedArrayBase(); | 6624 return array->IsFixedTypedArrayBase(); |
| 6767 } | 6625 } |
| 6768 | 6626 |
| 6769 | 6627 #define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \ |
| 6770 #define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \ | 6628 bool JSObject::HasFixed##Type##Elements() { \ |
| 6771 bool JSObject::HasFixed##Type##Elements() { \ | 6629 HeapObject* array = elements(); \ |
| 6772 HeapObject* array = elements(); \ | 6630 DCHECK(array != NULL); \ |
| 6773 DCHECK(array != NULL); \ | 6631 if (!array->IsHeapObject()) return false; \ |
| 6774 if (!array->IsHeapObject()) \ | 6632 return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \ |
| 6775 return false; \ | 6633 } |
| 6776 return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \ | |
| 6777 } | |
| 6778 | 6634 |
| 6779 TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK) | 6635 TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK) |
| 6780 | 6636 |
| 6781 #undef FIXED_TYPED_ELEMENTS_CHECK | 6637 #undef FIXED_TYPED_ELEMENTS_CHECK |
| 6782 | 6638 |
| 6783 | 6639 |
| 6784 bool JSObject::HasNamedInterceptor() { | 6640 bool JSObject::HasNamedInterceptor() { |
| 6785 return map()->has_named_interceptor(); | 6641 return map()->has_named_interceptor(); |
| 6786 } | 6642 } |
| 6787 | 6643 |
| (...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7844 #undef WRITE_INT64_FIELD | 7700 #undef WRITE_INT64_FIELD |
| 7845 #undef READ_BYTE_FIELD | 7701 #undef READ_BYTE_FIELD |
| 7846 #undef WRITE_BYTE_FIELD | 7702 #undef WRITE_BYTE_FIELD |
| 7847 #undef NOBARRIER_READ_BYTE_FIELD | 7703 #undef NOBARRIER_READ_BYTE_FIELD |
| 7848 #undef NOBARRIER_WRITE_BYTE_FIELD | 7704 #undef NOBARRIER_WRITE_BYTE_FIELD |
| 7849 | 7705 |
| 7850 } // namespace internal | 7706 } // namespace internal |
| 7851 } // namespace v8 | 7707 } // namespace v8 |
| 7852 | 7708 |
| 7853 #endif // V8_OBJECTS_INL_H_ | 7709 #endif // V8_OBJECTS_INL_H_ |
| OLD | NEW |