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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 #define BOOL_ACCESSORS(holder, field, name, offset) \ | 126 #define BOOL_ACCESSORS(holder, field, name, offset) \ |
127 bool holder::name() { \ | 127 bool holder::name() { \ |
128 return BooleanBit::get(field(), offset); \ | 128 return BooleanBit::get(field(), offset); \ |
129 } \ | 129 } \ |
130 void holder::set_##name(bool value) { \ | 130 void holder::set_##name(bool value) { \ |
131 set_##field(BooleanBit::set(field(), offset, value)); \ | 131 set_##field(BooleanBit::set(field(), offset, value)); \ |
132 } | 132 } |
133 | 133 |
134 | 134 |
135 bool Object::IsFixedArrayBase() { | 135 bool Object::IsFixedArrayBase() { |
136 return IsFixedArray() || IsFixedDoubleArray(); | 136 return IsFixedArray() || IsFixedDoubleArray() || IsConstantPoolArray(); |
137 } | 137 } |
138 | 138 |
139 | 139 |
140 // External objects are not extensible, so the map check is enough. | 140 // External objects are not extensible, so the map check is enough. |
141 bool Object::IsExternal() { | 141 bool Object::IsExternal() { |
142 return Object::IsHeapObject() && | 142 return Object::IsHeapObject() && |
143 HeapObject::cast(this)->map() == | 143 HeapObject::cast(this)->map() == |
144 HeapObject::cast(this)->GetHeap()->external_map(); | 144 HeapObject::cast(this)->GetHeap()->external_map(); |
145 } | 145 } |
146 | 146 |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
565 | 565 |
566 TYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE) | 566 TYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE) |
567 TYPE_CHECKER(JSSet, JS_SET_TYPE) | 567 TYPE_CHECKER(JSSet, JS_SET_TYPE) |
568 TYPE_CHECKER(JSMap, JS_MAP_TYPE) | 568 TYPE_CHECKER(JSMap, JS_MAP_TYPE) |
569 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) | 569 TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) |
570 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE) | 570 TYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE) |
571 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) | 571 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) |
572 TYPE_CHECKER(Map, MAP_TYPE) | 572 TYPE_CHECKER(Map, MAP_TYPE) |
573 TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) | 573 TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) |
574 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) | 574 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) |
575 TYPE_CHECKER(ConstantPoolArray, CONSTANT_POOL_ARRAY_TYPE) | |
575 | 576 |
576 | 577 |
577 bool Object::IsJSWeakCollection() { | 578 bool Object::IsJSWeakCollection() { |
578 return IsJSWeakMap() || IsJSWeakSet(); | 579 return IsJSWeakMap() || IsJSWeakSet(); |
579 } | 580 } |
580 | 581 |
581 | 582 |
582 bool Object::IsDescriptorArray() { | 583 bool Object::IsDescriptorArray() { |
583 return IsFixedArray(); | 584 return IsFixedArray(); |
584 } | 585 } |
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1021 | 1022 |
1022 #define WRITE_INTPTR_FIELD(p, offset, value) \ | 1023 #define WRITE_INTPTR_FIELD(p, offset, value) \ |
1023 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value) | 1024 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value) |
1024 | 1025 |
1025 #define READ_UINT32_FIELD(p, offset) \ | 1026 #define READ_UINT32_FIELD(p, offset) \ |
1026 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) | 1027 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) |
1027 | 1028 |
1028 #define WRITE_UINT32_FIELD(p, offset, value) \ | 1029 #define WRITE_UINT32_FIELD(p, offset, value) \ |
1029 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value) | 1030 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value) |
1030 | 1031 |
1032 #define READ_INT32_FIELD(p, offset) \ | |
1033 (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset))) | |
1034 | |
1035 #define WRITE_INT32_FIELD(p, offset, value) \ | |
1036 (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)) = value) | |
1037 | |
1031 #define READ_INT64_FIELD(p, offset) \ | 1038 #define READ_INT64_FIELD(p, offset) \ |
1032 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset))) | 1039 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset))) |
1033 | 1040 |
1034 #define WRITE_INT64_FIELD(p, offset, value) \ | 1041 #define WRITE_INT64_FIELD(p, offset, value) \ |
1035 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value) | 1042 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value) |
1036 | 1043 |
1037 #define READ_SHORT_FIELD(p, offset) \ | 1044 #define READ_SHORT_FIELD(p, offset) \ |
1038 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset))) | 1045 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset))) |
1039 | 1046 |
1040 #define WRITE_SHORT_FIELD(p, offset, value) \ | 1047 #define WRITE_SHORT_FIELD(p, offset, value) \ |
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1922 IsTrue() || | 1929 IsTrue() || |
1923 IsFalse() || | 1930 IsFalse() || |
1924 IsNull())) { | 1931 IsNull())) { |
1925 FATAL("API call returned invalid object"); | 1932 FATAL("API call returned invalid object"); |
1926 } | 1933 } |
1927 #endif // ENABLE_EXTRA_CHECKS | 1934 #endif // ENABLE_EXTRA_CHECKS |
1928 } | 1935 } |
1929 | 1936 |
1930 | 1937 |
1931 FixedArrayBase* FixedArrayBase::cast(Object* object) { | 1938 FixedArrayBase* FixedArrayBase::cast(Object* object) { |
1932 ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray()); | 1939 ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray() || |
1940 object->IsConstantPoolArray()); | |
1933 return reinterpret_cast<FixedArrayBase*>(object); | 1941 return reinterpret_cast<FixedArrayBase*>(object); |
1934 } | 1942 } |
1935 | 1943 |
1936 | 1944 |
1937 Object* FixedArray::get(int index) { | 1945 Object* FixedArray::get(int index) { |
1938 ASSERT(index >= 0 && index < this->length()); | 1946 ASSERT(index >= 0 && index < this->length()); |
1939 return READ_FIELD(this, kHeaderSize + index * kPointerSize); | 1947 return READ_FIELD(this, kHeaderSize + index * kPointerSize); |
1940 } | 1948 } |
1941 | 1949 |
1942 | 1950 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2021 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double()); | 2029 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double()); |
2022 } | 2030 } |
2023 | 2031 |
2024 | 2032 |
2025 bool FixedDoubleArray::is_the_hole(int index) { | 2033 bool FixedDoubleArray::is_the_hole(int index) { |
2026 int offset = kHeaderSize + index * kDoubleSize; | 2034 int offset = kHeaderSize + index * kDoubleSize; |
2027 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset)); | 2035 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset)); |
2028 } | 2036 } |
2029 | 2037 |
2030 | 2038 |
2039 SMI_ACCESSORS(ConstantPoolArray, first_int32_index, kFirstInt32IndexOffset) | |
2040 | |
2041 | |
2042 int64_t ConstantPoolArray::get_int64_entry(int index) { | |
2043 ASSERT(map() != HEAP->fixed_cow_array_map() && | |
ulan
2013/08/09 08:52:54
Why not use map() == HEAP->constant_pool_array_map
rmcilroy
2013/08/16 10:27:37
Done.
| |
2044 map() != HEAP->fixed_array_map()); | |
2045 ASSERT(index >= 0 && index < this->first_int32_index()); | |
2046 return READ_INT64_FIELD(this, kFirstOffset + index * kInt64Size); | |
2047 } | |
2048 | |
2049 | |
2050 double ConstantPoolArray::get_int64_entry_as_double(int index) { | |
2051 STATIC_ASSERT(kDoubleSize == kInt64Size); | |
2052 ASSERT(map() != HEAP->fixed_cow_array_map() && | |
2053 map() != HEAP->fixed_array_map()); | |
2054 ASSERT(index >= 0 && index < this->first_int32_index()); | |
2055 return READ_DOUBLE_FIELD(this, kFirstOffset + index * kInt64Size); | |
2056 } | |
2057 | |
2058 | |
2059 int32_t ConstantPoolArray::get_int32_entry(int index) { | |
2060 ASSERT(map() != HEAP->fixed_cow_array_map() && | |
2061 map() != HEAP->fixed_array_map()); | |
2062 ASSERT(index >= this->first_int32_index() && index < this->length()); | |
2063 int offset = kFirstOffset + this->first_int32_index() * kInt64Size | |
2064 + index * kInt32Size; | |
2065 return READ_INT32_FIELD(this, offset); | |
2066 } | |
2067 | |
2068 | |
2069 MaybeObject* ConstantPoolArray::get(int index) { | |
2070 if (index < first_int32_index()) { | |
2071 return GetHeap()->NumberFromDouble(get_int64_entry_as_double(index)); | |
2072 } else { | |
2073 return GetHeap()->NumberFromInt32(get_int32_entry(index)); | |
2074 } | |
2075 } | |
2076 | |
2077 | |
2078 void ConstantPoolArray::set(int index, int64_t value) { | |
2079 ASSERT(map() != HEAP->fixed_cow_array_map() && | |
2080 map() != HEAP->fixed_array_map()); | |
2081 ASSERT(index >= 0 && index < this->first_int32_index()); | |
2082 int offset = kFirstOffset + index * kInt64Size; | |
2083 WRITE_INT64_FIELD(this, offset, value); | |
2084 } | |
2085 | |
2086 void ConstantPoolArray::set(int index, double value) { | |
2087 STATIC_ASSERT(kDoubleSize == kInt64Size); | |
2088 ASSERT(map() != HEAP->fixed_cow_array_map() && | |
2089 map() != HEAP->fixed_array_map()); | |
2090 ASSERT(index >= 0 && index < this->first_int32_index()); | |
2091 int offset = kFirstOffset + index * kDoubleSize; | |
2092 WRITE_DOUBLE_FIELD(this, offset, value); | |
2093 } | |
2094 | |
2095 | |
2096 void ConstantPoolArray::set(int index, int32_t value) { | |
2097 ASSERT(map() != HEAP->fixed_cow_array_map() && | |
2098 map() != HEAP->fixed_array_map()); | |
2099 ASSERT(index >= this->first_int32_index() && index < this->length()); | |
2100 int offset = kFirstOffset + this->first_int32_index() * kInt64Size + | |
2101 index * kInt32Size; | |
2102 WRITE_INT32_FIELD(this, offset, value); | |
2103 } | |
2104 | |
2105 | |
2031 WriteBarrierMode HeapObject::GetWriteBarrierMode( | 2106 WriteBarrierMode HeapObject::GetWriteBarrierMode( |
2032 const DisallowHeapAllocation& promise) { | 2107 const DisallowHeapAllocation& promise) { |
2033 Heap* heap = GetHeap(); | 2108 Heap* heap = GetHeap(); |
2034 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; | 2109 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; |
2035 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; | 2110 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; |
2036 return UPDATE_WRITE_BARRIER; | 2111 return UPDATE_WRITE_BARRIER; |
2037 } | 2112 } |
2038 | 2113 |
2039 | 2114 |
2040 void FixedArray::set(int index, | 2115 void FixedArray::set(int index, |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2519 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask)); | 2594 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask)); |
2520 } | 2595 } |
2521 | 2596 |
2522 | 2597 |
2523 // ------------------------------------ | 2598 // ------------------------------------ |
2524 // Cast operations | 2599 // Cast operations |
2525 | 2600 |
2526 | 2601 |
2527 CAST_ACCESSOR(FixedArray) | 2602 CAST_ACCESSOR(FixedArray) |
2528 CAST_ACCESSOR(FixedDoubleArray) | 2603 CAST_ACCESSOR(FixedDoubleArray) |
2604 CAST_ACCESSOR(ConstantPoolArray) | |
2529 CAST_ACCESSOR(DescriptorArray) | 2605 CAST_ACCESSOR(DescriptorArray) |
2530 CAST_ACCESSOR(DeoptimizationInputData) | 2606 CAST_ACCESSOR(DeoptimizationInputData) |
2531 CAST_ACCESSOR(DeoptimizationOutputData) | 2607 CAST_ACCESSOR(DeoptimizationOutputData) |
2532 CAST_ACCESSOR(DependentCode) | 2608 CAST_ACCESSOR(DependentCode) |
2533 CAST_ACCESSOR(TypeFeedbackCells) | 2609 CAST_ACCESSOR(TypeFeedbackCells) |
2534 CAST_ACCESSOR(StringTable) | 2610 CAST_ACCESSOR(StringTable) |
2535 CAST_ACCESSOR(JSFunctionResultCache) | 2611 CAST_ACCESSOR(JSFunctionResultCache) |
2536 CAST_ACCESSOR(NormalizedMapCache) | 2612 CAST_ACCESSOR(NormalizedMapCache) |
2537 CAST_ACCESSOR(ScopeInfo) | 2613 CAST_ACCESSOR(ScopeInfo) |
2538 CAST_ACCESSOR(CompilationCacheTable) | 2614 CAST_ACCESSOR(CompilationCacheTable) |
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3414 } | 3490 } |
3415 if (instance_type == STRING_TYPE || | 3491 if (instance_type == STRING_TYPE || |
3416 instance_type == INTERNALIZED_STRING_TYPE) { | 3492 instance_type == INTERNALIZED_STRING_TYPE) { |
3417 return SeqTwoByteString::SizeFor( | 3493 return SeqTwoByteString::SizeFor( |
3418 reinterpret_cast<SeqTwoByteString*>(this)->length()); | 3494 reinterpret_cast<SeqTwoByteString*>(this)->length()); |
3419 } | 3495 } |
3420 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { | 3496 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { |
3421 return FixedDoubleArray::SizeFor( | 3497 return FixedDoubleArray::SizeFor( |
3422 reinterpret_cast<FixedDoubleArray*>(this)->length()); | 3498 reinterpret_cast<FixedDoubleArray*>(this)->length()); |
3423 } | 3499 } |
3500 if (instance_type == CONSTANT_POOL_ARRAY_TYPE) { | |
3501 return ConstantPoolArray::SizeFor( | |
3502 reinterpret_cast<ConstantPoolArray*>(this)->length(), | |
3503 reinterpret_cast<ConstantPoolArray*>(this)->first_int32_index()); | |
3504 } | |
3424 ASSERT(instance_type == CODE_TYPE); | 3505 ASSERT(instance_type == CODE_TYPE); |
3425 return reinterpret_cast<Code*>(this)->CodeSize(); | 3506 return reinterpret_cast<Code*>(this)->CodeSize(); |
3426 } | 3507 } |
3427 | 3508 |
3428 | 3509 |
3429 void Map::set_instance_size(int value) { | 3510 void Map::set_instance_size(int value) { |
3430 ASSERT_EQ(0, value & (kPointerSize - 1)); | 3511 ASSERT_EQ(0, value & (kPointerSize - 1)); |
3431 value >>= kPointerSizeLog2; | 3512 value >>= kPointerSizeLog2; |
3432 ASSERT(0 <= value && value < 256); | 3513 ASSERT(0 <= value && value < 256); |
3433 WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value)); | 3514 WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value)); |
(...skipping 2590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6024 return GetHeap()->CopyFixedArray(this); | 6105 return GetHeap()->CopyFixedArray(this); |
6025 } | 6106 } |
6026 | 6107 |
6027 | 6108 |
6028 MaybeObject* FixedDoubleArray::Copy() { | 6109 MaybeObject* FixedDoubleArray::Copy() { |
6029 if (length() == 0) return this; | 6110 if (length() == 0) return this; |
6030 return GetHeap()->CopyFixedDoubleArray(this); | 6111 return GetHeap()->CopyFixedDoubleArray(this); |
6031 } | 6112 } |
6032 | 6113 |
6033 | 6114 |
6115 MaybeObject* ConstantPoolArray::Copy() { | |
6116 if (length() == 0) return this; | |
6117 return GetHeap()->CopyConstantPoolArray(this); | |
6118 } | |
6119 | |
6120 | |
6034 void TypeFeedbackCells::SetAstId(int index, TypeFeedbackId id) { | 6121 void TypeFeedbackCells::SetAstId(int index, TypeFeedbackId id) { |
6035 set(1 + index * 2, Smi::FromInt(id.ToInt())); | 6122 set(1 + index * 2, Smi::FromInt(id.ToInt())); |
6036 } | 6123 } |
6037 | 6124 |
6038 | 6125 |
6039 TypeFeedbackId TypeFeedbackCells::AstId(int index) { | 6126 TypeFeedbackId TypeFeedbackCells::AstId(int index) { |
6040 return TypeFeedbackId(Smi::cast(get(1 + index * 2))->value()); | 6127 return TypeFeedbackId(Smi::cast(get(1 + index * 2))->value()); |
6041 } | 6128 } |
6042 | 6129 |
6043 | 6130 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6261 #undef WRITE_UINT32_FIELD | 6348 #undef WRITE_UINT32_FIELD |
6262 #undef READ_SHORT_FIELD | 6349 #undef READ_SHORT_FIELD |
6263 #undef WRITE_SHORT_FIELD | 6350 #undef WRITE_SHORT_FIELD |
6264 #undef READ_BYTE_FIELD | 6351 #undef READ_BYTE_FIELD |
6265 #undef WRITE_BYTE_FIELD | 6352 #undef WRITE_BYTE_FIELD |
6266 | 6353 |
6267 | 6354 |
6268 } } // namespace v8::internal | 6355 } } // namespace v8::internal |
6269 | 6356 |
6270 #endif // V8_OBJECTS_INL_H_ | 6357 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |