| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 2bf5b4a4a0bc760ba695038e247406497a9b9725..993e8c70667beb61a166c81a260d09cca0b777cc 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -381,6 +381,16 @@ static MaybeObject* GetDeclaredAccessorProperty(Object* receiver,
|
| }
|
|
|
|
|
| +static Handle<Object> GetDeclaredAccessorProperty(
|
| + Handle<Object> receiver,
|
| + Handle<DeclaredAccessorInfo> info,
|
| + Isolate* isolate) {
|
| + CALL_HEAP_FUNCTION(isolate,
|
| + GetDeclaredAccessorProperty(*receiver, *info, isolate),
|
| + Object);
|
| +}
|
| +
|
| +
|
| Handle<FixedArray> JSObject::EnsureWritableFastElements(
|
| Handle<JSObject> object) {
|
| CALL_HEAP_FUNCTION(object->GetIsolate(),
|
| @@ -435,7 +445,6 @@ MaybeHandle<Object> JSObject::GetPropertyWithCallback(Handle<JSObject> object,
|
| v8::ToCData<v8::AccessorGetterCallback>(data->getter());
|
| if (call_fun == NULL) return isolate->factory()->undefined_value();
|
|
|
| - HandleScope scope(isolate);
|
| Handle<JSObject> self = Handle<JSObject>::cast(receiver);
|
| Handle<String> key = Handle<String>::cast(name);
|
| LOG(isolate, ApiNamedPropertyAccess("load", *self, *name));
|
| @@ -448,7 +457,8 @@ MaybeHandle<Object> JSObject::GetPropertyWithCallback(Handle<JSObject> object,
|
| }
|
| Handle<Object> return_value = v8::Utils::OpenHandle(*result);
|
| return_value->VerifyApiCallResultType();
|
| - return scope.CloseAndEscape(return_value);
|
| + // Rebox handle before return.
|
| + return handle(*return_value, isolate);
|
| }
|
|
|
| // __defineGetter__ callback
|
| @@ -456,11 +466,8 @@ MaybeHandle<Object> JSObject::GetPropertyWithCallback(Handle<JSObject> object,
|
| isolate);
|
| if (getter->IsSpecFunction()) {
|
| // TODO(rossberg): nicer would be to cast to some JSCallable here...
|
| - CALL_HEAP_FUNCTION(
|
| - isolate,
|
| - object->GetPropertyWithDefinedGetter(*receiver,
|
| - JSReceiver::cast(*getter)),
|
| - Object);
|
| + return Object::GetPropertyWithDefinedGetter(
|
| + object, receiver, Handle<JSReceiver>::cast(getter));
|
| }
|
| // Getter is not a function.
|
| return isolate->factory()->undefined_value();
|
| @@ -490,8 +497,8 @@ MaybeObject* JSProxy::GetPropertyWithHandler(Object* receiver_raw,
|
| }
|
|
|
|
|
| -Handle<Object> Object::GetPropertyOrElement(Handle<Object> object,
|
| - Handle<Name> name) {
|
| +MaybeHandle<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);
|
| @@ -533,28 +540,27 @@ bool JSProxy::HasElementWithHandler(Handle<JSProxy> proxy, uint32_t index) {
|
| }
|
|
|
|
|
| -MaybeObject* Object::GetPropertyWithDefinedGetter(Object* receiver,
|
| - JSReceiver* getter) {
|
| +MaybeHandle<Object> Object::GetPropertyWithDefinedGetter(
|
| + Handle<Object> object,
|
| + Handle<Object> receiver,
|
| + Handle<JSReceiver> getter) {
|
| Isolate* isolate = getter->GetIsolate();
|
| - HandleScope scope(isolate);
|
| - Handle<JSReceiver> fun(getter);
|
| - Handle<Object> self(receiver, isolate);
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| Debug* debug = isolate->debug();
|
| // Handle stepping into a getter if step into is active.
|
| // TODO(rossberg): should this apply to getters that are function proxies?
|
| - if (debug->StepInActive() && fun->IsJSFunction()) {
|
| + if (debug->StepInActive() && getter->IsJSFunction()) {
|
| debug->HandleStepIn(
|
| - Handle<JSFunction>::cast(fun), Handle<Object>::null(), 0, false);
|
| + Handle<JSFunction>::cast(getter), Handle<Object>::null(), 0, false);
|
| }
|
| #endif
|
|
|
| bool has_pending_exception;
|
| Handle<Object> result = Execution::Call(
|
| - isolate, fun, self, 0, NULL, &has_pending_exception, true);
|
| + isolate, getter, receiver, 0, NULL, &has_pending_exception, true);
|
| // Check for pending exception and return the result.
|
| - if (has_pending_exception) return Failure::Exception();
|
| - return *result;
|
| + if (has_pending_exception) return MaybeHandle<Object>();
|
| + return result;
|
| }
|
|
|
|
|
| @@ -961,10 +967,10 @@ MaybeObject* Object::GetProperty(Object* receiver,
|
| }
|
|
|
|
|
| -Handle<Object> Object::GetElementWithReceiver(Isolate* isolate,
|
| - Handle<Object> object,
|
| - Handle<Object> receiver,
|
| - uint32_t index) {
|
| +MaybeHandle<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
|
| @@ -1017,9 +1023,11 @@ Handle<Object> Object::GetElementWithReceiver(Isolate* isolate,
|
| }
|
|
|
| if (js_object->elements() != isolate->heap()->empty_fixed_array()) {
|
| - Handle<Object> result = js_object->GetElementsAccessor()->Get(
|
| - receiver, js_object, index);
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<Object>());
|
| + Handle<Object> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, result,
|
| + js_object->GetElementsAccessor()->Get(receiver, js_object, index),
|
| + Object);
|
| if (!result->IsTheHole()) return result;
|
| }
|
| }
|
| @@ -3877,8 +3885,11 @@ MaybeHandle<Object> JSProxy::CallTrap(Handle<JSProxy> proxy,
|
| Handle<Object> handler(proxy->handler(), isolate);
|
|
|
| Handle<String> trap_name = isolate->factory()->InternalizeUtf8String(name);
|
| - Handle<Object> trap = Object::GetPropertyOrElement(handler, trap_name);
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, trap, MaybeHandle<Object>());
|
| + Handle<Object> trap;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, trap,
|
| + Object::GetPropertyOrElement(handler, trap_name),
|
| + Object);
|
|
|
| if (trap->IsUndefined()) {
|
| if (derived.is_null()) {
|
| @@ -4141,8 +4152,7 @@ MaybeHandle<Object> JSObject::SetPropertyForResult(
|
| bool is_observed = object->map()->is_observed() &&
|
| *name != isolate->heap()->hidden_string();
|
| if (is_observed && lookup->IsDataProperty()) {
|
| - old_value = Object::GetPropertyOrElement(object, name);
|
| - CHECK_NOT_EMPTY_HANDLE(isolate, old_value);
|
| + old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked();
|
| }
|
|
|
| // This is a real property that is not read-only, or it is a
|
| @@ -4189,8 +4199,8 @@ MaybeHandle<Object> JSObject::SetPropertyForResult(
|
| LookupResult new_lookup(isolate);
|
| object->LocalLookup(*name, &new_lookup, true);
|
| if (new_lookup.IsDataProperty()) {
|
| - Handle<Object> new_value = Object::GetPropertyOrElement(object, name);
|
| - CHECK_NOT_EMPTY_HANDLE(isolate, new_value);
|
| + Handle<Object> new_value =
|
| + Object::GetPropertyOrElement(object, name).ToHandleChecked();
|
| if (!new_value->SameValue(*old_value)) {
|
| EnqueueChangeRecord(object, "update", name, old_value);
|
| }
|
| @@ -4268,8 +4278,7 @@ MaybeHandle<Object> JSObject::SetLocalPropertyIgnoreAttributes(
|
| *name != isolate->heap()->hidden_string();
|
| if (is_observed && lookup.IsProperty()) {
|
| if (lookup.IsDataProperty()) {
|
| - old_value = Object::GetPropertyOrElement(object, name);
|
| - CHECK_NOT_EMPTY_HANDLE(isolate, old_value);
|
| + old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked();
|
| }
|
| old_attributes = lookup.GetAttributes();
|
| }
|
| @@ -4317,8 +4326,8 @@ MaybeHandle<Object> JSObject::SetLocalPropertyIgnoreAttributes(
|
| object->LocalLookup(*name, &new_lookup, true);
|
| bool value_changed = false;
|
| if (new_lookup.IsDataProperty()) {
|
| - Handle<Object> new_value = Object::GetPropertyOrElement(object, name);
|
| - CHECK_NOT_EMPTY_HANDLE(isolate, new_value);
|
| + Handle<Object> new_value =
|
| + Object::GetPropertyOrElement(object, name).ToHandleChecked();
|
| value_changed = !old_value->SameValue(*new_value);
|
| }
|
| if (new_lookup.GetAttributes() != old_attributes) {
|
| @@ -5337,8 +5346,7 @@ MaybeHandle<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::GetPropertyOrElement(object, name);
|
| - CHECK_NOT_EMPTY_HANDLE(isolate, old_value);
|
| + old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked();
|
| }
|
| Handle<Object> result;
|
|
|
| @@ -6450,8 +6458,8 @@ void JSObject::DefineAccessor(Handle<JSObject> object,
|
| object->LocalLookup(*name, &lookup, true);
|
| preexists = lookup.IsProperty();
|
| if (preexists && lookup.IsDataProperty()) {
|
| - old_value = Object::GetPropertyOrElement(object, name);
|
| - CHECK_NOT_EMPTY_HANDLE(isolate, old_value);
|
| + old_value =
|
| + Object::GetPropertyOrElement(object, name).ToHandleChecked();
|
| }
|
| }
|
| }
|
| @@ -7950,11 +7958,15 @@ void FixedArray::Shrink(int new_length) {
|
| }
|
|
|
|
|
| -Handle<FixedArray> FixedArray::AddKeysFromJSArray(Handle<FixedArray> content,
|
| - Handle<JSArray> array) {
|
| +MaybeHandle<FixedArray> FixedArray::AddKeysFromJSArray(
|
| + Handle<FixedArray> content,
|
| + Handle<JSArray> array) {
|
| ElementsAccessor* accessor = array->GetElementsAccessor();
|
| - Handle<FixedArray> result =
|
| - accessor->AddElementsToFixedArray(array, array, content);
|
| + Handle<FixedArray> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + array->GetIsolate(), result,
|
| + accessor->AddElementsToFixedArray(array, array, content),
|
| + FixedArray);
|
|
|
| #ifdef ENABLE_SLOW_ASSERTS
|
| if (FLAG_enable_slow_asserts) {
|
| @@ -7969,15 +7981,18 @@ Handle<FixedArray> FixedArray::AddKeysFromJSArray(Handle<FixedArray> content,
|
| }
|
|
|
|
|
| -Handle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first,
|
| - Handle<FixedArray> second) {
|
| +MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first,
|
| + Handle<FixedArray> second) {
|
| ElementsAccessor* accessor = ElementsAccessor::ForArray(second);
|
| - Handle<FixedArray> result =
|
| + Handle<FixedArray> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + first->GetIsolate(), result,
|
| accessor->AddElementsToFixedArray(
|
| Handle<Object>::null(), // receiver
|
| Handle<JSObject>::null(), // holder
|
| first,
|
| - Handle<FixedArrayBase>::cast(second));
|
| + Handle<FixedArrayBase>::cast(second)),
|
| + FixedArray);
|
|
|
| #ifdef ENABLE_SLOW_ASSERTS
|
| if (FLAG_enable_slow_asserts) {
|
| @@ -11968,70 +11983,59 @@ MaybeHandle<Object> JSObject::SetElementWithInterceptor(
|
| }
|
|
|
|
|
| -// TODO(ishell): Temporary wrapper until handlified.
|
| -Handle<Object> JSObject::GetElementWithCallback(
|
| +MaybeHandle<Object> JSObject::GetElementWithCallback(
|
| Handle<JSObject> object,
|
| Handle<Object> receiver,
|
| Handle<Object> structure,
|
| uint32_t index,
|
| Handle<Object> holder) {
|
| - CALL_HEAP_FUNCTION(object->GetIsolate(),
|
| - object->GetElementWithCallback(
|
| - *receiver, *structure, index, *holder),
|
| - Object);
|
| -}
|
| -
|
| -
|
| -MaybeObject* JSObject::GetElementWithCallback(Object* receiver,
|
| - Object* structure,
|
| - uint32_t index,
|
| - Object* holder) {
|
| - Isolate* isolate = GetIsolate();
|
| + Isolate* isolate = object->GetIsolate();
|
| ASSERT(!structure->IsForeign());
|
|
|
| // api style callbacks.
|
| if (structure->IsExecutableAccessorInfo()) {
|
| - Handle<ExecutableAccessorInfo> data(
|
| - ExecutableAccessorInfo::cast(structure));
|
| + Handle<ExecutableAccessorInfo> data =
|
| + Handle<ExecutableAccessorInfo>::cast(structure);
|
| Object* fun_obj = data->getter();
|
| v8::AccessorGetterCallback call_fun =
|
| v8::ToCData<v8::AccessorGetterCallback>(fun_obj);
|
| - if (call_fun == NULL) return isolate->heap()->undefined_value();
|
| - HandleScope scope(isolate);
|
| - Handle<JSObject> self(JSObject::cast(receiver));
|
| - Handle<JSObject> holder_handle(JSObject::cast(holder));
|
| + if (call_fun == NULL) return isolate->factory()->undefined_value();
|
| + Handle<JSObject> self = Handle<JSObject>::cast(receiver);
|
| + Handle<JSObject> holder_handle = Handle<JSObject>::cast(holder);
|
| Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
|
| Handle<String> key = isolate->factory()->NumberToString(number);
|
| LOG(isolate, ApiNamedPropertyAccess("load", *self, *key));
|
| PropertyCallbackArguments
|
| args(isolate, data->data(), *self, *holder_handle);
|
| v8::Handle<v8::Value> result = args.Call(call_fun, v8::Utils::ToLocal(key));
|
| - RETURN_IF_SCHEDULED_EXCEPTION(isolate);
|
| - if (result.IsEmpty()) return isolate->heap()->undefined_value();
|
| + RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
|
| + if (result.IsEmpty()) return isolate->factory()->undefined_value();
|
| Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
|
| result_internal->VerifyApiCallResultType();
|
| - return *result_internal;
|
| + // Rebox handle before return.
|
| + return handle(*result_internal, isolate);
|
| }
|
|
|
| // __defineGetter__ callback
|
| if (structure->IsAccessorPair()) {
|
| - Object* getter = AccessorPair::cast(structure)->getter();
|
| + Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(),
|
| + isolate);
|
| if (getter->IsSpecFunction()) {
|
| // TODO(rossberg): nicer would be to cast to some JSCallable here...
|
| - return GetPropertyWithDefinedGetter(receiver, JSReceiver::cast(getter));
|
| + return GetPropertyWithDefinedGetter(
|
| + object, receiver, Handle<JSReceiver>::cast(getter));
|
| }
|
| // Getter is not a function.
|
| - return isolate->heap()->undefined_value();
|
| + return isolate->factory()->undefined_value();
|
| }
|
|
|
| if (structure->IsDeclaredAccessorInfo()) {
|
| - return GetDeclaredAccessorProperty(receiver,
|
| - DeclaredAccessorInfo::cast(structure),
|
| - isolate);
|
| + return GetDeclaredAccessorProperty(
|
| + receiver, Handle<DeclaredAccessorInfo>::cast(structure), isolate);
|
| }
|
|
|
| UNREACHABLE();
|
| - return NULL;
|
| + return MaybeHandle<Object>();
|
| }
|
|
|
|
|
| @@ -12991,9 +12995,10 @@ MaybeObject* JSArray::JSArrayUpdateLengthFromIndex(uint32_t index,
|
| }
|
|
|
|
|
| -Handle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
|
| - Handle<Object> receiver,
|
| - uint32_t index) {
|
| +MaybeHandle<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
|
| @@ -13014,13 +13019,15 @@ Handle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
|
| Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
|
| result_internal->VerifyApiCallResultType();
|
| // Rebox handle before return.
|
| - return Handle<Object>(*result_internal, isolate);
|
| + return handle(*result_internal, isolate);
|
| }
|
| }
|
|
|
| ElementsAccessor* handler = object->GetElementsAccessor();
|
| - Handle<Object> result = handler->Get(receiver, object, index);
|
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<Object>());
|
| + Handle<Object> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, result, handler->Get(receiver, object, index),
|
| + Object);
|
| if (!result->IsTheHole()) return result;
|
|
|
| Handle<Object> proto(object->GetPrototype(), isolate);
|
| @@ -13320,7 +13327,7 @@ MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(
|
| *attributes = NONE;
|
| Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
|
| result_internal->VerifyApiCallResultType();
|
| - // Rebox handle to escape this scope.
|
| + // Rebox handle before return.
|
| return handle(*result_internal, isolate);
|
| }
|
| }
|
|
|