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 #ifndef V8_OBJECTS_H_ | 5 #ifndef V8_OBJECTS_H_ |
6 #define V8_OBJECTS_H_ | 6 #define V8_OBJECTS_H_ |
7 | 7 |
8 #include <iosfwd> | 8 #include <iosfwd> |
9 | 9 |
10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 // - HeapNumber | 121 // - HeapNumber |
122 // - Cell | 122 // - Cell |
123 // - PropertyCell | 123 // - PropertyCell |
124 // - Code | 124 // - Code |
125 // - Map | 125 // - Map |
126 // - Oddball | 126 // - Oddball |
127 // - Foreign | 127 // - Foreign |
128 // - SharedFunctionInfo | 128 // - SharedFunctionInfo |
129 // - Struct | 129 // - Struct |
130 // - Box | 130 // - Box |
131 // - DeclaredAccessorDescriptor | |
132 // - AccessorInfo | 131 // - AccessorInfo |
133 // - DeclaredAccessorInfo | |
134 // - ExecutableAccessorInfo | 132 // - ExecutableAccessorInfo |
135 // - AccessorPair | 133 // - AccessorPair |
136 // - AccessCheckInfo | 134 // - AccessCheckInfo |
137 // - InterceptorInfo | 135 // - InterceptorInfo |
138 // - CallHandlerInfo | 136 // - CallHandlerInfo |
139 // - TemplateInfo | 137 // - TemplateInfo |
140 // - FunctionTemplateInfo | 138 // - FunctionTemplateInfo |
141 // - ObjectTemplateInfo | 139 // - ObjectTemplateInfo |
142 // - Script | 140 // - Script |
143 // - SignatureInfo | 141 // - SignatureInfo |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 // object type in this causes the compiler to generate most of the boilerplate | 511 // object type in this causes the compiler to generate most of the boilerplate |
514 // code for the class including allocation and garbage collection routines, | 512 // code for the class including allocation and garbage collection routines, |
515 // casts and predicates. All you need to define is the class, methods and | 513 // casts and predicates. All you need to define is the class, methods and |
516 // object verification routines. Easy, no? | 514 // object verification routines. Easy, no? |
517 // | 515 // |
518 // Note that for subtle reasons related to the ordering or numerical values of | 516 // Note that for subtle reasons related to the ordering or numerical values of |
519 // type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST | 517 // type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST |
520 // manually. | 518 // manually. |
521 #define STRUCT_LIST(V) \ | 519 #define STRUCT_LIST(V) \ |
522 V(BOX, Box, box) \ | 520 V(BOX, Box, box) \ |
523 V(DECLARED_ACCESSOR_DESCRIPTOR, \ | |
524 DeclaredAccessorDescriptor, \ | |
525 declared_accessor_descriptor) \ | |
526 V(DECLARED_ACCESSOR_INFO, DeclaredAccessorInfo, declared_accessor_info) \ | |
527 V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo, executable_accessor_info)\ | 521 V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo, executable_accessor_info)\ |
528 V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ | 522 V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ |
529 V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ | 523 V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ |
530 V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ | 524 V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ |
531 V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ | 525 V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ |
532 V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ | 526 V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ |
533 V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ | 527 V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ |
534 V(SIGNATURE_INFO, SignatureInfo, signature_info) \ | 528 V(SIGNATURE_INFO, SignatureInfo, signature_info) \ |
535 V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \ | 529 V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \ |
536 V(SCRIPT, Script, script) \ | 530 V(SCRIPT, Script, script) \ |
(...skipping 9861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10398 } | 10392 } |
10399 // Bit positions in flag. | 10393 // Bit positions in flag. |
10400 static const int kAllCanReadBit = 0; | 10394 static const int kAllCanReadBit = 0; |
10401 static const int kAllCanWriteBit = 1; | 10395 static const int kAllCanWriteBit = 1; |
10402 class AttributesField: public BitField<PropertyAttributes, 2, 3> {}; | 10396 class AttributesField: public BitField<PropertyAttributes, 2, 3> {}; |
10403 | 10397 |
10404 DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorInfo); | 10398 DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorInfo); |
10405 }; | 10399 }; |
10406 | 10400 |
10407 | 10401 |
10408 enum AccessorDescriptorType { | |
10409 kDescriptorBitmaskCompare, | |
10410 kDescriptorPointerCompare, | |
10411 kDescriptorPrimitiveValue, | |
10412 kDescriptorObjectDereference, | |
10413 kDescriptorPointerDereference, | |
10414 kDescriptorPointerShift, | |
10415 kDescriptorReturnObject | |
10416 }; | |
10417 | |
10418 | |
10419 struct BitmaskCompareDescriptor { | |
10420 uint32_t bitmask; | |
10421 uint32_t compare_value; | |
10422 uint8_t size; // Must be in {1,2,4}. | |
10423 }; | |
10424 | |
10425 | |
10426 struct PointerCompareDescriptor { | |
10427 void* compare_value; | |
10428 }; | |
10429 | |
10430 | |
10431 struct PrimitiveValueDescriptor { | |
10432 v8::DeclaredAccessorDescriptorDataType data_type; | |
10433 uint8_t bool_offset; // Must be in [0,7], used for kDescriptorBoolType. | |
10434 }; | |
10435 | |
10436 | |
10437 struct ObjectDerefenceDescriptor { | |
10438 uint8_t internal_field; | |
10439 }; | |
10440 | |
10441 | |
10442 struct PointerShiftDescriptor { | |
10443 int16_t byte_offset; | |
10444 }; | |
10445 | |
10446 | |
10447 struct DeclaredAccessorDescriptorData { | |
10448 AccessorDescriptorType type; | |
10449 union { | |
10450 struct BitmaskCompareDescriptor bitmask_compare_descriptor; | |
10451 struct PointerCompareDescriptor pointer_compare_descriptor; | |
10452 struct PrimitiveValueDescriptor primitive_value_descriptor; | |
10453 struct ObjectDerefenceDescriptor object_dereference_descriptor; | |
10454 struct PointerShiftDescriptor pointer_shift_descriptor; | |
10455 }; | |
10456 }; | |
10457 | |
10458 | |
10459 class DeclaredAccessorDescriptor; | |
10460 | |
10461 | |
10462 class DeclaredAccessorDescriptorIterator { | |
10463 public: | |
10464 explicit DeclaredAccessorDescriptorIterator( | |
10465 DeclaredAccessorDescriptor* descriptor); | |
10466 const DeclaredAccessorDescriptorData* Next(); | |
10467 bool Complete() const { return length_ == offset_; } | |
10468 private: | |
10469 uint8_t* array_; | |
10470 const int length_; | |
10471 int offset_; | |
10472 DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorDescriptorIterator); | |
10473 }; | |
10474 | |
10475 | |
10476 class DeclaredAccessorDescriptor: public Struct { | |
10477 public: | |
10478 DECL_ACCESSORS(serialized_data, ByteArray) | |
10479 | |
10480 DECLARE_CAST(DeclaredAccessorDescriptor) | |
10481 | |
10482 static Handle<DeclaredAccessorDescriptor> Create( | |
10483 Isolate* isolate, | |
10484 const DeclaredAccessorDescriptorData& data, | |
10485 Handle<DeclaredAccessorDescriptor> previous); | |
10486 | |
10487 // Dispatched behavior. | |
10488 DECLARE_PRINTER(DeclaredAccessorDescriptor) | |
10489 DECLARE_VERIFIER(DeclaredAccessorDescriptor) | |
10490 | |
10491 static const int kSerializedDataOffset = HeapObject::kHeaderSize; | |
10492 static const int kSize = kSerializedDataOffset + kPointerSize; | |
10493 | |
10494 private: | |
10495 DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorDescriptor); | |
10496 }; | |
10497 | |
10498 | |
10499 class DeclaredAccessorInfo: public AccessorInfo { | |
10500 public: | |
10501 DECL_ACCESSORS(descriptor, DeclaredAccessorDescriptor) | |
10502 | |
10503 DECLARE_CAST(DeclaredAccessorInfo) | |
10504 | |
10505 // Dispatched behavior. | |
10506 DECLARE_PRINTER(DeclaredAccessorInfo) | |
10507 DECLARE_VERIFIER(DeclaredAccessorInfo) | |
10508 | |
10509 static const int kDescriptorOffset = AccessorInfo::kSize; | |
10510 static const int kSize = kDescriptorOffset + kPointerSize; | |
10511 | |
10512 private: | |
10513 DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorInfo); | |
10514 }; | |
10515 | |
10516 | |
10517 // An accessor must have a getter, but can have no setter. | 10402 // An accessor must have a getter, but can have no setter. |
10518 // | 10403 // |
10519 // When setting a property, V8 searches accessors in prototypes. | 10404 // When setting a property, V8 searches accessors in prototypes. |
10520 // If an accessor was found and it does not have a setter, | 10405 // If an accessor was found and it does not have a setter, |
10521 // the request is ignored. | 10406 // the request is ignored. |
10522 // | 10407 // |
10523 // If the accessor in the prototype has the READ_ONLY property attribute, then | 10408 // If the accessor in the prototype has the READ_ONLY property attribute, then |
10524 // a new value is added to the derived object when the property is set. | 10409 // a new value is added to the derived object when the property is set. |
10525 // This shadows the accessor in the prototype. | 10410 // This shadows the accessor in the prototype. |
10526 class ExecutableAccessorInfo: public AccessorInfo { | 10411 class ExecutableAccessorInfo: public AccessorInfo { |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11067 } else { | 10952 } else { |
11068 value &= ~(1 << bit_position); | 10953 value &= ~(1 << bit_position); |
11069 } | 10954 } |
11070 return value; | 10955 return value; |
11071 } | 10956 } |
11072 }; | 10957 }; |
11073 | 10958 |
11074 } } // namespace v8::internal | 10959 } } // namespace v8::internal |
11075 | 10960 |
11076 #endif // V8_OBJECTS_H_ | 10961 #endif // V8_OBJECTS_H_ |
OLD | NEW |