| 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) |
| 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 |
| 8225 #undef INT_ACCESSORS | |
| 8226 #undef ACCESSORS | |
| 8227 #undef ACCESSORS_CHECKED | |
| 8228 #undef ACCESSORS_CHECKED2 | |
| 8229 #undef SMI_ACCESSORS | |
| 8230 #undef SYNCHRONIZED_SMI_ACCESSORS | |
| 8231 #undef NOBARRIER_SMI_ACCESSORS | |
| 8232 #undef BOOL_GETTER | |
| 8233 #undef BOOL_ACCESSORS | |
| 8234 #undef FIELD_ADDR | |
| 8235 #undef FIELD_ADDR_CONST | |
| 8236 #undef READ_FIELD | |
| 8237 #undef NOBARRIER_READ_FIELD | |
| 8238 #undef WRITE_FIELD | |
| 8239 #undef NOBARRIER_WRITE_FIELD | |
| 8240 #undef WRITE_BARRIER | |
| 8241 #undef CONDITIONAL_WRITE_BARRIER | |
| 8242 #undef READ_DOUBLE_FIELD | |
| 8243 #undef WRITE_DOUBLE_FIELD | |
| 8244 #undef READ_INT_FIELD | |
| 8245 #undef WRITE_INT_FIELD | |
| 8246 #undef READ_INTPTR_FIELD | |
| 8247 #undef WRITE_INTPTR_FIELD | |
| 8248 #undef READ_UINT8_FIELD | |
| 8249 #undef WRITE_UINT8_FIELD | |
| 8250 #undef READ_INT8_FIELD | |
| 8251 #undef WRITE_INT8_FIELD | |
| 8252 #undef READ_UINT16_FIELD | |
| 8253 #undef WRITE_UINT16_FIELD | |
| 8254 #undef READ_INT16_FIELD | |
| 8255 #undef WRITE_INT16_FIELD | |
| 8256 #undef READ_UINT32_FIELD | |
| 8257 #undef WRITE_UINT32_FIELD | |
| 8258 #undef READ_INT32_FIELD | |
| 8259 #undef WRITE_INT32_FIELD | |
| 8260 #undef READ_FLOAT_FIELD | |
| 8261 #undef WRITE_FLOAT_FIELD | |
| 8262 #undef READ_UINT64_FIELD | |
| 8263 #undef WRITE_UINT64_FIELD | |
| 8264 #undef READ_INT64_FIELD | |
| 8265 #undef WRITE_INT64_FIELD | |
| 8266 #undef READ_BYTE_FIELD | |
| 8267 #undef WRITE_BYTE_FIELD | |
| 8268 #undef NOBARRIER_READ_BYTE_FIELD | |
| 8269 #undef NOBARRIER_WRITE_BYTE_FIELD | |
| 8270 | |
| 8271 } // namespace internal | 7968 } // namespace internal |
| 8272 } // namespace v8 | 7969 } // namespace v8 |
| 8273 | 7970 |
| 8274 #include "src/objects/object-macros-undef.h" | 7971 #include "src/objects/object-macros-undef.h" |
| 8275 | 7972 |
| 8276 #endif // V8_OBJECTS_INL_H_ | 7973 #endif // V8_OBJECTS_INL_H_ |
| OLD | NEW |