Chromium Code Reviews| Index: src/objects-inl.h |
| diff --git a/src/objects-inl.h b/src/objects-inl.h |
| index 28c11a646092590960f091e8e5718ccd2fcf9499..32aa2a28daf62d51055c70cb7bcc3234bbce9178 100644 |
| --- a/src/objects-inl.h |
| +++ b/src/objects-inl.h |
| @@ -4113,7 +4113,8 @@ ACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset) |
| ACCESSORS(AccessorInfo, expected_receiver_type, Object, |
| kExpectedReceiverTypeOffset) |
| -ACCESSORS(DeclaredAccessorDescriptor, internal_field, Smi, kInternalFieldOffset) |
| +ACCESSORS(DeclaredAccessorDescriptor, serialized_descriptor, ByteArray, |
| + kSerializedDescriptorOffset) |
| ACCESSORS(DeclaredAccessorInfo, descriptor, DeclaredAccessorDescriptor, |
| kDescriptorOffset) |
| @@ -5501,6 +5502,110 @@ bool AccessorInfo::IsCompatibleReceiver(Object* receiver) { |
| } |
| +template<int size> |
|
Sven Panne
2013/02/19 08:41:16
I'm again not sure if we need this massive machine
|
| +struct AccessorDescriptorSerializationHelper { |
| +}; |
| +template<> |
| +struct AccessorDescriptorSerializationHelper<1> { |
| + typedef uint8_t UType; |
| +}; |
| +template<> |
| +struct AccessorDescriptorSerializationHelper<2> { |
| + typedef uint16_t UType; |
| +}; |
| +template<> |
| +struct AccessorDescriptorSerializationHelper<4> { |
| + typedef uint32_t UType; |
| +}; |
| +template<> |
| +struct AccessorDescriptorSerializationHelper<8> { |
| + typedef uint64_t UType; |
| +}; |
| + |
| + |
| +template<typename Value> |
| +struct AccessorDescriptorSerialization { |
| + static const int kArraySize = sizeof(Value); |
| + typedef AccessorDescriptorSerializationHelper<kArraySize> Helper; |
| + typedef typename Helper::UType UType; |
| + static inline UType ToUType(Value value) { |
| + return static_cast<UType>(value); |
| + } |
| + static inline Value FromUType(UType utype) { |
| + return static_cast<Value>(utype); |
| + } |
| + static inline void Serialize(Value value, uint8_t array[kArraySize]) { |
| + UType u_type = ToUType(value); |
| + for (int i = 0; i < kArraySize; i++) { |
| + array[i] = static_cast<uint8_t>(u_type >> (8 * i)); |
| + } |
| + } |
| + static inline Value Deserialize(uint8_t array[kArraySize]) { |
| + UType temp = 0; |
| + for (int i = 0; i < kArraySize; i++) { |
| + temp |= static_cast<UType>(array[i]) << (8 * i); |
| + } |
| + return FromUType(temp); |
| + } |
| +}; |
| + |
| + |
| +template<> |
| +inline AccessorDescriptorSerialization<void*>::UType |
| + AccessorDescriptorSerialization<void*>::ToUType(void* value) { |
| + return reinterpret_cast<UType>(value); |
| +} |
| + |
| + |
| +template<> |
| +inline void* AccessorDescriptorSerialization<void*>::FromUType( |
| + AccessorDescriptorSerialization<void*>::UType utype) { |
| + return reinterpret_cast<void*>(utype); |
| +} |
| + |
| + |
| +AccessorDescriptorDeserializer::AccessorDescriptorDeserializer( |
| + uint16_t length, uint8_t* storage) : |
| + AccessorDescriptorSerializerBase(length, storage), visited_(true) { |
| +} |
| + |
| + |
| +void AccessorDescriptorDeserializer::Next(v8::AccessorDescriptor* descriptor) { |
| + ASSERT(!Complete()); |
| + descriptor->derefence_descriptor = NULL; |
| + visited_ = false; |
| + v8::DescriptorVisitorHelper::VisitDescriptor(descriptor, this); |
| +} |
| + |
| + |
| +template<typename T> |
| +bool AccessorDescriptorDeserializer::ShouldVisit(T* descriptor) { |
| + ASSERT(descriptor != NULL); |
| + return true; |
| +} |
| + |
| + |
| +bool AccessorDescriptorDeserializer::ShouldVisit( |
| + v8::AccessorDescriptor* descriptor) { |
| + if (visited_) { |
| + ASSERT(descriptor == NULL); |
| + return false; |
| + } |
| + ASSERT(descriptor != NULL); |
| + visited_ = true; |
| + return true; |
| +} |
| + |
| + |
| +template<typename T> |
| +void AccessorDescriptorDeserializer::Visit(T* member) { |
| + typedef AccessorDescriptorSerialization<T> Ser; |
| + ASSERT(offset_ + Ser::kArraySize <= length_); |
| + *member = Ser::Deserialize(&storage_[offset_]); |
| + offset_ += Ser::kArraySize; |
| +} |
| + |
| + |
| template<typename Shape, typename Key> |
| void Dictionary<Shape, Key>::SetEntry(int entry, |
| Object* key, |