Index: src/stub-cache.cc |
=================================================================== |
--- src/stub-cache.cc (revision 1538) |
+++ src/stub-cache.cc (working copy) |
@@ -656,9 +656,8 @@ |
Object* LoadCallbackProperty(Arguments args) { |
Handle<JSObject> recv = args.at<JSObject>(0); |
AccessorInfo* callback = AccessorInfo::cast(args[1]); |
- v8::AccessorGetter fun = |
- FUNCTION_CAST<v8::AccessorGetter>( |
- v8::ToCData<Address>(callback->getter())); |
+ Address getter_address = v8::ToCData<Address>(callback->getter()); |
+ v8::AccessorGetter fun = FUNCTION_CAST<v8::AccessorGetter>(getter_address); |
ASSERT(fun != NULL); |
Handle<String> name = args.at<String>(2); |
Handle<JSObject> holder = args.at<JSObject>(3); |
@@ -669,10 +668,9 @@ |
// locations of the arguments to this function maybe we don't have |
// to explicitly create the structure but can just pass a pointer |
// into the stack. |
- v8::AccessorInfo info( |
- v8::Utils::ToLocal(recv), |
- v8::Utils::ToLocal(data), |
- v8::Utils::ToLocal(holder)); |
+ v8::AccessorInfo info(v8::Utils::ToLocal(recv), |
+ v8::Utils::ToLocal(data), |
+ v8::Utils::ToLocal(holder)); |
v8::Handle<v8::Value> result; |
{ |
// Leaving JavaScript. |
@@ -680,30 +678,25 @@ |
result = fun(v8::Utils::ToLocal(name), info); |
} |
RETURN_IF_SCHEDULED_EXCEPTION(); |
- if (result.IsEmpty()) { |
- return Heap::undefined_value(); |
- } else { |
- return *v8::Utils::OpenHandle(*result); |
- } |
+ if (result.IsEmpty()) return Heap::undefined_value(); |
+ return *v8::Utils::OpenHandle(*result); |
} |
Object* StoreCallbackProperty(Arguments args) { |
Handle<JSObject> recv = args.at<JSObject>(0); |
AccessorInfo* callback = AccessorInfo::cast(args[1]); |
- v8::AccessorSetter fun = |
- FUNCTION_CAST<v8::AccessorSetter>( |
- v8::ToCData<Address>(callback->setter())); |
+ Address setter_address = v8::ToCData<Address>(callback->setter()); |
+ v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); |
ASSERT(fun != NULL); |
Handle<String> name = args.at<String>(2); |
Handle<Object> value = args.at<Object>(3); |
HandleScope scope; |
Handle<Object> data(callback->data()); |
LOG(ApiNamedPropertyAccess("store", *recv, *name)); |
- v8::AccessorInfo info( |
- v8::Utils::ToLocal(recv), |
- v8::Utils::ToLocal(data), |
- v8::Utils::ToLocal(recv)); |
+ v8::AccessorInfo info(v8::Utils::ToLocal(recv), |
+ v8::Utils::ToLocal(data), |
+ v8::Utils::ToLocal(recv)); |
{ |
// Leaving JavaScript. |
VMState state(OTHER); |
@@ -715,28 +708,17 @@ |
Object* LoadInterceptorProperty(Arguments args) { |
- HandleScope scope; |
- Handle<JSObject> recv = args.at<JSObject>(0); |
- Handle<JSObject> holder = args.at<JSObject>(1); |
- Handle<String> name = args.at<String>(2); |
+ JSObject* recv = JSObject::cast(args[0]); |
+ JSObject* holder = JSObject::cast(args[1]); |
+ String* name = String::cast(args[2]); |
ASSERT(holder->HasNamedInterceptor()); |
PropertyAttributes attr = NONE; |
- Handle<Object> result = GetPropertyWithInterceptor(recv, holder, name, &attr); |
+ Object* result = holder->GetPropertyWithInterceptor(recv, name, &attr); |
- // GetPropertyWithInterceptor already converts a scheduled exception |
- // to a pending one if any. Don't use RETURN_IF_SCHEDULED_EXCEPTION() here. |
+ if (result->IsFailure()) return result; |
- // Make sure to propagate exceptions. |
- if (result.is_null()) { |
- // Failure::Exception is converted to a null handle in the |
- // handle-based methods such as SetProperty. We therefore need |
- // to convert null handles back to exceptions. |
- ASSERT(Top::has_pending_exception()); |
- return Failure::Exception(); |
- } |
- |
// If the property is present, return it. |
- if (attr != ABSENT) return *result; |
+ if (attr != ABSENT) return result; |
// If the top frame is an internal frame, this is really a call |
// IC. In this case, we simply return the undefined result which |
@@ -744,43 +726,38 @@ |
// function. |
StackFrameIterator it; |
it.Advance(); // skip exit frame |
- if (it.frame()->is_internal()) return *result; |
+ if (it.frame()->is_internal()) return result; |
// If the load is non-contextual, just return the undefined result. |
// Note that both keyed and non-keyed loads may end up here, so we |
// can't use either LoadIC or KeyedLoadIC constructors. |
IC ic(IC::NO_EXTRA_FRAME); |
ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub()); |
- if (!ic.is_contextual()) return *result; |
+ if (!ic.is_contextual()) return result; |
// Throw a reference error. |
- Handle<Object> error = |
- Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); |
- return Top::Throw(*error); |
+ { |
+ HandleScope scope; |
+ // We cannot use the raw name pointer here since getting the |
+ // property might cause a GC. However, we can get the name from |
+ // the stack using the arguments object. |
+ Handle<String> name_handle = args.at<String>(2); |
+ Handle<Object> error = |
+ Factory::NewReferenceError("not_defined", |
+ HandleVector(&name_handle, 1)); |
+ return Top::Throw(*error); |
+ } |
} |
Object* StoreInterceptorProperty(Arguments args) { |
- HandleScope scope; |
- Handle<JSObject> recv = args.at<JSObject>(0); |
- Handle<String> name = args.at<String>(1); |
- Handle<Object> value = args.at<Object>(2); |
+ JSObject* recv = JSObject::cast(args[0]); |
+ String* name = String::cast(args[1]); |
+ Object* value = args[2]; |
ASSERT(recv->HasNamedInterceptor()); |
PropertyAttributes attr = NONE; |
- Handle<Object> result = SetPropertyWithInterceptor(recv, name, value, attr); |
- |
- // SetPropertyWithInterceptor already converts a scheduled exception |
- // to a pending one if any. Don't use RETURN_IF_SCHEDULED_EXCEPTION() here. |
- |
- // Make sure to propagate exceptions. |
- if (result.is_null()) { |
- // Failure::Exception is converted to a null handle in the |
- // handle-based methods such as SetProperty. We therefore need |
- // to convert null handles back to exceptions. |
- ASSERT(Top::has_pending_exception()); |
- return Failure::Exception(); |
- } |
- return *result; |
+ Object* result = recv->SetPropertyWithInterceptor(name, value, attr); |
+ return result; |
} |