| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index abc48ba1a0c160b76147b824de3a61c107dfb52f..0ca1b1af54bd073ca0c37479d3a62cbd19b1c978 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -2383,6 +2383,9 @@ bool v8::Object::SetPrototype(Handle<Value> value) {
|
| ENTER_V8;
|
| i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| i::Handle<i::Object> value_obj = Utils::OpenHandle(*value);
|
| + // We do not allow exceptions thrown while setting the prototype
|
| + // propagate outside.
|
| + TryCatch try_catch;
|
| EXCEPTION_PREAMBLE();
|
| i::Handle<i::Object> result = i::SetPrototype(self, value_obj);
|
| has_pending_exception = result.is_null();
|
| @@ -2569,6 +2572,25 @@ bool v8::Object::HasIndexedLookupInterceptor() {
|
| }
|
|
|
|
|
| +static Local<Value> GetPropertyByLookup(i::Handle<i::JSObject> receiver,
|
| + i::Handle<i::String> name,
|
| + i::LookupResult* lookup) {
|
| + if (!lookup->IsProperty()) {
|
| + // No real property was found.
|
| + return Local<Value>();
|
| + }
|
| +
|
| + // If the property being looked up is a callback, it can throw
|
| + // an exception.
|
| + EXCEPTION_PREAMBLE();
|
| + i::Handle<i::Object> result = i::GetProperty(receiver, name, lookup);
|
| + has_pending_exception = result.is_null();
|
| + EXCEPTION_BAILOUT_CHECK(Local<Value>());
|
| +
|
| + return Utils::ToLocal(result);
|
| +}
|
| +
|
| +
|
| Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain(
|
| Handle<String> key) {
|
| ON_BAILOUT("v8::Object::GetRealNamedPropertyInPrototypeChain()",
|
| @@ -2578,17 +2600,7 @@ Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain(
|
| i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
|
| i::LookupResult lookup;
|
| self_obj->LookupRealNamedPropertyInPrototypes(*key_obj, &lookup);
|
| - if (lookup.IsProperty()) {
|
| - PropertyAttributes attributes;
|
| - i::Object* property =
|
| - self_obj->GetProperty(*self_obj,
|
| - &lookup,
|
| - *key_obj,
|
| - &attributes)->ToObjectUnchecked();
|
| - i::Handle<i::Object> result(property);
|
| - return Utils::ToLocal(result);
|
| - }
|
| - return Local<Value>(); // No real property was found in prototype chain.
|
| + return GetPropertyByLookup(self_obj, key_obj, &lookup);
|
| }
|
|
|
|
|
| @@ -2599,17 +2611,7 @@ Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) {
|
| i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
|
| i::LookupResult lookup;
|
| self_obj->LookupRealNamedProperty(*key_obj, &lookup);
|
| - if (lookup.IsProperty()) {
|
| - PropertyAttributes attributes;
|
| - i::Object* property =
|
| - self_obj->GetProperty(*self_obj,
|
| - &lookup,
|
| - *key_obj,
|
| - &attributes)->ToObjectUnchecked();
|
| - i::Handle<i::Object> result(property);
|
| - return Utils::ToLocal(result);
|
| - }
|
| - return Local<Value>(); // No real property was found in prototype chain.
|
| + return GetPropertyByLookup(self_obj, key_obj, &lookup);
|
| }
|
|
|
|
|
|
|