| Index: src/property.h
|
| diff --git a/src/property.h b/src/property.h
|
| index 4ddcab00e497d20a55cb24df867b5f249ab626db..9e3b2a09a7d26b352be1318d85a4724426f14f9a 100644
|
| --- a/src/property.h
|
| +++ b/src/property.h
|
| @@ -7,6 +7,7 @@
|
|
|
| #include "isolate.h"
|
| #include "factory.h"
|
| +#include "types.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -74,8 +75,15 @@ class FieldDescriptor V8_FINAL : public Descriptor {
|
| int field_index,
|
| PropertyAttributes attributes,
|
| Representation representation)
|
| - : Descriptor(key, handle(Smi::FromInt(0), key->GetIsolate()), attributes,
|
| + : Descriptor(key, HeapType::Any(key->GetIsolate()), attributes,
|
| FIELD, representation, field_index) {}
|
| + FieldDescriptor(Handle<Name> key,
|
| + int field_index,
|
| + Handle<HeapType> field_type,
|
| + PropertyAttributes attributes,
|
| + Representation representation)
|
| + : Descriptor(key, field_type, attributes, FIELD,
|
| + representation, field_index) { }
|
| };
|
|
|
|
|
| @@ -177,9 +185,26 @@ class LookupResult V8_FINAL BASE_EMBEDDED {
|
| number_ = number;
|
| }
|
|
|
| - bool CanHoldValue(Handle<Object> value) {
|
| - if (IsNormal()) return true;
|
| - return value->FitsRepresentation(details_.representation());
|
| + bool CanHoldValue(Handle<Object> value) const {
|
| + switch (type()) {
|
| + case NORMAL:
|
| + return true;
|
| + case FIELD:
|
| + return value->FitsRepresentation(representation()) &&
|
| + GetFieldType()->NowContains(value);
|
| + case CONSTANT:
|
| + ASSERT(GetConstant() != *value ||
|
| + value->FitsRepresentation(representation()));
|
| + return GetConstant() == *value;
|
| + case CALLBACKS:
|
| + case HANDLER:
|
| + case INTERCEPTOR:
|
| + return true;
|
| + case NONEXISTENT:
|
| + UNREACHABLE();
|
| + }
|
| + UNREACHABLE();
|
| + return true;
|
| }
|
|
|
| void TransitionResult(JSObject* holder, Map* target) {
|
| @@ -458,6 +483,32 @@ class LookupResult V8_FINAL BASE_EMBEDDED {
|
| return map->instance_descriptors()->GetFieldIndex(number_);
|
| }
|
|
|
| + HeapType* GetFieldType() const {
|
| + ASSERT(type() == FIELD);
|
| + if (lookup_type_ == DESCRIPTOR_TYPE) {
|
| + return GetFieldTypeFromMap(holder()->map());
|
| + }
|
| + ASSERT(lookup_type_ == TRANSITION_TYPE);
|
| + return GetFieldTypeFromMap(transition_);
|
| + }
|
| +
|
| + HeapType* GetFieldTypeFromMap(Map* map) const {
|
| + ASSERT(lookup_type_ == DESCRIPTOR_TYPE ||
|
| + lookup_type_ == TRANSITION_TYPE);
|
| + ASSERT(number_ < map->NumberOfOwnDescriptors());
|
| + return map->instance_descriptors()->GetFieldType(number_);
|
| + }
|
| +
|
| + Map* GetFieldOwner() const {
|
| + return GetFieldOwnerFromMap(holder()->map());
|
| + }
|
| +
|
| + Map* GetFieldOwnerFromMap(Map* map) const {
|
| + ASSERT(lookup_type_ == DESCRIPTOR_TYPE);
|
| + ASSERT(number_ < map->NumberOfOwnDescriptors());
|
| + return map->FindFieldOwner(number_);
|
| + }
|
| +
|
| void Iterate(ObjectVisitor* visitor);
|
|
|
| private:
|
|
|