Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 45220ee29132ad21a02eaff02dfd15f7f37b8b5f..32bffe1f37a052cb585d3ce90a964fac331f9185 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -487,14 +487,18 @@ MaybeObject* JSProxy::GetPropertyWithHandler(Object* receiver_raw, |
} |
-Handle<Object> Object::GetProperty(Handle<Object> object, |
- Handle<Name> name) { |
- // TODO(rossberg): The index test should not be here but in the GetProperty |
- // method (or somewhere else entirely). Needs more global clean-up. |
+Handle<Object> Object::GetPropertyOrElement(Handle<Object> object, |
+ Handle<Name> name) { |
uint32_t index; |
Isolate* isolate = name->GetIsolate(); |
if (name->AsArrayIndex(&index)) return GetElement(isolate, object, index); |
- CALL_HEAP_FUNCTION(isolate, object->GetProperty(*name), Object); |
+ return GetProperty(object, name); |
+} |
+ |
+ |
+Handle<Object> Object::GetProperty(Handle<Object> object, |
+ Handle<Name> name) { |
+ CALL_HEAP_FUNCTION(name->GetIsolate(), object->GetProperty(*name), Object); |
} |
@@ -3602,9 +3606,8 @@ Handle<Object> JSProxy::SetPropertyViaPrototypesWithHandler( |
Handle<String> configurable_name = |
isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("configurable_")); |
- Handle<Object> configurable( |
- v8::internal::GetProperty(isolate, desc, configurable_name)); |
- ASSERT(!isolate->has_pending_exception()); |
+ Handle<Object> configurable = Object::GetProperty(desc, configurable_name); |
+ ASSERT(!configurable.is_null()); |
ASSERT(configurable->IsTrue() || configurable->IsFalse()); |
if (configurable->IsFalse()) { |
Handle<String> trap = |
@@ -3622,17 +3625,15 @@ Handle<Object> JSProxy::SetPropertyViaPrototypesWithHandler( |
Handle<String> hasWritable_name = |
isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("hasWritable_")); |
- Handle<Object> hasWritable( |
- v8::internal::GetProperty(isolate, desc, hasWritable_name)); |
- ASSERT(!isolate->has_pending_exception()); |
+ Handle<Object> hasWritable = Object::GetProperty(desc, hasWritable_name); |
+ ASSERT(!hasWritable.is_null()); |
ASSERT(hasWritable->IsTrue() || hasWritable->IsFalse()); |
if (hasWritable->IsTrue()) { |
Handle<String> writable_name = |
isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("writable_")); |
- Handle<Object> writable( |
- v8::internal::GetProperty(isolate, desc, writable_name)); |
- ASSERT(!isolate->has_pending_exception()); |
+ Handle<Object> writable = Object::GetProperty(desc, writable_name); |
+ ASSERT(!writable.is_null()); |
ASSERT(writable->IsTrue() || writable->IsFalse()); |
*done = writable->IsFalse(); |
if (!*done) return isolate->factory()->the_hole_value(); |
@@ -3647,8 +3648,8 @@ Handle<Object> JSProxy::SetPropertyViaPrototypesWithHandler( |
// We have an AccessorDescriptor. |
Handle<String> set_name = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("set_")); |
- Handle<Object> setter(v8::internal::GetProperty(isolate, desc, set_name)); |
- ASSERT(!isolate->has_pending_exception()); |
+ Handle<Object> setter = Object::GetProperty(desc, set_name); |
+ ASSERT(!setter.is_null()); |
if (!setter->IsUndefined()) { |
// TODO(rossberg): nicer would be to cast to some JSCallable here... |
return SetPropertyWithDefinedSetter( |
@@ -3726,21 +3727,21 @@ PropertyAttributes JSProxy::GetPropertyAttributeWithHandler( |
// Convert result to PropertyAttributes. |
Handle<String> enum_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("enumerable_")); |
- Handle<Object> enumerable(v8::internal::GetProperty(isolate, desc, enum_n)); |
- if (isolate->has_pending_exception()) return NONE; |
+ Handle<Object> enumerable = Object::GetProperty(desc, enum_n); |
+ RETURN_IF_EMPTY_HANDLE_VALUE(isolate, enumerable, NONE); |
Handle<String> conf_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("configurable_")); |
- Handle<Object> configurable(v8::internal::GetProperty(isolate, desc, conf_n)); |
- if (isolate->has_pending_exception()) return NONE; |
+ Handle<Object> configurable = Object::GetProperty(desc, conf_n); |
+ RETURN_IF_EMPTY_HANDLE_VALUE(isolate, configurable, NONE); |
Handle<String> writ_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("writable_")); |
- Handle<Object> writable(v8::internal::GetProperty(isolate, desc, writ_n)); |
- if (isolate->has_pending_exception()) return NONE; |
+ Handle<Object> writable = Object::GetProperty(desc, writ_n); |
+ RETURN_IF_EMPTY_HANDLE_VALUE(isolate, writable, NONE); |
if (!writable->BooleanValue()) { |
Handle<String> set_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("set_")); |
- Handle<Object> setter(v8::internal::GetProperty(isolate, desc, set_n)); |
- if (isolate->has_pending_exception()) return NONE; |
+ Handle<Object> setter = Object::GetProperty(desc, set_n); |
+ RETURN_IF_EMPTY_HANDLE_VALUE(isolate, setter, NONE); |
writable = isolate->factory()->ToBoolean(!setter->IsUndefined()); |
} |
@@ -3803,8 +3804,8 @@ MUST_USE_RESULT Handle<Object> JSProxy::CallTrap(const char* name, |
Handle<Object> handler(this->handler(), isolate); |
Handle<String> trap_name = isolate->factory()->InternalizeUtf8String(name); |
- Handle<Object> trap(v8::internal::GetProperty(isolate, handler, trap_name)); |
- if (isolate->has_pending_exception()) return trap; |
+ Handle<Object> trap = Object::GetPropertyOrElement(handler, trap_name); |
+ RETURN_IF_EMPTY_HANDLE_VALUE(isolate, trap, Handle<Object>()); |
if (trap->IsUndefined()) { |
if (derived.is_null()) { |
@@ -4070,7 +4071,7 @@ Handle<Object> JSObject::SetPropertyForResult(Handle<JSObject> object, |
bool is_observed = object->map()->is_observed() && |
*name != isolate->heap()->hidden_string(); |
if (is_observed && lookup->IsDataProperty()) { |
- old_value = Object::GetProperty(object, name); |
+ old_value = Object::GetPropertyOrElement(object, name); |
CHECK_NOT_EMPTY_HANDLE(isolate, old_value); |
} |
@@ -4116,7 +4117,7 @@ Handle<Object> JSObject::SetPropertyForResult(Handle<JSObject> object, |
LookupResult new_lookup(isolate); |
object->LocalLookup(*name, &new_lookup, true); |
if (new_lookup.IsDataProperty()) { |
- Handle<Object> new_value = Object::GetProperty(object, name); |
+ Handle<Object> new_value = Object::GetPropertyOrElement(object, name); |
CHECK_NOT_EMPTY_HANDLE(isolate, new_value); |
if (!new_value->SameValue(*old_value)) { |
EnqueueChangeRecord(object, "update", name, old_value); |
@@ -4195,7 +4196,7 @@ Handle<Object> JSObject::SetLocalPropertyIgnoreAttributes( |
*name != isolate->heap()->hidden_string(); |
if (is_observed && lookup.IsProperty()) { |
if (lookup.IsDataProperty()) { |
- old_value = Object::GetProperty(object, name); |
+ old_value = Object::GetPropertyOrElement(object, name); |
CHECK_NOT_EMPTY_HANDLE(isolate, old_value); |
} |
old_attributes = lookup.GetAttributes(); |
@@ -4241,7 +4242,7 @@ Handle<Object> JSObject::SetLocalPropertyIgnoreAttributes( |
object->LocalLookup(*name, &new_lookup, true); |
bool value_changed = false; |
if (new_lookup.IsDataProperty()) { |
- Handle<Object> new_value = Object::GetProperty(object, name); |
+ Handle<Object> new_value = Object::GetPropertyOrElement(object, name); |
CHECK_NOT_EMPTY_HANDLE(isolate, new_value); |
value_changed = !old_value->SameValue(*new_value); |
} |
@@ -5231,7 +5232,7 @@ Handle<Object> JSObject::DeleteProperty(Handle<JSObject> object, |
bool is_observed = object->map()->is_observed() && |
*name != isolate->heap()->hidden_string(); |
if (is_observed && lookup.IsDataProperty()) { |
- old_value = Object::GetProperty(object, name); |
+ old_value = Object::GetPropertyOrElement(object, name); |
CHECK_NOT_EMPTY_HANDLE(isolate, old_value); |
} |
Handle<Object> result; |
@@ -6339,7 +6340,7 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
object->LocalLookup(*name, &lookup, true); |
preexists = lookup.IsProperty(); |
if (preexists && lookup.IsDataProperty()) { |
- old_value = Object::GetProperty(object, name); |
+ old_value = Object::GetPropertyOrElement(object, name); |
CHECK_NOT_EMPTY_HANDLE(isolate, old_value); |
} |
} |