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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE) | 137 TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE) |
138 TYPE_CHECKER(Cell, CELL_TYPE) | 138 TYPE_CHECKER(Cell, CELL_TYPE) |
139 TYPE_CHECKER(Code, CODE_TYPE) | 139 TYPE_CHECKER(Code, CODE_TYPE) |
140 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) | 140 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) |
141 TYPE_CHECKER(Foreign, FOREIGN_TYPE) | 141 TYPE_CHECKER(Foreign, FOREIGN_TYPE) |
142 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) | 142 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) |
143 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) | 143 TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) |
144 TYPE_CHECKER(JSArgumentsObject, JS_ARGUMENTS_TYPE) | 144 TYPE_CHECKER(JSArgumentsObject, JS_ARGUMENTS_TYPE) |
145 TYPE_CHECKER(JSArray, JS_ARRAY_TYPE) | 145 TYPE_CHECKER(JSArray, JS_ARRAY_TYPE) |
146 TYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE) | 146 TYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE) |
| 147 TYPE_CHECKER(JSAsyncGeneratorObject, JS_ASYNC_GENERATOR_OBJECT_TYPE) |
147 TYPE_CHECKER(JSBoundFunction, JS_BOUND_FUNCTION_TYPE) | 148 TYPE_CHECKER(JSBoundFunction, JS_BOUND_FUNCTION_TYPE) |
148 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) | 149 TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) |
149 TYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE) | 150 TYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE) |
150 TYPE_CHECKER(JSDate, JS_DATE_TYPE) | 151 TYPE_CHECKER(JSDate, JS_DATE_TYPE) |
151 TYPE_CHECKER(JSError, JS_ERROR_TYPE) | 152 TYPE_CHECKER(JSError, JS_ERROR_TYPE) |
152 TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE) | 153 TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE) |
153 TYPE_CHECKER(JSGeneratorObject, JS_GENERATOR_OBJECT_TYPE) | |
154 TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE) | 154 TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE) |
155 TYPE_CHECKER(JSMap, JS_MAP_TYPE) | 155 TYPE_CHECKER(JSMap, JS_MAP_TYPE) |
156 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE) | 156 TYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE) |
157 TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE) | 157 TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE) |
158 TYPE_CHECKER(JSModuleNamespace, JS_MODULE_NAMESPACE_TYPE) | 158 TYPE_CHECKER(JSModuleNamespace, JS_MODULE_NAMESPACE_TYPE) |
159 TYPE_CHECKER(JSPromiseCapability, JS_PROMISE_CAPABILITY_TYPE) | 159 TYPE_CHECKER(JSPromiseCapability, JS_PROMISE_CAPABILITY_TYPE) |
160 TYPE_CHECKER(JSPromise, JS_PROMISE_TYPE) | 160 TYPE_CHECKER(JSPromise, JS_PROMISE_TYPE) |
161 TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE) | 161 TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE) |
162 TYPE_CHECKER(JSSet, JS_SET_TYPE) | 162 TYPE_CHECKER(JSSet, JS_SET_TYPE) |
163 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) | 163 TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) |
(...skipping 28 matching lines...) Expand all Loading... |
192 InstanceType instance_type = map()->instance_type(); | 192 InstanceType instance_type = map()->instance_type(); |
193 return instance_type == FIXED_ARRAY_TYPE || | 193 return instance_type == FIXED_ARRAY_TYPE || |
194 instance_type == TRANSITION_ARRAY_TYPE; | 194 instance_type == TRANSITION_ARRAY_TYPE; |
195 } | 195 } |
196 | 196 |
197 // External objects are not extensible, so the map check is enough. | 197 // External objects are not extensible, so the map check is enough. |
198 bool HeapObject::IsExternal() const { | 198 bool HeapObject::IsExternal() const { |
199 return map() == GetHeap()->external_map(); | 199 return map() == GetHeap()->external_map(); |
200 } | 200 } |
201 | 201 |
| 202 bool HeapObject::IsJSGeneratorObject() const { |
| 203 return map()->instance_type() == JS_GENERATOR_OBJECT_TYPE || |
| 204 IsJSAsyncGeneratorObject(); |
| 205 } |
| 206 |
202 #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \ | 207 #define SIMD128_TYPE_CHECKER(TYPE, Type, type, lane_count, lane_type) \ |
203 bool HeapObject::Is##Type() const { return map() == GetHeap()->type##_map(); } | 208 bool HeapObject::Is##Type() const { return map() == GetHeap()->type##_map(); } |
204 SIMD128_TYPES(SIMD128_TYPE_CHECKER) | 209 SIMD128_TYPES(SIMD128_TYPE_CHECKER) |
205 #undef SIMD128_TYPE_CHECKER | 210 #undef SIMD128_TYPE_CHECKER |
206 | 211 |
207 #define IS_TYPE_FUNCTION_DEF(type_) \ | 212 #define IS_TYPE_FUNCTION_DEF(type_) \ |
208 bool Object::Is##type_() const { \ | 213 bool Object::Is##type_() const { \ |
209 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \ | 214 return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \ |
210 } | 215 } |
211 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF) | 216 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF) |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 CAST_ACCESSOR(Int32x4) | 644 CAST_ACCESSOR(Int32x4) |
640 CAST_ACCESSOR(Int8x16) | 645 CAST_ACCESSOR(Int8x16) |
641 CAST_ACCESSOR(JSArray) | 646 CAST_ACCESSOR(JSArray) |
642 CAST_ACCESSOR(JSArrayBuffer) | 647 CAST_ACCESSOR(JSArrayBuffer) |
643 CAST_ACCESSOR(JSArrayBufferView) | 648 CAST_ACCESSOR(JSArrayBufferView) |
644 CAST_ACCESSOR(JSBoundFunction) | 649 CAST_ACCESSOR(JSBoundFunction) |
645 CAST_ACCESSOR(JSDataView) | 650 CAST_ACCESSOR(JSDataView) |
646 CAST_ACCESSOR(JSDate) | 651 CAST_ACCESSOR(JSDate) |
647 CAST_ACCESSOR(JSFunction) | 652 CAST_ACCESSOR(JSFunction) |
648 CAST_ACCESSOR(JSGeneratorObject) | 653 CAST_ACCESSOR(JSGeneratorObject) |
| 654 CAST_ACCESSOR(JSAsyncGeneratorObject) |
649 CAST_ACCESSOR(JSGlobalObject) | 655 CAST_ACCESSOR(JSGlobalObject) |
650 CAST_ACCESSOR(JSGlobalProxy) | 656 CAST_ACCESSOR(JSGlobalProxy) |
651 CAST_ACCESSOR(JSMap) | 657 CAST_ACCESSOR(JSMap) |
652 CAST_ACCESSOR(JSMapIterator) | 658 CAST_ACCESSOR(JSMapIterator) |
653 CAST_ACCESSOR(JSMessageObject) | 659 CAST_ACCESSOR(JSMessageObject) |
654 CAST_ACCESSOR(JSModuleNamespace) | 660 CAST_ACCESSOR(JSModuleNamespace) |
655 CAST_ACCESSOR(JSObject) | 661 CAST_ACCESSOR(JSObject) |
656 CAST_ACCESSOR(JSProxy) | 662 CAST_ACCESSOR(JSProxy) |
657 CAST_ACCESSOR(JSReceiver) | 663 CAST_ACCESSOR(JSReceiver) |
658 CAST_ACCESSOR(JSRegExp) | 664 CAST_ACCESSOR(JSRegExp) |
(...skipping 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2151 // Check for the most common kind of JavaScript object before | 2157 // Check for the most common kind of JavaScript object before |
2152 // falling into the generic switch. This speeds up the internal | 2158 // falling into the generic switch. This speeds up the internal |
2153 // field operations considerably on average. | 2159 // field operations considerably on average. |
2154 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; | 2160 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; |
2155 switch (type) { | 2161 switch (type) { |
2156 case JS_API_OBJECT_TYPE: | 2162 case JS_API_OBJECT_TYPE: |
2157 case JS_SPECIAL_API_OBJECT_TYPE: | 2163 case JS_SPECIAL_API_OBJECT_TYPE: |
2158 return JSObject::kHeaderSize; | 2164 return JSObject::kHeaderSize; |
2159 case JS_GENERATOR_OBJECT_TYPE: | 2165 case JS_GENERATOR_OBJECT_TYPE: |
2160 return JSGeneratorObject::kSize; | 2166 return JSGeneratorObject::kSize; |
| 2167 case JS_ASYNC_GENERATOR_OBJECT_TYPE: |
| 2168 return JSAsyncGeneratorObject::kSize; |
2161 case JS_GLOBAL_PROXY_TYPE: | 2169 case JS_GLOBAL_PROXY_TYPE: |
2162 return JSGlobalProxy::kSize; | 2170 return JSGlobalProxy::kSize; |
2163 case JS_GLOBAL_OBJECT_TYPE: | 2171 case JS_GLOBAL_OBJECT_TYPE: |
2164 return JSGlobalObject::kSize; | 2172 return JSGlobalObject::kSize; |
2165 case JS_BOUND_FUNCTION_TYPE: | 2173 case JS_BOUND_FUNCTION_TYPE: |
2166 return JSBoundFunction::kSize; | 2174 return JSBoundFunction::kSize; |
2167 case JS_FUNCTION_TYPE: | 2175 case JS_FUNCTION_TYPE: |
2168 return JSFunction::kSize; | 2176 return JSFunction::kSize; |
2169 case JS_VALUE_TYPE: | 2177 case JS_VALUE_TYPE: |
2170 return JSValue::kSize; | 2178 return JSValue::kSize; |
(...skipping 3582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5753 ACCESSORS(PromiseReactionJobInfo, deferred_promise, Object, | 5761 ACCESSORS(PromiseReactionJobInfo, deferred_promise, Object, |
5754 kDeferredPromiseOffset); | 5762 kDeferredPromiseOffset); |
5755 ACCESSORS(PromiseReactionJobInfo, deferred_on_resolve, Object, | 5763 ACCESSORS(PromiseReactionJobInfo, deferred_on_resolve, Object, |
5756 kDeferredOnResolveOffset); | 5764 kDeferredOnResolveOffset); |
5757 ACCESSORS(PromiseReactionJobInfo, deferred_on_reject, Object, | 5765 ACCESSORS(PromiseReactionJobInfo, deferred_on_reject, Object, |
5758 kDeferredOnRejectOffset); | 5766 kDeferredOnRejectOffset); |
5759 SMI_ACCESSORS(PromiseReactionJobInfo, debug_id, kDebugIdOffset); | 5767 SMI_ACCESSORS(PromiseReactionJobInfo, debug_id, kDebugIdOffset); |
5760 SMI_ACCESSORS(PromiseReactionJobInfo, debug_name, kDebugNameOffset); | 5768 SMI_ACCESSORS(PromiseReactionJobInfo, debug_name, kDebugNameOffset); |
5761 ACCESSORS(PromiseReactionJobInfo, context, Context, kContextOffset); | 5769 ACCESSORS(PromiseReactionJobInfo, context, Context, kContextOffset); |
5762 | 5770 |
| 5771 ACCESSORS(AsyncGeneratorRequest, next, Object, kNextOffset) |
| 5772 SMI_ACCESSORS(AsyncGeneratorRequest, resume_mode, kResumeModeOffset) |
| 5773 ACCESSORS(AsyncGeneratorRequest, value, Object, kValueOffset) |
| 5774 ACCESSORS(AsyncGeneratorRequest, promise, Object, kPromiseOffset) |
| 5775 ACCESSORS(AsyncGeneratorRequest, awaited_promise, Object, kAwaitedPromiseOffset) |
| 5776 |
5763 Map* PrototypeInfo::ObjectCreateMap() { | 5777 Map* PrototypeInfo::ObjectCreateMap() { |
5764 return Map::cast(WeakCell::cast(object_create_map())->value()); | 5778 return Map::cast(WeakCell::cast(object_create_map())->value()); |
5765 } | 5779 } |
5766 | 5780 |
5767 // static | 5781 // static |
5768 void PrototypeInfo::SetObjectCreateMap(Handle<PrototypeInfo> info, | 5782 void PrototypeInfo::SetObjectCreateMap(Handle<PrototypeInfo> info, |
5769 Handle<Map> map) { | 5783 Handle<Map> map) { |
5770 Handle<WeakCell> cell = Map::WeakCellForMap(map); | 5784 Handle<WeakCell> cell = Map::WeakCellForMap(map); |
5771 info->set_object_create_map(*cell); | 5785 info->set_object_create_map(*cell); |
5772 } | 5786 } |
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6785 } | 6799 } |
6786 | 6800 |
6787 bool JSGeneratorObject::is_closed() const { | 6801 bool JSGeneratorObject::is_closed() const { |
6788 return continuation() == kGeneratorClosed; | 6802 return continuation() == kGeneratorClosed; |
6789 } | 6803 } |
6790 | 6804 |
6791 bool JSGeneratorObject::is_executing() const { | 6805 bool JSGeneratorObject::is_executing() const { |
6792 return continuation() == kGeneratorExecuting; | 6806 return continuation() == kGeneratorExecuting; |
6793 } | 6807 } |
6794 | 6808 |
| 6809 ACCESSORS(JSAsyncGeneratorObject, queue, HeapObject, kQueueOffset) |
| 6810 |
6795 ACCESSORS(JSValue, value, Object, kValueOffset) | 6811 ACCESSORS(JSValue, value, Object, kValueOffset) |
6796 | 6812 |
6797 | 6813 |
6798 HeapNumber* HeapNumber::cast(Object* object) { | 6814 HeapNumber* HeapNumber::cast(Object* object) { |
6799 SLOW_DCHECK(object->IsHeapNumber() || object->IsMutableHeapNumber()); | 6815 SLOW_DCHECK(object->IsHeapNumber() || object->IsMutableHeapNumber()); |
6800 return reinterpret_cast<HeapNumber*>(object); | 6816 return reinterpret_cast<HeapNumber*>(object); |
6801 } | 6817 } |
6802 | 6818 |
6803 | 6819 |
6804 const HeapNumber* HeapNumber::cast(const Object* object) { | 6820 const HeapNumber* HeapNumber::cast(const Object* object) { |
(...skipping 1617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8422 ACCESSORS(JSIteratorResult, value, Object, kValueOffset) | 8438 ACCESSORS(JSIteratorResult, value, Object, kValueOffset) |
8423 ACCESSORS(JSIteratorResult, done, Object, kDoneOffset) | 8439 ACCESSORS(JSIteratorResult, done, Object, kDoneOffset) |
8424 | 8440 |
8425 ACCESSORS(JSArrayIterator, object, Object, kIteratedObjectOffset) | 8441 ACCESSORS(JSArrayIterator, object, Object, kIteratedObjectOffset) |
8426 ACCESSORS(JSArrayIterator, index, Object, kNextIndexOffset) | 8442 ACCESSORS(JSArrayIterator, index, Object, kNextIndexOffset) |
8427 ACCESSORS(JSArrayIterator, object_map, Object, kIteratedObjectMapOffset) | 8443 ACCESSORS(JSArrayIterator, object_map, Object, kIteratedObjectMapOffset) |
8428 | 8444 |
8429 ACCESSORS(JSStringIterator, string, String, kStringOffset) | 8445 ACCESSORS(JSStringIterator, string, String, kStringOffset) |
8430 SMI_ACCESSORS(JSStringIterator, index, kNextIndexOffset) | 8446 SMI_ACCESSORS(JSStringIterator, index, kNextIndexOffset) |
8431 | 8447 |
| 8448 ACCESSORS(JSAsyncFromSyncIterator, sync_iterator, HeapObject, |
| 8449 kSyncIteratorOffset) |
| 8450 |
8432 #undef INT_ACCESSORS | 8451 #undef INT_ACCESSORS |
8433 #undef ACCESSORS | 8452 #undef ACCESSORS |
8434 #undef ACCESSORS_CHECKED | 8453 #undef ACCESSORS_CHECKED |
8435 #undef ACCESSORS_CHECKED2 | 8454 #undef ACCESSORS_CHECKED2 |
8436 #undef SMI_ACCESSORS | 8455 #undef SMI_ACCESSORS |
8437 #undef SYNCHRONIZED_SMI_ACCESSORS | 8456 #undef SYNCHRONIZED_SMI_ACCESSORS |
8438 #undef NOBARRIER_SMI_ACCESSORS | 8457 #undef NOBARRIER_SMI_ACCESSORS |
8439 #undef BOOL_GETTER | 8458 #undef BOOL_GETTER |
8440 #undef BOOL_ACCESSORS | 8459 #undef BOOL_ACCESSORS |
8441 #undef FIELD_ADDR | 8460 #undef FIELD_ADDR |
(...skipping 30 matching lines...) Expand all Loading... |
8472 #undef WRITE_INT64_FIELD | 8491 #undef WRITE_INT64_FIELD |
8473 #undef READ_BYTE_FIELD | 8492 #undef READ_BYTE_FIELD |
8474 #undef WRITE_BYTE_FIELD | 8493 #undef WRITE_BYTE_FIELD |
8475 #undef NOBARRIER_READ_BYTE_FIELD | 8494 #undef NOBARRIER_READ_BYTE_FIELD |
8476 #undef NOBARRIER_WRITE_BYTE_FIELD | 8495 #undef NOBARRIER_WRITE_BYTE_FIELD |
8477 | 8496 |
8478 } // namespace internal | 8497 } // namespace internal |
8479 } // namespace v8 | 8498 } // namespace v8 |
8480 | 8499 |
8481 #endif // V8_OBJECTS_INL_H_ | 8500 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |