| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 131d031dcdb8e0a36aee15c518ab53c3b2211f9a..11f53b979076a8ec39b2661b0886986761cf92dc 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -962,63 +962,70 @@ MaybeObject* Object::GetProperty(Object* receiver,
|
| }
|
|
|
|
|
| -MaybeObject* Object::GetElementWithReceiver(Isolate* isolate,
|
| - Object* receiver,
|
| - uint32_t index) {
|
| - Heap* heap = isolate->heap();
|
| - Object* holder = this;
|
| +Handle<Object> Object::GetElementWithReceiver(Isolate* isolate,
|
| + Handle<Object> object,
|
| + Handle<Object> receiver,
|
| + uint32_t index) {
|
| + Handle<Object> holder;
|
|
|
| // Iterate up the prototype chain until an element is found or the null
|
| // prototype is encountered.
|
| - for (holder = this;
|
| - holder != heap->null_value();
|
| - holder = holder->GetPrototype(isolate)) {
|
| + for (holder = object;
|
| + !holder->IsNull();
|
| + holder = Handle<Object>(holder->GetPrototype(isolate), isolate)) {
|
| if (!holder->IsJSObject()) {
|
| Context* native_context = isolate->context()->native_context();
|
| if (holder->IsNumber()) {
|
| - holder = native_context->number_function()->instance_prototype();
|
| + holder = Handle<Object>(
|
| + native_context->number_function()->instance_prototype(), isolate);
|
| } else if (holder->IsString()) {
|
| - holder = native_context->string_function()->instance_prototype();
|
| + holder = Handle<Object>(
|
| + native_context->string_function()->instance_prototype(), isolate);
|
| } else if (holder->IsSymbol()) {
|
| - holder = native_context->symbol_function()->instance_prototype();
|
| + holder = Handle<Object>(
|
| + native_context->symbol_function()->instance_prototype(), isolate);
|
| } else if (holder->IsBoolean()) {
|
| - holder = native_context->boolean_function()->instance_prototype();
|
| + holder = Handle<Object>(
|
| + native_context->boolean_function()->instance_prototype(), isolate);
|
| } else if (holder->IsJSProxy()) {
|
| - return JSProxy::cast(holder)->GetElementWithHandler(receiver, index);
|
| + CALL_HEAP_FUNCTION(isolate,
|
| + Handle<JSProxy>::cast(holder)->GetElementWithHandler(
|
| + *receiver, index),
|
| + Object);
|
| } else {
|
| // Undefined and null have no indexed properties.
|
| ASSERT(holder->IsUndefined() || holder->IsNull());
|
| - return heap->undefined_value();
|
| + return isolate->factory()->undefined_value();
|
| }
|
| }
|
|
|
| // Inline the case for JSObjects. Doing so significantly improves the
|
| // performance of fetching elements where checking the prototype chain is
|
| // necessary.
|
| - JSObject* js_object = JSObject::cast(holder);
|
| + Handle<JSObject> js_object = Handle<JSObject>::cast(holder);
|
|
|
| // Check access rights if needed.
|
| if (js_object->IsAccessCheckNeeded()) {
|
| - Isolate* isolate = heap->isolate();
|
| - if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) {
|
| - isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET);
|
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate);
|
| - return heap->undefined_value();
|
| + if (!isolate->MayIndexedAccessWrapper(js_object, index, v8::ACCESS_GET)) {
|
| + isolate->ReportFailedAccessCheckWrapper(js_object, v8::ACCESS_GET);
|
| + RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
|
| + return isolate->factory()->undefined_value();
|
| }
|
| }
|
|
|
| if (js_object->HasIndexedInterceptor()) {
|
| - return js_object->GetElementWithInterceptor(receiver, index);
|
| + return JSObject::GetElementWithInterceptor(js_object, receiver, index);
|
| }
|
|
|
| - if (js_object->elements() != heap->empty_fixed_array()) {
|
| - MaybeObject* result = js_object->GetElementsAccessor()->Get(
|
| + if (js_object->elements() != isolate->heap()->empty_fixed_array()) {
|
| + Handle<Object> result = js_object->GetElementsAccessor()->Get(
|
| receiver, js_object, index);
|
| - if (result != heap->the_hole_value()) return result;
|
| + RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<Object>());
|
| + if (!result->IsTheHole()) return result;
|
| }
|
| }
|
|
|
| - return heap->undefined_value();
|
| + return isolate->factory()->undefined_value();
|
| }
|
|
|
|
|
| @@ -12922,46 +12929,41 @@ MaybeObject* JSArray::JSArrayUpdateLengthFromIndex(uint32_t index,
|
| }
|
|
|
|
|
| -MaybeObject* JSObject::GetElementWithInterceptor(Object* receiver,
|
| - uint32_t index) {
|
| - Isolate* isolate = GetIsolate();
|
| - HandleScope scope(isolate);
|
| +Handle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
|
| + Handle<Object> receiver,
|
| + uint32_t index) {
|
| + Isolate* isolate = object->GetIsolate();
|
|
|
| // Make sure that the top context does not change when doing
|
| // callbacks or interceptor calls.
|
| AssertNoContextChange ncc(isolate);
|
|
|
| - Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate);
|
| - Handle<Object> this_handle(receiver, isolate);
|
| - Handle<JSObject> holder_handle(this, isolate);
|
| + Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor(), isolate);
|
| if (!interceptor->getter()->IsUndefined()) {
|
| v8::IndexedPropertyGetterCallback getter =
|
| v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter());
|
| LOG(isolate,
|
| - ApiIndexedPropertyAccess("interceptor-indexed-get", this, index));
|
| + ApiIndexedPropertyAccess("interceptor-indexed-get", *object, index));
|
| PropertyCallbackArguments
|
| - args(isolate, interceptor->data(), receiver, this);
|
| + args(isolate, interceptor->data(), *receiver, *object);
|
| v8::Handle<v8::Value> result = args.Call(getter, index);
|
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate);
|
| + RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object);
|
| if (!result.IsEmpty()) {
|
| Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
|
| result_internal->VerifyApiCallResultType();
|
| - return *result_internal;
|
| + // Rebox handle before return.
|
| + return Handle<Object>(*result_internal, isolate);
|
| }
|
| }
|
|
|
| - Heap* heap = holder_handle->GetHeap();
|
| - ElementsAccessor* handler = holder_handle->GetElementsAccessor();
|
| - MaybeObject* raw_result = handler->Get(*this_handle,
|
| - *holder_handle,
|
| - index);
|
| - if (raw_result != heap->the_hole_value()) return raw_result;
|
| -
|
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate);
|
| + ElementsAccessor* handler = object->GetElementsAccessor();
|
| + Handle<Object> result = handler->Get(receiver, object, index);
|
| + RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<Object>());
|
| + if (!result->IsTheHole()) return result;
|
|
|
| - Object* pt = holder_handle->GetPrototype();
|
| - if (pt == heap->null_value()) return heap->undefined_value();
|
| - return pt->GetElementWithReceiver(isolate, *this_handle, index);
|
| + Handle<Object> proto(object->GetPrototype(), isolate);
|
| + if (proto->IsNull()) return isolate->factory()->undefined_value();
|
| + return Object::GetElementWithReceiver(isolate, proto, receiver, index);
|
| }
|
|
|
|
|
|
|