| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 99b5944c811d1d77199f44d5ffe7b069b9962b10..2e5930f6d412a863aaa5f5aed3acb6706e653f76 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -695,6 +695,20 @@ Object* JSObject::GetNormalizedProperty(const LookupResult* result) {
|
| }
|
|
|
|
|
| +Handle<Object> JSObject::GetNormalizedProperty(Handle<JSObject> object,
|
| + const LookupResult* result) {
|
| + ASSERT(!object->HasFastProperties());
|
| + Isolate* isolate = object->GetIsolate();
|
| + Handle<Object> value(object->property_dictionary()->ValueAt(
|
| + result->GetDictionaryEntry()), isolate);
|
| + if (object->IsGlobalObject()) {
|
| + value = Handle<Object>(Handle<PropertyCell>::cast(value)->value(), isolate);
|
| + }
|
| + ASSERT(!value->IsPropertyCell() && !value->IsCell());
|
| + return value;
|
| +}
|
| +
|
| +
|
| void JSObject::SetNormalizedProperty(Handle<JSObject> object,
|
| const LookupResult* result,
|
| Handle<Object> value) {
|
| @@ -5933,6 +5947,41 @@ Handle<JSObject> JSObject::DeepCopy(Handle<JSObject> object,
|
| }
|
|
|
|
|
| +Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object,
|
| + Handle<Name> key) {
|
| + Isolate* isolate = object->GetIsolate();
|
| + LookupResult lookup(isolate);
|
| + {
|
| + DisallowHeapAllocation no_allocation;
|
| + object->LookupRealNamedProperty(*key, &lookup);
|
| + }
|
| + Handle<Object> result = isolate->factory()->undefined_value();
|
| + if (lookup.IsFound() && !lookup.IsTransition()) {
|
| + switch (lookup.type()) {
|
| + case NORMAL:
|
| + result = GetNormalizedProperty(
|
| + Handle<JSObject>(lookup.holder(), isolate), &lookup);
|
| + break;
|
| + case FIELD:
|
| + result = FastPropertyAt(Handle<JSObject>(lookup.holder(), isolate),
|
| + lookup.representation(),
|
| + lookup.GetFieldIndex().field_index());
|
| + break;
|
| + case CONSTANT:
|
| + result = Handle<Object>(lookup.GetConstant(), isolate);
|
| + break;
|
| + case CALLBACKS:
|
| + case HANDLER:
|
| + case INTERCEPTOR:
|
| + break;
|
| + case NONEXISTENT:
|
| + UNREACHABLE();
|
| + }
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +
|
| // Tests for the fast common case for property enumeration:
|
| // - This object and all prototypes has an enum cache (which means that
|
| // it is no proxy, has no interceptors and needs no access checks).
|
|
|