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 168 matching lines...) Loading... |
179 #undef SIMD128_TYPE_CHECKER | 179 #undef SIMD128_TYPE_CHECKER |
180 | 180 |
181 | 181 |
182 bool Object::IsString() const { | 182 bool Object::IsString() const { |
183 return Object::IsHeapObject() | 183 return Object::IsHeapObject() |
184 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; | 184 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; |
185 } | 185 } |
186 | 186 |
187 | 187 |
188 bool Object::IsName() const { | 188 bool Object::IsName() const { |
189 return IsString() || IsSymbol(); | 189 STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE); |
| 190 return Object::IsHeapObject() && |
| 191 HeapObject::cast(this)->map()->instance_type() <= LAST_NAME_TYPE; |
190 } | 192 } |
191 | 193 |
192 | 194 |
193 bool Object::IsUniqueName() const { | 195 bool Object::IsUniqueName() const { |
194 return IsInternalizedString() || IsSymbol(); | 196 return IsInternalizedString() || IsSymbol(); |
195 } | 197 } |
196 | 198 |
197 | 199 |
198 bool Object::IsSpecObject() const { | 200 bool Object::IsSpecObject() const { |
199 return Object::IsHeapObject() | 201 return Object::IsHeapObject() |
(...skipping 778 matching lines...) Loading... |
978 return IsOrderedHashTable(); | 980 return IsOrderedHashTable(); |
979 } | 981 } |
980 | 982 |
981 | 983 |
982 bool Object::IsOrderedHashMap() const { | 984 bool Object::IsOrderedHashMap() const { |
983 return IsOrderedHashTable(); | 985 return IsOrderedHashTable(); |
984 } | 986 } |
985 | 987 |
986 | 988 |
987 bool Object::IsPrimitive() const { | 989 bool Object::IsPrimitive() const { |
988 return IsOddball() || IsNumber() || IsString(); | 990 return IsSmi() || HeapObject::cast(this)->map()->IsPrimitiveMap(); |
989 } | 991 } |
990 | 992 |
991 | 993 |
992 bool Object::IsJSGlobalProxy() const { | 994 bool Object::IsJSGlobalProxy() const { |
993 bool result = IsHeapObject() && | 995 bool result = IsHeapObject() && |
994 (HeapObject::cast(this)->map()->instance_type() == | 996 (HeapObject::cast(this)->map()->instance_type() == |
995 JS_GLOBAL_PROXY_TYPE); | 997 JS_GLOBAL_PROXY_TYPE); |
996 DCHECK(!result || | 998 DCHECK(!result || |
997 HeapObject::cast(this)->map()->is_access_check_needed()); | 999 HeapObject::cast(this)->map()->is_access_check_needed()); |
998 return result; | 1000 return result; |
(...skipping 1111 matching lines...) Loading... |
2110 return 0; | 2112 return 0; |
2111 } | 2113 } |
2112 } | 2114 } |
2113 | 2115 |
2114 | 2116 |
2115 int JSObject::GetInternalFieldCount() { | 2117 int JSObject::GetInternalFieldCount() { |
2116 DCHECK(1 << kPointerSizeLog2 == kPointerSize); | 2118 DCHECK(1 << kPointerSizeLog2 == kPointerSize); |
2117 // Make sure to adjust for the number of in-object properties. These | 2119 // Make sure to adjust for the number of in-object properties. These |
2118 // properties do contribute to the size, but are not internal fields. | 2120 // properties do contribute to the size, but are not internal fields. |
2119 return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) - | 2121 return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) - |
2120 map()->inobject_properties(); | 2122 map()->GetInObjectProperties(); |
2121 } | 2123 } |
2122 | 2124 |
2123 | 2125 |
2124 int JSObject::GetInternalFieldOffset(int index) { | 2126 int JSObject::GetInternalFieldOffset(int index) { |
2125 DCHECK(index < GetInternalFieldCount() && index >= 0); | 2127 DCHECK(index < GetInternalFieldCount() && index >= 0); |
2126 return GetHeaderSize() + (kPointerSize * index); | 2128 return GetHeaderSize() + (kPointerSize * index); |
2127 } | 2129 } |
2128 | 2130 |
2129 | 2131 |
2130 Object* JSObject::GetInternalField(int index) { | 2132 Object* JSObject::GetInternalField(int index) { |
(...skipping 136 matching lines...) Loading... |
2267 Object* pre_allocated_value, | 2269 Object* pre_allocated_value, |
2268 Object* filler_value) { | 2270 Object* filler_value) { |
2269 DCHECK(!filler_value->IsHeapObject() || | 2271 DCHECK(!filler_value->IsHeapObject() || |
2270 !GetHeap()->InNewSpace(filler_value)); | 2272 !GetHeap()->InNewSpace(filler_value)); |
2271 DCHECK(!pre_allocated_value->IsHeapObject() || | 2273 DCHECK(!pre_allocated_value->IsHeapObject() || |
2272 !GetHeap()->InNewSpace(pre_allocated_value)); | 2274 !GetHeap()->InNewSpace(pre_allocated_value)); |
2273 int size = map->instance_size(); | 2275 int size = map->instance_size(); |
2274 int offset = kHeaderSize; | 2276 int offset = kHeaderSize; |
2275 if (filler_value != pre_allocated_value) { | 2277 if (filler_value != pre_allocated_value) { |
2276 int pre_allocated = | 2278 int pre_allocated = |
2277 map->inobject_properties() - map->unused_property_fields(); | 2279 map->GetInObjectProperties() - map->unused_property_fields(); |
2278 DCHECK(pre_allocated * kPointerSize + kHeaderSize <= size); | 2280 DCHECK(pre_allocated * kPointerSize + kHeaderSize <= size); |
2279 for (int i = 0; i < pre_allocated; i++) { | 2281 for (int i = 0; i < pre_allocated; i++) { |
2280 WRITE_FIELD(this, offset, pre_allocated_value); | 2282 WRITE_FIELD(this, offset, pre_allocated_value); |
2281 offset += kPointerSize; | 2283 offset += kPointerSize; |
2282 } | 2284 } |
2283 } | 2285 } |
2284 while (offset < size) { | 2286 while (offset < size) { |
2285 WRITE_FIELD(this, offset, filler_value); | 2287 WRITE_FIELD(this, offset, filler_value); |
2286 offset += kPointerSize; | 2288 offset += kPointerSize; |
2287 } | 2289 } |
2288 } | 2290 } |
2289 | 2291 |
2290 | 2292 |
2291 bool JSObject::HasFastProperties() { | 2293 bool JSObject::HasFastProperties() { |
2292 DCHECK(properties()->IsDictionary() == map()->is_dictionary_map()); | 2294 DCHECK(properties()->IsDictionary() == map()->is_dictionary_map()); |
2293 return !properties()->IsDictionary(); | 2295 return !properties()->IsDictionary(); |
2294 } | 2296 } |
2295 | 2297 |
2296 | 2298 |
2297 bool Map::TooManyFastProperties(StoreFromKeyed store_mode) { | 2299 bool Map::TooManyFastProperties(StoreFromKeyed store_mode) { |
2298 if (unused_property_fields() != 0) return false; | 2300 if (unused_property_fields() != 0) return false; |
2299 if (is_prototype_map()) return false; | 2301 if (is_prototype_map()) return false; |
2300 int minimum = store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ? 128 : 12; | 2302 int minimum = store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ? 128 : 12; |
2301 int limit = Max(minimum, inobject_properties()); | 2303 int limit = Max(minimum, GetInObjectProperties()); |
2302 int external = NumberOfFields() - inobject_properties(); | 2304 int external = NumberOfFields() - GetInObjectProperties(); |
2303 return external > limit; | 2305 return external > limit; |
2304 } | 2306 } |
2305 | 2307 |
2306 | 2308 |
2307 void Struct::InitializeBody(int object_size) { | 2309 void Struct::InitializeBody(int object_size) { |
2308 Object* value = GetHeap()->undefined_value(); | 2310 Object* value = GetHeap()->undefined_value(); |
2309 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { | 2311 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { |
2310 WRITE_FIELD(this, offset, value); | 2312 WRITE_FIELD(this, offset, value); |
2311 } | 2313 } |
2312 } | 2314 } |
(...skipping 1666 matching lines...) Loading... |
3979 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id)); | 3981 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id)); |
3980 } | 3982 } |
3981 | 3983 |
3982 | 3984 |
3983 int Map::instance_size() { | 3985 int Map::instance_size() { |
3984 return NOBARRIER_READ_BYTE_FIELD( | 3986 return NOBARRIER_READ_BYTE_FIELD( |
3985 this, kInstanceSizeOffset) << kPointerSizeLog2; | 3987 this, kInstanceSizeOffset) << kPointerSizeLog2; |
3986 } | 3988 } |
3987 | 3989 |
3988 | 3990 |
3989 int Map::inobject_properties() { | 3991 int Map::inobject_properties_or_constructor_function_index() { |
3990 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset); | 3992 return READ_BYTE_FIELD(this, |
| 3993 kInObjectPropertiesOrConstructorFunctionIndexOffset); |
| 3994 } |
| 3995 |
| 3996 |
| 3997 void Map::set_inobject_properties_or_constructor_function_index(int value) { |
| 3998 DCHECK(0 <= value && value < 256); |
| 3999 WRITE_BYTE_FIELD(this, kInObjectPropertiesOrConstructorFunctionIndexOffset, |
| 4000 static_cast<byte>(value)); |
| 4001 } |
| 4002 |
| 4003 |
| 4004 int Map::GetInObjectProperties() { |
| 4005 DCHECK(IsJSObjectMap()); |
| 4006 return inobject_properties_or_constructor_function_index(); |
| 4007 } |
| 4008 |
| 4009 |
| 4010 void Map::SetInObjectProperties(int value) { |
| 4011 DCHECK(IsJSObjectMap()); |
| 4012 set_inobject_properties_or_constructor_function_index(value); |
| 4013 } |
| 4014 |
| 4015 |
| 4016 int Map::GetConstructorFunctionIndex() { |
| 4017 DCHECK(IsPrimitiveMap()); |
| 4018 return inobject_properties_or_constructor_function_index(); |
| 4019 } |
| 4020 |
| 4021 |
| 4022 void Map::SetConstructorFunctionIndex(int value) { |
| 4023 DCHECK(IsPrimitiveMap()); |
| 4024 set_inobject_properties_or_constructor_function_index(value); |
3991 } | 4025 } |
3992 | 4026 |
3993 | 4027 |
3994 int Map::GetInObjectPropertyOffset(int index) { | 4028 int Map::GetInObjectPropertyOffset(int index) { |
3995 // Adjust for the number of properties stored in the object. | 4029 // Adjust for the number of properties stored in the object. |
3996 index -= inobject_properties(); | 4030 index -= GetInObjectProperties(); |
3997 DCHECK(index <= 0); | 4031 DCHECK(index <= 0); |
3998 return instance_size() + (index * kPointerSize); | 4032 return instance_size() + (index * kPointerSize); |
3999 } | 4033 } |
4000 | 4034 |
4001 | 4035 |
4002 Handle<Map> Map::CopyInstallDescriptorsForTesting( | 4036 Handle<Map> Map::CopyInstallDescriptorsForTesting( |
4003 Handle<Map> map, int new_descriptor, Handle<DescriptorArray> descriptors, | 4037 Handle<Map> map, int new_descriptor, Handle<DescriptorArray> descriptors, |
4004 Handle<LayoutDescriptor> layout_descriptor) { | 4038 Handle<LayoutDescriptor> layout_descriptor) { |
4005 return CopyInstallDescriptors(map, new_descriptor, descriptors, | 4039 return CopyInstallDescriptors(map, new_descriptor, descriptors, |
4006 layout_descriptor); | 4040 layout_descriptor); |
(...skipping 47 matching lines...) Loading... |
4054 | 4088 |
4055 void Map::set_instance_size(int value) { | 4089 void Map::set_instance_size(int value) { |
4056 DCHECK_EQ(0, value & (kPointerSize - 1)); | 4090 DCHECK_EQ(0, value & (kPointerSize - 1)); |
4057 value >>= kPointerSizeLog2; | 4091 value >>= kPointerSizeLog2; |
4058 DCHECK(0 <= value && value < 256); | 4092 DCHECK(0 <= value && value < 256); |
4059 NOBARRIER_WRITE_BYTE_FIELD( | 4093 NOBARRIER_WRITE_BYTE_FIELD( |
4060 this, kInstanceSizeOffset, static_cast<byte>(value)); | 4094 this, kInstanceSizeOffset, static_cast<byte>(value)); |
4061 } | 4095 } |
4062 | 4096 |
4063 | 4097 |
4064 void Map::set_inobject_properties(int value) { | |
4065 DCHECK(0 <= value && value < 256); | |
4066 WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value)); | |
4067 } | |
4068 | |
4069 | |
4070 void Map::clear_unused() { WRITE_BYTE_FIELD(this, kUnusedOffset, 0); } | 4098 void Map::clear_unused() { WRITE_BYTE_FIELD(this, kUnusedOffset, 0); } |
4071 | 4099 |
4072 | 4100 |
4073 InstanceType Map::instance_type() { | 4101 InstanceType Map::instance_type() { |
4074 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset)); | 4102 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset)); |
4075 } | 4103 } |
4076 | 4104 |
4077 | 4105 |
4078 void Map::set_instance_type(InstanceType value) { | 4106 void Map::set_instance_type(InstanceType value) { |
4079 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value); | 4107 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value); |
(...skipping 3135 matching lines...) Loading... |
7215 #undef READ_INT64_FIELD | 7243 #undef READ_INT64_FIELD |
7216 #undef WRITE_INT64_FIELD | 7244 #undef WRITE_INT64_FIELD |
7217 #undef READ_BYTE_FIELD | 7245 #undef READ_BYTE_FIELD |
7218 #undef WRITE_BYTE_FIELD | 7246 #undef WRITE_BYTE_FIELD |
7219 #undef NOBARRIER_READ_BYTE_FIELD | 7247 #undef NOBARRIER_READ_BYTE_FIELD |
7220 #undef NOBARRIER_WRITE_BYTE_FIELD | 7248 #undef NOBARRIER_WRITE_BYTE_FIELD |
7221 | 7249 |
7222 } } // namespace v8::internal | 7250 } } // namespace v8::internal |
7223 | 7251 |
7224 #endif // V8_OBJECTS_INL_H_ | 7252 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |