OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
170 } | 170 } |
171 | 171 |
172 | 172 |
173 bool Object::NonFailureIsHeapObject() { | 173 bool Object::NonFailureIsHeapObject() { |
174 ASSERT(!this->IsFailure()); | 174 ASSERT(!this->IsFailure()); |
175 return (reinterpret_cast<intptr_t>(this) & kSmiTagMask) != 0; | 175 return (reinterpret_cast<intptr_t>(this) & kSmiTagMask) != 0; |
176 } | 176 } |
177 | 177 |
178 | 178 |
179 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) | 179 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) |
180 TYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE) | |
180 TYPE_CHECKER(Symbol, SYMBOL_TYPE) | 181 TYPE_CHECKER(Symbol, SYMBOL_TYPE) |
181 | 182 |
182 | 183 |
183 bool Object::IsString() { | 184 bool Object::IsString() { |
184 return Object::IsHeapObject() | 185 return Object::IsHeapObject() |
185 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; | 186 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; |
186 } | 187 } |
187 | 188 |
188 | 189 |
189 bool Object::IsName() { | 190 bool Object::IsName() { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
275 IsFixedTypedArrayBase(); | 276 IsFixedTypedArrayBase(); |
276 } | 277 } |
277 | 278 |
278 | 279 |
279 MaybeObject* Object::AllocateNewStorageFor(Heap* heap, | 280 MaybeObject* Object::AllocateNewStorageFor(Heap* heap, |
280 Representation representation) { | 281 Representation representation) { |
281 if (representation.IsSmi() && IsUninitialized()) { | 282 if (representation.IsSmi() && IsUninitialized()) { |
282 return Smi::FromInt(0); | 283 return Smi::FromInt(0); |
283 } | 284 } |
284 if (!representation.IsDouble()) return this; | 285 if (!representation.IsDouble()) return this; |
286 double value; | |
285 if (IsUninitialized()) { | 287 if (IsUninitialized()) { |
286 return heap->AllocateHeapNumber(0); | 288 value = 0; |
289 } else if (IsMutableHeapNumber()) { | |
Igor Sheludko
2014/03/27 11:30:16
If you extend IsNumber() to return true for mutabl
| |
290 value = HeapNumber::cast(this)->value(); | |
291 } else { | |
292 value = Number(); | |
287 } | 293 } |
288 return heap->AllocateHeapNumber(Number()); | 294 return heap->AllocateMutableHeapNumber(value); |
289 } | 295 } |
290 | 296 |
291 | 297 |
298 MaybeObject* Object::WrapForRead(Heap* heap, | |
299 Representation representation) { | |
300 ASSERT(!IsUninitialized()); | |
301 if (!representation.IsDouble()) { | |
302 ASSERT(FitsRepresentation(representation)); | |
303 return this; | |
304 } | |
305 return heap->AllocateHeapNumber(HeapNumber::cast(this)->value()); | |
Igor Sheludko
2014/03/27 11:30:16
Same here: use Number().
| |
306 } | |
307 | |
308 | |
292 StringShape::StringShape(String* str) | 309 StringShape::StringShape(String* str) |
293 : type_(str->map()->instance_type()) { | 310 : type_(str->map()->instance_type()) { |
294 set_valid(); | 311 set_valid(); |
295 ASSERT((type_ & kIsNotStringMask) == kStringTag); | 312 ASSERT((type_ & kIsNotStringMask) == kStringTag); |
296 } | 313 } |
297 | 314 |
298 | 315 |
299 StringShape::StringShape(Map* map) | 316 StringShape::StringShape(Map* map) |
300 : type_(map->instance_type()) { | 317 : type_(map->instance_type()) { |
301 set_valid(); | 318 set_valid(); |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
588 } | 605 } |
589 | 606 |
590 Vector<const char> string_; | 607 Vector<const char> string_; |
591 uint32_t hash_field_; | 608 uint32_t hash_field_; |
592 int chars_; // Caches the number of characters when computing the hash code. | 609 int chars_; // Caches the number of characters when computing the hash code. |
593 uint32_t seed_; | 610 uint32_t seed_; |
594 }; | 611 }; |
595 | 612 |
596 | 613 |
597 bool Object::IsNumber() { | 614 bool Object::IsNumber() { |
598 return IsSmi() || IsHeapNumber(); | 615 return IsSmi() || IsHeapNumber(); |
Igor Sheludko
2014/03/27 11:30:16
|| IsMutableHeapNumber() ?
| |
599 } | 616 } |
600 | 617 |
601 | 618 |
602 TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) | 619 TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) |
603 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) | 620 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) |
604 | 621 |
605 | 622 |
606 bool Object::IsFiller() { | 623 bool Object::IsFiller() { |
607 if (!Object::IsHeapObject()) return false; | 624 if (!Object::IsHeapObject()) return false; |
608 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type(); | 625 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type(); |
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1937 // properties are at the end of the object. Therefore there is no need | 1954 // properties are at the end of the object. Therefore there is no need |
1938 // to adjust the index here. | 1955 // to adjust the index here. |
1939 int offset = GetHeaderSize() + (kPointerSize * index); | 1956 int offset = GetHeaderSize() + (kPointerSize * index); |
1940 WRITE_FIELD(this, offset, value); | 1957 WRITE_FIELD(this, offset, value); |
1941 } | 1958 } |
1942 | 1959 |
1943 | 1960 |
1944 MaybeObject* JSObject::FastPropertyAt(Representation representation, | 1961 MaybeObject* JSObject::FastPropertyAt(Representation representation, |
1945 int index) { | 1962 int index) { |
1946 Object* raw_value = RawFastPropertyAt(index); | 1963 Object* raw_value = RawFastPropertyAt(index); |
1947 return raw_value->AllocateNewStorageFor(GetHeap(), representation); | 1964 return raw_value->WrapForRead(GetHeap(), representation); |
Igor Sheludko
2014/03/27 11:30:16
Shouldn't we also repack mutable heap number to im
| |
1948 } | 1965 } |
1949 | 1966 |
1950 | 1967 |
1951 // Access fast-case object properties at index. The use of these routines | 1968 // Access fast-case object properties at index. The use of these routines |
1952 // is needed to correctly distinguish between properties stored in-object and | 1969 // is needed to correctly distinguish between properties stored in-object and |
1953 // properties stored in the properties array. | 1970 // properties stored in the properties array. |
1954 Object* JSObject::RawFastPropertyAt(int index) { | 1971 Object* JSObject::RawFastPropertyAt(int index) { |
1955 // Adjust for the number of properties stored in the object. | 1972 // Adjust for the number of properties stored in the object. |
1956 index -= map()->inobject_properties(); | 1973 index -= map()->inobject_properties(); |
1957 if (index < 0) { | 1974 if (index < 0) { |
(...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2845 CAST_ACCESSOR(ConsString) | 2862 CAST_ACCESSOR(ConsString) |
2846 CAST_ACCESSOR(ExternalString) | 2863 CAST_ACCESSOR(ExternalString) |
2847 CAST_ACCESSOR(ExternalAsciiString) | 2864 CAST_ACCESSOR(ExternalAsciiString) |
2848 CAST_ACCESSOR(ExternalTwoByteString) | 2865 CAST_ACCESSOR(ExternalTwoByteString) |
2849 CAST_ACCESSOR(Symbol) | 2866 CAST_ACCESSOR(Symbol) |
2850 CAST_ACCESSOR(Name) | 2867 CAST_ACCESSOR(Name) |
2851 CAST_ACCESSOR(JSReceiver) | 2868 CAST_ACCESSOR(JSReceiver) |
2852 CAST_ACCESSOR(JSObject) | 2869 CAST_ACCESSOR(JSObject) |
2853 CAST_ACCESSOR(Smi) | 2870 CAST_ACCESSOR(Smi) |
2854 CAST_ACCESSOR(HeapObject) | 2871 CAST_ACCESSOR(HeapObject) |
2855 CAST_ACCESSOR(HeapNumber) | |
2856 CAST_ACCESSOR(Oddball) | 2872 CAST_ACCESSOR(Oddball) |
2857 CAST_ACCESSOR(Cell) | 2873 CAST_ACCESSOR(Cell) |
2858 CAST_ACCESSOR(PropertyCell) | 2874 CAST_ACCESSOR(PropertyCell) |
2859 CAST_ACCESSOR(SharedFunctionInfo) | 2875 CAST_ACCESSOR(SharedFunctionInfo) |
2860 CAST_ACCESSOR(Map) | 2876 CAST_ACCESSOR(Map) |
2861 CAST_ACCESSOR(JSFunction) | 2877 CAST_ACCESSOR(JSFunction) |
2862 CAST_ACCESSOR(GlobalObject) | 2878 CAST_ACCESSOR(GlobalObject) |
2863 CAST_ACCESSOR(JSGlobalProxy) | 2879 CAST_ACCESSOR(JSGlobalProxy) |
2864 CAST_ACCESSOR(JSGlobalObject) | 2880 CAST_ACCESSOR(JSGlobalObject) |
2865 CAST_ACCESSOR(JSBuiltinsObject) | 2881 CAST_ACCESSOR(JSBuiltinsObject) |
(...skipping 2800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5666 ACCESSORS(JSValue, value, Object, kValueOffset) | 5682 ACCESSORS(JSValue, value, Object, kValueOffset) |
5667 | 5683 |
5668 | 5684 |
5669 JSValue* JSValue::cast(Object* obj) { | 5685 JSValue* JSValue::cast(Object* obj) { |
5670 ASSERT(obj->IsJSValue()); | 5686 ASSERT(obj->IsJSValue()); |
5671 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize); | 5687 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize); |
5672 return reinterpret_cast<JSValue*>(obj); | 5688 return reinterpret_cast<JSValue*>(obj); |
5673 } | 5689 } |
5674 | 5690 |
5675 | 5691 |
5692 HeapNumber* HeapNumber::cast(Object* object) { | |
5693 SLOW_ASSERT(object->IsHeapNumber() || object->IsMutableHeapNumber()); | |
5694 return reinterpret_cast<HeapNumber*>(object); | |
5695 } | |
5696 | |
5697 | |
5676 ACCESSORS(JSDate, value, Object, kValueOffset) | 5698 ACCESSORS(JSDate, value, Object, kValueOffset) |
5677 ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset) | 5699 ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset) |
5678 ACCESSORS(JSDate, year, Object, kYearOffset) | 5700 ACCESSORS(JSDate, year, Object, kYearOffset) |
5679 ACCESSORS(JSDate, month, Object, kMonthOffset) | 5701 ACCESSORS(JSDate, month, Object, kMonthOffset) |
5680 ACCESSORS(JSDate, day, Object, kDayOffset) | 5702 ACCESSORS(JSDate, day, Object, kDayOffset) |
5681 ACCESSORS(JSDate, weekday, Object, kWeekdayOffset) | 5703 ACCESSORS(JSDate, weekday, Object, kWeekdayOffset) |
5682 ACCESSORS(JSDate, hour, Object, kHourOffset) | 5704 ACCESSORS(JSDate, hour, Object, kHourOffset) |
5683 ACCESSORS(JSDate, min, Object, kMinOffset) | 5705 ACCESSORS(JSDate, min, Object, kMinOffset) |
5684 ACCESSORS(JSDate, sec, Object, kSecOffset) | 5706 ACCESSORS(JSDate, sec, Object, kSecOffset) |
5685 | 5707 |
(...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6789 #undef READ_UINT32_FIELD | 6811 #undef READ_UINT32_FIELD |
6790 #undef WRITE_UINT32_FIELD | 6812 #undef WRITE_UINT32_FIELD |
6791 #undef READ_SHORT_FIELD | 6813 #undef READ_SHORT_FIELD |
6792 #undef WRITE_SHORT_FIELD | 6814 #undef WRITE_SHORT_FIELD |
6793 #undef READ_BYTE_FIELD | 6815 #undef READ_BYTE_FIELD |
6794 #undef WRITE_BYTE_FIELD | 6816 #undef WRITE_BYTE_FIELD |
6795 | 6817 |
6796 } } // namespace v8::internal | 6818 } } // namespace v8::internal |
6797 | 6819 |
6798 #endif // V8_OBJECTS_INL_H_ | 6820 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |