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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
60 } | 60 } |
61 | 61 |
62 | 62 |
63 int PropertyDetails::field_width_in_words() const { | 63 int PropertyDetails::field_width_in_words() const { |
64 DCHECK(location() == kField); | 64 DCHECK(location() == kField); |
65 if (!FLAG_unbox_double_fields) return 1; | 65 if (!FLAG_unbox_double_fields) return 1; |
66 if (kDoubleSize == kPointerSize) return 1; | 66 if (kDoubleSize == kPointerSize) return 1; |
67 return representation().IsDouble() ? kDoubleSize / kPointerSize : 1; | 67 return representation().IsDouble() ? kDoubleSize / kPointerSize : 1; |
68 } | 68 } |
69 | 69 |
70 #define INT_ACCESSORS(holder, name, offset) \ | |
71 int holder::name() const { return READ_INT_FIELD(this, offset); } \ | |
72 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); } | |
73 | |
74 #define ACCESSORS_CHECKED2(holder, name, type, offset, get_condition, \ | |
75 set_condition) \ | |
76 type* holder::name() const { \ | |
77 DCHECK(get_condition); \ | |
78 return type::cast(READ_FIELD(this, offset)); \ | |
79 } \ | |
80 void holder::set_##name(type* value, WriteBarrierMode mode) { \ | |
81 DCHECK(set_condition); \ | |
82 WRITE_FIELD(this, offset, value); \ | |
83 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \ | |
84 } | |
85 #define ACCESSORS_CHECKED(holder, name, type, offset, condition) \ | |
86 ACCESSORS_CHECKED2(holder, name, type, offset, condition, condition) | |
87 | |
88 #define ACCESSORS(holder, name, type, offset) \ | |
89 ACCESSORS_CHECKED(holder, name, type, offset, true) | |
90 | |
91 // Getter that returns a Smi as an int and writes an int as a Smi. | |
92 #define SMI_ACCESSORS_CHECKED(holder, name, offset, condition) \ | |
93 int holder::name() const { \ | |
94 DCHECK(condition); \ | |
95 Object* value = READ_FIELD(this, offset); \ | |
96 return Smi::cast(value)->value(); \ | |
97 } \ | |
98 void holder::set_##name(int value) { \ | |
99 DCHECK(condition); \ | |
100 WRITE_FIELD(this, offset, Smi::FromInt(value)); \ | |
101 } | |
102 | |
103 #define SMI_ACCESSORS(holder, name, offset) \ | |
104 SMI_ACCESSORS_CHECKED(holder, name, offset, true) | |
105 | |
106 #define SYNCHRONIZED_SMI_ACCESSORS(holder, name, offset) \ | |
107 int holder::synchronized_##name() const { \ | |
108 Object* value = ACQUIRE_READ_FIELD(this, offset); \ | |
109 return Smi::cast(value)->value(); \ | |
110 } \ | |
111 void holder::synchronized_set_##name(int value) { \ | |
112 RELEASE_WRITE_FIELD(this, offset, Smi::FromInt(value)); \ | |
113 } | |
114 | |
115 #define NOBARRIER_SMI_ACCESSORS(holder, name, offset) \ | |
116 int holder::nobarrier_##name() const { \ | |
117 Object* value = NOBARRIER_READ_FIELD(this, offset); \ | |
118 return Smi::cast(value)->value(); \ | |
119 } \ | |
120 void holder::nobarrier_set_##name(int value) { \ | |
121 NOBARRIER_WRITE_FIELD(this, offset, Smi::FromInt(value)); \ | |
122 } | |
123 | |
124 #define BOOL_GETTER(holder, field, name, offset) \ | |
125 bool holder::name() const { \ | |
126 return BooleanBit::get(field(), offset); \ | |
127 } \ | |
128 | |
129 | |
130 #define BOOL_ACCESSORS(holder, field, name, offset) \ | |
131 bool holder::name() const { \ | |
132 return BooleanBit::get(field(), offset); \ | |
133 } \ | |
134 void holder::set_##name(bool value) { \ | |
135 set_##field(BooleanBit::set(field(), offset, value)); \ | |
136 } | |
137 | |
138 #define TYPE_CHECKER(type, instancetype) \ | |
139 bool HeapObject::Is##type() const { \ | |
140 return map()->instance_type() == instancetype; \ | |
141 } | |
142 | |
143 TYPE_CHECKER(BreakPointInfo, TUPLE2_TYPE) | 70 TYPE_CHECKER(BreakPointInfo, TUPLE2_TYPE) |
144 TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) | 71 TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) |
145 TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE) | 72 TYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE) |
146 TYPE_CHECKER(CallHandlerInfo, TUPLE2_TYPE) | 73 TYPE_CHECKER(CallHandlerInfo, TUPLE2_TYPE) |
147 TYPE_CHECKER(Cell, CELL_TYPE) | 74 TYPE_CHECKER(Cell, CELL_TYPE) |
148 TYPE_CHECKER(Code, CODE_TYPE) | 75 TYPE_CHECKER(Code, CODE_TYPE) |
149 TYPE_CHECKER(ConstantElementsPair, TUPLE2_TYPE) | 76 TYPE_CHECKER(ConstantElementsPair, TUPLE2_TYPE) |
150 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) | 77 TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) |
151 TYPE_CHECKER(Foreign, FOREIGN_TYPE) | 78 TYPE_CHECKER(Foreign, FOREIGN_TYPE) |
152 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) | 79 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
595 | 522 |
596 bool Object::IsMinusZero() const { | 523 bool Object::IsMinusZero() const { |
597 return this->IsHeapNumber() && | 524 return this->IsHeapNumber() && |
598 i::IsMinusZero(HeapNumber::cast(this)->value()); | 525 i::IsMinusZero(HeapNumber::cast(this)->value()); |
599 } | 526 } |
600 | 527 |
601 // ------------------------------------ | 528 // ------------------------------------ |
602 // Cast operations | 529 // Cast operations |
603 | 530 |
604 CAST_ACCESSOR(AbstractCode) | 531 CAST_ACCESSOR(AbstractCode) |
532 CAST_ACCESSOR(AccessCheckInfo) | |
jgruber
2017/05/23 09:58:36
Sorted and added all STRUCT types except for Debug
| |
533 CAST_ACCESSOR(AccessorInfo) | |
534 CAST_ACCESSOR(AccessorPair) | |
535 CAST_ACCESSOR(AliasedArgumentsEntry) | |
536 CAST_ACCESSOR(AllocationMemento) | |
537 CAST_ACCESSOR(AllocationSite) | |
605 CAST_ACCESSOR(ArrayList) | 538 CAST_ACCESSOR(ArrayList) |
539 CAST_ACCESSOR(AsyncGeneratorRequest) | |
606 CAST_ACCESSOR(BoilerplateDescription) | 540 CAST_ACCESSOR(BoilerplateDescription) |
607 CAST_ACCESSOR(BreakPointInfo) | |
608 CAST_ACCESSOR(ByteArray) | 541 CAST_ACCESSOR(ByteArray) |
609 CAST_ACCESSOR(BytecodeArray) | 542 CAST_ACCESSOR(BytecodeArray) |
610 CAST_ACCESSOR(CallHandlerInfo) | 543 CAST_ACCESSOR(CallHandlerInfo) |
611 CAST_ACCESSOR(Cell) | 544 CAST_ACCESSOR(Cell) |
612 CAST_ACCESSOR(Code) | 545 CAST_ACCESSOR(Code) |
613 CAST_ACCESSOR(ConsString) | 546 CAST_ACCESSOR(ConsString) |
614 CAST_ACCESSOR(ConstantElementsPair) | 547 CAST_ACCESSOR(ConstantElementsPair) |
548 CAST_ACCESSOR(ContextExtension) | |
615 CAST_ACCESSOR(DeoptimizationInputData) | 549 CAST_ACCESSOR(DeoptimizationInputData) |
616 CAST_ACCESSOR(DeoptimizationOutputData) | 550 CAST_ACCESSOR(DeoptimizationOutputData) |
617 CAST_ACCESSOR(DependentCode) | 551 CAST_ACCESSOR(DependentCode) |
618 CAST_ACCESSOR(DescriptorArray) | 552 CAST_ACCESSOR(DescriptorArray) |
619 CAST_ACCESSOR(ExternalOneByteString) | 553 CAST_ACCESSOR(ExternalOneByteString) |
620 CAST_ACCESSOR(ExternalString) | 554 CAST_ACCESSOR(ExternalString) |
621 CAST_ACCESSOR(ExternalTwoByteString) | 555 CAST_ACCESSOR(ExternalTwoByteString) |
622 CAST_ACCESSOR(FixedArray) | 556 CAST_ACCESSOR(FixedArray) |
623 CAST_ACCESSOR(FixedArrayBase) | 557 CAST_ACCESSOR(FixedArrayBase) |
624 CAST_ACCESSOR(FixedDoubleArray) | 558 CAST_ACCESSOR(FixedDoubleArray) |
625 CAST_ACCESSOR(FixedTypedArrayBase) | 559 CAST_ACCESSOR(FixedTypedArrayBase) |
626 CAST_ACCESSOR(Foreign) | 560 CAST_ACCESSOR(Foreign) |
561 CAST_ACCESSOR(FunctionTemplateInfo) | |
627 CAST_ACCESSOR(GlobalDictionary) | 562 CAST_ACCESSOR(GlobalDictionary) |
628 CAST_ACCESSOR(HandlerTable) | 563 CAST_ACCESSOR(HandlerTable) |
629 CAST_ACCESSOR(HeapObject) | 564 CAST_ACCESSOR(HeapObject) |
565 CAST_ACCESSOR(InterceptorInfo) | |
630 CAST_ACCESSOR(JSArgumentsObject); | 566 CAST_ACCESSOR(JSArgumentsObject); |
631 CAST_ACCESSOR(JSArray) | 567 CAST_ACCESSOR(JSArray) |
632 CAST_ACCESSOR(JSArrayBuffer) | 568 CAST_ACCESSOR(JSArrayBuffer) |
633 CAST_ACCESSOR(JSArrayBufferView) | 569 CAST_ACCESSOR(JSArrayBufferView) |
570 CAST_ACCESSOR(JSArrayIterator) | |
571 CAST_ACCESSOR(JSAsyncFromSyncIterator) | |
572 CAST_ACCESSOR(JSAsyncGeneratorObject) | |
634 CAST_ACCESSOR(JSBoundFunction) | 573 CAST_ACCESSOR(JSBoundFunction) |
635 CAST_ACCESSOR(JSDataView) | 574 CAST_ACCESSOR(JSDataView) |
636 CAST_ACCESSOR(JSDate) | 575 CAST_ACCESSOR(JSDate) |
637 CAST_ACCESSOR(JSFunction) | 576 CAST_ACCESSOR(JSFunction) |
638 CAST_ACCESSOR(JSGeneratorObject) | 577 CAST_ACCESSOR(JSGeneratorObject) |
639 CAST_ACCESSOR(JSAsyncGeneratorObject) | |
640 CAST_ACCESSOR(JSGlobalObject) | 578 CAST_ACCESSOR(JSGlobalObject) |
641 CAST_ACCESSOR(JSGlobalProxy) | 579 CAST_ACCESSOR(JSGlobalProxy) |
642 CAST_ACCESSOR(JSMap) | 580 CAST_ACCESSOR(JSMap) |
643 CAST_ACCESSOR(JSMapIterator) | 581 CAST_ACCESSOR(JSMapIterator) |
644 CAST_ACCESSOR(JSMessageObject) | 582 CAST_ACCESSOR(JSMessageObject) |
645 CAST_ACCESSOR(JSModuleNamespace) | 583 CAST_ACCESSOR(JSModuleNamespace) |
646 CAST_ACCESSOR(JSObject) | 584 CAST_ACCESSOR(JSObject) |
585 CAST_ACCESSOR(JSPromise) | |
586 CAST_ACCESSOR(JSPromiseCapability) | |
647 CAST_ACCESSOR(JSProxy) | 587 CAST_ACCESSOR(JSProxy) |
648 CAST_ACCESSOR(JSReceiver) | 588 CAST_ACCESSOR(JSReceiver) |
649 CAST_ACCESSOR(JSRegExp) | 589 CAST_ACCESSOR(JSRegExp) |
650 CAST_ACCESSOR(JSPromiseCapability) | |
651 CAST_ACCESSOR(JSPromise) | |
652 CAST_ACCESSOR(JSSet) | 590 CAST_ACCESSOR(JSSet) |
653 CAST_ACCESSOR(JSSetIterator) | 591 CAST_ACCESSOR(JSSetIterator) |
654 CAST_ACCESSOR(JSSloppyArgumentsObject) | 592 CAST_ACCESSOR(JSSloppyArgumentsObject) |
655 CAST_ACCESSOR(JSAsyncFromSyncIterator) | |
656 CAST_ACCESSOR(JSStringIterator) | 593 CAST_ACCESSOR(JSStringIterator) |
657 CAST_ACCESSOR(JSArrayIterator) | |
658 CAST_ACCESSOR(JSTypedArray) | 594 CAST_ACCESSOR(JSTypedArray) |
659 CAST_ACCESSOR(JSValue) | 595 CAST_ACCESSOR(JSValue) |
660 CAST_ACCESSOR(JSWeakCollection) | 596 CAST_ACCESSOR(JSWeakCollection) |
661 CAST_ACCESSOR(JSWeakMap) | 597 CAST_ACCESSOR(JSWeakMap) |
662 CAST_ACCESSOR(JSWeakSet) | 598 CAST_ACCESSOR(JSWeakSet) |
663 CAST_ACCESSOR(LayoutDescriptor) | 599 CAST_ACCESSOR(LayoutDescriptor) |
600 CAST_ACCESSOR(Module) | |
664 CAST_ACCESSOR(ModuleInfo) | 601 CAST_ACCESSOR(ModuleInfo) |
602 CAST_ACCESSOR(ModuleInfoEntry) | |
665 CAST_ACCESSOR(Name) | 603 CAST_ACCESSOR(Name) |
666 CAST_ACCESSOR(NameDictionary) | 604 CAST_ACCESSOR(NameDictionary) |
667 CAST_ACCESSOR(NormalizedMapCache) | 605 CAST_ACCESSOR(NormalizedMapCache) |
668 CAST_ACCESSOR(Object) | 606 CAST_ACCESSOR(Object) |
607 CAST_ACCESSOR(ObjectHashSet) | |
669 CAST_ACCESSOR(ObjectHashTable) | 608 CAST_ACCESSOR(ObjectHashTable) |
670 CAST_ACCESSOR(ObjectHashSet) | 609 CAST_ACCESSOR(ObjectTemplateInfo) |
671 CAST_ACCESSOR(Oddball) | 610 CAST_ACCESSOR(Oddball) |
672 CAST_ACCESSOR(OrderedHashMap) | 611 CAST_ACCESSOR(OrderedHashMap) |
673 CAST_ACCESSOR(OrderedHashSet) | 612 CAST_ACCESSOR(OrderedHashSet) |
613 CAST_ACCESSOR(PromiseReactionJobInfo) | |
614 CAST_ACCESSOR(PromiseResolveThenableJobInfo) | |
674 CAST_ACCESSOR(PropertyCell) | 615 CAST_ACCESSOR(PropertyCell) |
675 CAST_ACCESSOR(TemplateList) | 616 CAST_ACCESSOR(PrototypeInfo) |
676 CAST_ACCESSOR(RegExpMatchInfo) | 617 CAST_ACCESSOR(RegExpMatchInfo) |
677 CAST_ACCESSOR(ScopeInfo) | 618 CAST_ACCESSOR(ScopeInfo) |
619 CAST_ACCESSOR(Script) | |
678 CAST_ACCESSOR(SeededNumberDictionary) | 620 CAST_ACCESSOR(SeededNumberDictionary) |
679 CAST_ACCESSOR(SeqOneByteString) | 621 CAST_ACCESSOR(SeqOneByteString) |
680 CAST_ACCESSOR(SeqString) | 622 CAST_ACCESSOR(SeqString) |
681 CAST_ACCESSOR(SeqTwoByteString) | 623 CAST_ACCESSOR(SeqTwoByteString) |
682 CAST_ACCESSOR(SharedFunctionInfo) | 624 CAST_ACCESSOR(SharedFunctionInfo) |
683 CAST_ACCESSOR(SourcePositionTableWithFrameCache) | |
684 CAST_ACCESSOR(SlicedString) | 625 CAST_ACCESSOR(SlicedString) |
685 CAST_ACCESSOR(SloppyArgumentsElements) | 626 CAST_ACCESSOR(SloppyArgumentsElements) |
686 CAST_ACCESSOR(Smi) | 627 CAST_ACCESSOR(Smi) |
628 CAST_ACCESSOR(SourcePositionTableWithFrameCache) | |
629 CAST_ACCESSOR(StackFrameInfo) | |
687 CAST_ACCESSOR(String) | 630 CAST_ACCESSOR(String) |
688 CAST_ACCESSOR(StringSet) | 631 CAST_ACCESSOR(StringSet) |
689 CAST_ACCESSOR(StringTable) | 632 CAST_ACCESSOR(StringTable) |
690 CAST_ACCESSOR(Struct) | 633 CAST_ACCESSOR(Struct) |
691 CAST_ACCESSOR(Symbol) | 634 CAST_ACCESSOR(Symbol) |
692 CAST_ACCESSOR(TemplateInfo) | 635 CAST_ACCESSOR(TemplateInfo) |
636 CAST_ACCESSOR(TemplateList) | |
693 CAST_ACCESSOR(ThinString) | 637 CAST_ACCESSOR(ThinString) |
638 CAST_ACCESSOR(Tuple2) | |
639 CAST_ACCESSOR(Tuple3) | |
694 CAST_ACCESSOR(TypeFeedbackInfo) | 640 CAST_ACCESSOR(TypeFeedbackInfo) |
695 CAST_ACCESSOR(UnseededNumberDictionary) | 641 CAST_ACCESSOR(UnseededNumberDictionary) |
696 CAST_ACCESSOR(WeakCell) | 642 CAST_ACCESSOR(WeakCell) |
697 CAST_ACCESSOR(WeakFixedArray) | 643 CAST_ACCESSOR(WeakFixedArray) |
698 CAST_ACCESSOR(WeakHashTable) | 644 CAST_ACCESSOR(WeakHashTable) |
699 | 645 |
700 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) | |
701 STRUCT_LIST(MAKE_STRUCT_CAST) | |
702 #undef MAKE_STRUCT_CAST | |
703 | |
704 #undef CAST_ACCESSOR | |
705 | |
706 bool Object::HasValidElements() { | 646 bool Object::HasValidElements() { |
707 // Dictionary is covered under FixedArray. | 647 // Dictionary is covered under FixedArray. |
708 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); | 648 return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase(); |
709 } | 649 } |
710 | 650 |
711 bool Object::KeyEquals(Object* second) { | 651 bool Object::KeyEquals(Object* second) { |
712 Object* first = this; | 652 Object* first = this; |
713 if (second->IsNumber()) { | 653 if (second->IsNumber()) { |
714 if (first->IsNumber()) return first->Number() == second->Number(); | 654 if (first->IsNumber()) return first->Number() == second->Number(); |
715 Object* temp = first; | 655 Object* temp = first; |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1260 HeapObject* empty = isolate->heap()->empty_fixed_array(); | 1200 HeapObject* empty = isolate->heap()->empty_fixed_array(); |
1261 while (prototype != null) { | 1201 while (prototype != null) { |
1262 Map* map = prototype->map(); | 1202 Map* map = prototype->map(); |
1263 if (map->instance_type() <= LAST_CUSTOM_ELEMENTS_RECEIVER) return false; | 1203 if (map->instance_type() <= LAST_CUSTOM_ELEMENTS_RECEIVER) return false; |
1264 if (JSObject::cast(prototype)->elements() != empty) return false; | 1204 if (JSObject::cast(prototype)->elements() != empty) return false; |
1265 prototype = HeapObject::cast(map->prototype()); | 1205 prototype = HeapObject::cast(map->prototype()); |
1266 } | 1206 } |
1267 return true; | 1207 return true; |
1268 } | 1208 } |
1269 | 1209 |
1270 #define FIELD_ADDR(p, offset) \ | |
1271 (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) | |
1272 | |
1273 #define FIELD_ADDR_CONST(p, offset) \ | |
1274 (reinterpret_cast<const byte*>(p) + offset - kHeapObjectTag) | |
1275 | |
1276 #define READ_FIELD(p, offset) \ | |
1277 (*reinterpret_cast<Object* const*>(FIELD_ADDR_CONST(p, offset))) | |
1278 | |
1279 #define ACQUIRE_READ_FIELD(p, offset) \ | |
1280 reinterpret_cast<Object*>(base::Acquire_Load( \ | |
1281 reinterpret_cast<const base::AtomicWord*>(FIELD_ADDR_CONST(p, offset)))) | |
1282 | |
1283 #define NOBARRIER_READ_FIELD(p, offset) \ | |
1284 reinterpret_cast<Object*>(base::NoBarrier_Load( \ | |
1285 reinterpret_cast<const base::AtomicWord*>(FIELD_ADDR_CONST(p, offset)))) | |
1286 | |
1287 #ifdef V8_CONCURRENT_MARKING | |
1288 #define WRITE_FIELD(p, offset, value) \ | |
1289 base::NoBarrier_Store( \ | |
1290 reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \ | |
1291 reinterpret_cast<base::AtomicWord>(value)); | |
1292 #else | |
1293 #define WRITE_FIELD(p, offset, value) \ | |
1294 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) | |
1295 #endif | |
1296 | |
1297 #define RELEASE_WRITE_FIELD(p, offset, value) \ | |
1298 base::Release_Store( \ | |
1299 reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \ | |
1300 reinterpret_cast<base::AtomicWord>(value)); | |
1301 | |
1302 #define NOBARRIER_WRITE_FIELD(p, offset, value) \ | |
1303 base::NoBarrier_Store( \ | |
1304 reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \ | |
1305 reinterpret_cast<base::AtomicWord>(value)); | |
1306 | |
1307 #define WRITE_BARRIER(heap, object, offset, value) \ | |
1308 heap->incremental_marking()->RecordWrite( \ | |
1309 object, HeapObject::RawField(object, offset), value); \ | |
1310 heap->RecordWrite(object, offset, value); | |
1311 | |
1312 #define FIXED_ARRAY_ELEMENTS_WRITE_BARRIER(heap, array, start, length) \ | |
1313 do { \ | |
1314 heap->RecordFixedArrayElements(array, start, length); \ | |
1315 heap->incremental_marking()->IterateBlackObject(array); \ | |
1316 } while (false) | |
1317 | |
1318 #define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \ | |
1319 if (mode != SKIP_WRITE_BARRIER) { \ | |
1320 if (mode == UPDATE_WRITE_BARRIER) { \ | |
1321 heap->incremental_marking()->RecordWrite( \ | |
1322 object, HeapObject::RawField(object, offset), value); \ | |
1323 } \ | |
1324 heap->RecordWrite(object, offset, value); \ | |
1325 } | |
1326 | |
1327 #define READ_DOUBLE_FIELD(p, offset) \ | |
1328 ReadDoubleValue(FIELD_ADDR_CONST(p, offset)) | |
1329 | |
1330 #define WRITE_DOUBLE_FIELD(p, offset, value) \ | |
1331 WriteDoubleValue(FIELD_ADDR(p, offset), value) | |
1332 | |
1333 #define READ_INT_FIELD(p, offset) \ | |
1334 (*reinterpret_cast<const int*>(FIELD_ADDR_CONST(p, offset))) | |
1335 | |
1336 #define WRITE_INT_FIELD(p, offset, value) \ | |
1337 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value) | |
1338 | |
1339 #define READ_INTPTR_FIELD(p, offset) \ | |
1340 (*reinterpret_cast<const intptr_t*>(FIELD_ADDR_CONST(p, offset))) | |
1341 | |
1342 #define WRITE_INTPTR_FIELD(p, offset, value) \ | |
1343 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value) | |
1344 | |
1345 #define READ_UINT8_FIELD(p, offset) \ | |
1346 (*reinterpret_cast<const uint8_t*>(FIELD_ADDR_CONST(p, offset))) | |
1347 | |
1348 #define WRITE_UINT8_FIELD(p, offset, value) \ | |
1349 (*reinterpret_cast<uint8_t*>(FIELD_ADDR(p, offset)) = value) | |
1350 | |
1351 #define READ_INT8_FIELD(p, offset) \ | |
1352 (*reinterpret_cast<const int8_t*>(FIELD_ADDR_CONST(p, offset))) | |
1353 | |
1354 #define WRITE_INT8_FIELD(p, offset, value) \ | |
1355 (*reinterpret_cast<int8_t*>(FIELD_ADDR(p, offset)) = value) | |
1356 | |
1357 #define READ_UINT16_FIELD(p, offset) \ | |
1358 (*reinterpret_cast<const uint16_t*>(FIELD_ADDR_CONST(p, offset))) | |
1359 | |
1360 #define WRITE_UINT16_FIELD(p, offset, value) \ | |
1361 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value) | |
1362 | |
1363 #define READ_INT16_FIELD(p, offset) \ | |
1364 (*reinterpret_cast<const int16_t*>(FIELD_ADDR_CONST(p, offset))) | |
1365 | |
1366 #define WRITE_INT16_FIELD(p, offset, value) \ | |
1367 (*reinterpret_cast<int16_t*>(FIELD_ADDR(p, offset)) = value) | |
1368 | |
1369 #define READ_UINT32_FIELD(p, offset) \ | |
1370 (*reinterpret_cast<const uint32_t*>(FIELD_ADDR_CONST(p, offset))) | |
1371 | |
1372 #define WRITE_UINT32_FIELD(p, offset, value) \ | |
1373 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value) | |
1374 | |
1375 #define READ_INT32_FIELD(p, offset) \ | |
1376 (*reinterpret_cast<const int32_t*>(FIELD_ADDR_CONST(p, offset))) | |
1377 | |
1378 #define WRITE_INT32_FIELD(p, offset, value) \ | |
1379 (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)) = value) | |
1380 | |
1381 #define READ_FLOAT_FIELD(p, offset) \ | |
1382 (*reinterpret_cast<const float*>(FIELD_ADDR_CONST(p, offset))) | |
1383 | |
1384 #define WRITE_FLOAT_FIELD(p, offset, value) \ | |
1385 (*reinterpret_cast<float*>(FIELD_ADDR(p, offset)) = value) | |
1386 | |
1387 #define READ_UINT64_FIELD(p, offset) \ | |
1388 (*reinterpret_cast<const uint64_t*>(FIELD_ADDR_CONST(p, offset))) | |
1389 | |
1390 #define WRITE_UINT64_FIELD(p, offset, value) \ | |
1391 (*reinterpret_cast<uint64_t*>(FIELD_ADDR(p, offset)) = value) | |
1392 | |
1393 #define READ_INT64_FIELD(p, offset) \ | |
1394 (*reinterpret_cast<const int64_t*>(FIELD_ADDR_CONST(p, offset))) | |
1395 | |
1396 #define WRITE_INT64_FIELD(p, offset, value) \ | |
1397 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value) | |
1398 | |
1399 #define READ_BYTE_FIELD(p, offset) \ | |
1400 (*reinterpret_cast<const byte*>(FIELD_ADDR_CONST(p, offset))) | |
1401 | |
1402 #define NOBARRIER_READ_BYTE_FIELD(p, offset) \ | |
1403 static_cast<byte>(base::NoBarrier_Load( \ | |
1404 reinterpret_cast<base::Atomic8*>(FIELD_ADDR(p, offset)))) | |
1405 | |
1406 #define WRITE_BYTE_FIELD(p, offset, value) \ | |
1407 (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value) | |
1408 | |
1409 #define NOBARRIER_WRITE_BYTE_FIELD(p, offset, value) \ | |
1410 base::NoBarrier_Store( \ | |
1411 reinterpret_cast<base::Atomic8*>(FIELD_ADDR(p, offset)), \ | |
1412 static_cast<base::Atomic8>(value)); | |
1413 | |
1414 Object** HeapObject::RawField(HeapObject* obj, int byte_offset) { | 1210 Object** HeapObject::RawField(HeapObject* obj, int byte_offset) { |
1415 return reinterpret_cast<Object**>(FIELD_ADDR(obj, byte_offset)); | 1211 return reinterpret_cast<Object**>(FIELD_ADDR(obj, byte_offset)); |
1416 } | 1212 } |
1417 | 1213 |
1418 | 1214 |
1419 MapWord MapWord::FromMap(const Map* map) { | 1215 MapWord MapWord::FromMap(const Map* map) { |
1420 return MapWord(reinterpret_cast<uintptr_t>(map)); | 1216 return MapWord(reinterpret_cast<uintptr_t>(map)); |
1421 } | 1217 } |
1422 | 1218 |
1423 | 1219 |
(...skipping 4414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5838 ScriptOriginOptions Script::origin_options() { | 5634 ScriptOriginOptions Script::origin_options() { |
5839 return ScriptOriginOptions((flags() & kOriginOptionsMask) >> | 5635 return ScriptOriginOptions((flags() & kOriginOptionsMask) >> |
5840 kOriginOptionsShift); | 5636 kOriginOptionsShift); |
5841 } | 5637 } |
5842 void Script::set_origin_options(ScriptOriginOptions origin_options) { | 5638 void Script::set_origin_options(ScriptOriginOptions origin_options) { |
5843 DCHECK(!(origin_options.Flags() & ~((1 << kOriginOptionsSize) - 1))); | 5639 DCHECK(!(origin_options.Flags() & ~((1 << kOriginOptionsSize) - 1))); |
5844 set_flags((flags() & ~kOriginOptionsMask) | | 5640 set_flags((flags() & ~kOriginOptionsMask) | |
5845 (origin_options.Flags() << kOriginOptionsShift)); | 5641 (origin_options.Flags() << kOriginOptionsShift)); |
5846 } | 5642 } |
5847 | 5643 |
5848 | |
5849 ACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex) | |
5850 SMI_ACCESSORS(DebugInfo, debugger_hints, kDebuggerHintsIndex) | |
5851 ACCESSORS(DebugInfo, debug_bytecode_array, Object, kDebugBytecodeArrayIndex) | |
5852 ACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex) | |
5853 | |
5854 bool DebugInfo::HasDebugBytecodeArray() { | |
5855 return debug_bytecode_array()->IsBytecodeArray(); | |
5856 } | |
5857 | |
5858 bool DebugInfo::HasDebugCode() { | |
5859 Code* code = shared()->code(); | |
5860 bool has = code->kind() == Code::FUNCTION; | |
5861 DCHECK(!has || code->has_debug_break_slots()); | |
5862 return has; | |
5863 } | |
5864 | |
5865 BytecodeArray* DebugInfo::OriginalBytecodeArray() { | |
5866 DCHECK(HasDebugBytecodeArray()); | |
5867 return shared()->bytecode_array(); | |
5868 } | |
5869 | |
5870 BytecodeArray* DebugInfo::DebugBytecodeArray() { | |
5871 DCHECK(HasDebugBytecodeArray()); | |
5872 return BytecodeArray::cast(debug_bytecode_array()); | |
5873 } | |
5874 | |
5875 Code* DebugInfo::DebugCode() { | |
5876 DCHECK(HasDebugCode()); | |
5877 return shared()->code(); | |
5878 } | |
5879 | |
5880 SMI_ACCESSORS(BreakPointInfo, source_position, kSourcePositionIndex) | |
5881 ACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex) | |
5882 | |
5883 SMI_ACCESSORS(StackFrameInfo, line_number, kLineNumberIndex) | 5644 SMI_ACCESSORS(StackFrameInfo, line_number, kLineNumberIndex) |
5884 SMI_ACCESSORS(StackFrameInfo, column_number, kColumnNumberIndex) | 5645 SMI_ACCESSORS(StackFrameInfo, column_number, kColumnNumberIndex) |
5885 SMI_ACCESSORS(StackFrameInfo, script_id, kScriptIdIndex) | 5646 SMI_ACCESSORS(StackFrameInfo, script_id, kScriptIdIndex) |
5886 ACCESSORS(StackFrameInfo, script_name, Object, kScriptNameIndex) | 5647 ACCESSORS(StackFrameInfo, script_name, Object, kScriptNameIndex) |
5887 ACCESSORS(StackFrameInfo, script_name_or_source_url, Object, | 5648 ACCESSORS(StackFrameInfo, script_name_or_source_url, Object, |
5888 kScriptNameOrSourceUrlIndex) | 5649 kScriptNameOrSourceUrlIndex) |
5889 ACCESSORS(StackFrameInfo, function_name, Object, kFunctionNameIndex) | 5650 ACCESSORS(StackFrameInfo, function_name, Object, kFunctionNameIndex) |
5890 SMI_ACCESSORS(StackFrameInfo, flag, kFlagIndex) | 5651 SMI_ACCESSORS(StackFrameInfo, flag, kFlagIndex) |
5891 BOOL_ACCESSORS(StackFrameInfo, flag, is_eval, kIsEvalBit) | 5652 BOOL_ACCESSORS(StackFrameInfo, flag, is_eval, kIsEvalBit) |
5892 BOOL_ACCESSORS(StackFrameInfo, flag, is_constructor, kIsConstructorBit) | 5653 BOOL_ACCESSORS(StackFrameInfo, flag, is_constructor, kIsConstructorBit) |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6210 return scope_info()->HasSimpleParameters(); | 5971 return scope_info()->HasSimpleParameters(); |
6211 } | 5972 } |
6212 | 5973 |
6213 bool SharedFunctionInfo::HasDebugInfo() const { | 5974 bool SharedFunctionInfo::HasDebugInfo() const { |
6214 bool has_debug_info = !debug_info()->IsSmi(); | 5975 bool has_debug_info = !debug_info()->IsSmi(); |
6215 DCHECK_EQ(debug_info()->IsStruct(), has_debug_info); | 5976 DCHECK_EQ(debug_info()->IsStruct(), has_debug_info); |
6216 DCHECK(!has_debug_info || HasDebugCode()); | 5977 DCHECK(!has_debug_info || HasDebugCode()); |
6217 return has_debug_info; | 5978 return has_debug_info; |
6218 } | 5979 } |
6219 | 5980 |
6220 DebugInfo* SharedFunctionInfo::GetDebugInfo() const { | |
6221 DCHECK(HasDebugInfo()); | |
6222 return DebugInfo::cast(debug_info()); | |
6223 } | |
6224 | |
6225 bool SharedFunctionInfo::HasDebugCode() const { | 5981 bool SharedFunctionInfo::HasDebugCode() const { |
6226 if (HasBaselineCode()) return code()->has_debug_break_slots(); | 5982 if (HasBaselineCode()) return code()->has_debug_break_slots(); |
6227 return HasBytecodeArray(); | 5983 return HasBytecodeArray(); |
6228 } | 5984 } |
6229 | 5985 |
6230 int SharedFunctionInfo::debugger_hints() const { | |
6231 if (HasDebugInfo()) return GetDebugInfo()->debugger_hints(); | |
6232 return Smi::cast(debug_info())->value(); | |
6233 } | |
6234 | |
6235 void SharedFunctionInfo::set_debugger_hints(int value) { | |
6236 if (HasDebugInfo()) { | |
6237 GetDebugInfo()->set_debugger_hints(value); | |
6238 } else { | |
6239 set_debug_info(Smi::FromInt(value)); | |
6240 } | |
6241 } | |
6242 | |
6243 bool SharedFunctionInfo::IsApiFunction() { | 5986 bool SharedFunctionInfo::IsApiFunction() { |
6244 return function_data()->IsFunctionTemplateInfo(); | 5987 return function_data()->IsFunctionTemplateInfo(); |
6245 } | 5988 } |
6246 | 5989 |
6247 | 5990 |
6248 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { | 5991 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { |
6249 DCHECK(IsApiFunction()); | 5992 DCHECK(IsApiFunction()); |
6250 return FunctionTemplateInfo::cast(function_data()); | 5993 return FunctionTemplateInfo::cast(function_data()); |
6251 } | 5994 } |
6252 | 5995 |
(...skipping 1962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8215 ACCESSORS(JSArrayIterator, object, Object, kIteratedObjectOffset) | 7958 ACCESSORS(JSArrayIterator, object, Object, kIteratedObjectOffset) |
8216 ACCESSORS(JSArrayIterator, index, Object, kNextIndexOffset) | 7959 ACCESSORS(JSArrayIterator, index, Object, kNextIndexOffset) |
8217 ACCESSORS(JSArrayIterator, object_map, Object, kIteratedObjectMapOffset) | 7960 ACCESSORS(JSArrayIterator, object_map, Object, kIteratedObjectMapOffset) |
8218 | 7961 |
8219 ACCESSORS(JSAsyncFromSyncIterator, sync_iterator, JSReceiver, | 7962 ACCESSORS(JSAsyncFromSyncIterator, sync_iterator, JSReceiver, |
8220 kSyncIteratorOffset) | 7963 kSyncIteratorOffset) |
8221 | 7964 |
8222 ACCESSORS(JSStringIterator, string, String, kStringOffset) | 7965 ACCESSORS(JSStringIterator, string, String, kStringOffset) |
8223 SMI_ACCESSORS(JSStringIterator, index, kNextIndexOffset) | 7966 SMI_ACCESSORS(JSStringIterator, index, kNextIndexOffset) |
8224 | 7967 |
7968 #undef CAST_ACCESSORS | |
marja
2017/05/23 10:38:55
What's this?
jgruber
2017/05/23 10:50:52
Removed all of these as they're now in object-macr
| |
8225 #undef INT_ACCESSORS | 7969 #undef INT_ACCESSORS |
8226 #undef ACCESSORS | 7970 #undef ACCESSORS |
8227 #undef ACCESSORS_CHECKED | 7971 #undef ACCESSORS_CHECKED |
8228 #undef ACCESSORS_CHECKED2 | 7972 #undef ACCESSORS_CHECKED2 |
8229 #undef SMI_ACCESSORS | 7973 #undef SMI_ACCESSORS |
8230 #undef SYNCHRONIZED_SMI_ACCESSORS | 7974 #undef SYNCHRONIZED_SMI_ACCESSORS |
8231 #undef NOBARRIER_SMI_ACCESSORS | 7975 #undef NOBARRIER_SMI_ACCESSORS |
8232 #undef BOOL_GETTER | 7976 #undef BOOL_GETTER |
8233 #undef BOOL_ACCESSORS | 7977 #undef BOOL_ACCESSORS |
8234 #undef FIELD_ADDR | 7978 #undef FIELD_ADDR |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8267 #undef WRITE_BYTE_FIELD | 8011 #undef WRITE_BYTE_FIELD |
8268 #undef NOBARRIER_READ_BYTE_FIELD | 8012 #undef NOBARRIER_READ_BYTE_FIELD |
8269 #undef NOBARRIER_WRITE_BYTE_FIELD | 8013 #undef NOBARRIER_WRITE_BYTE_FIELD |
8270 | 8014 |
8271 } // namespace internal | 8015 } // namespace internal |
8272 } // namespace v8 | 8016 } // namespace v8 |
8273 | 8017 |
8274 #include "src/objects/object-macros-undef.h" | 8018 #include "src/objects/object-macros-undef.h" |
8275 | 8019 |
8276 #endif // V8_OBJECTS_INL_H_ | 8020 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |