Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 3148327b6775ee0107de7f4d11d4708dd3f29759..f2e2650ce7d9e7c7c5a6d1c266a8ffead5f8e24a 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -637,14 +637,18 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateGlobalPrivateSymbol) { |
CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
Handle<JSObject> registry = isolate->GetSymbolRegistry(); |
Handle<String> part = isolate->factory()->private_intern_string(); |
- Handle<JSObject> privates = |
- Handle<JSObject>::cast(Object::GetPropertyOrElement(registry, part)); |
- Handle<Object> symbol = Object::GetPropertyOrElement(privates, name); |
+ Handle<Object> privates; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, privates, Object::GetPropertyOrElement(registry, part)); |
+ Handle<Object> symbol; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, symbol, Object::GetPropertyOrElement(privates, name)); |
if (!symbol->IsSymbol()) { |
ASSERT(symbol->IsUndefined()); |
symbol = isolate->factory()->NewPrivateSymbol(); |
Handle<Symbol>::cast(symbol)->set_name(*name); |
- JSObject::SetProperty(privates, name, symbol, NONE, STRICT).Assert(); |
+ JSObject::SetProperty(Handle<JSObject>::cast(privates), |
+ name, symbol, NONE, STRICT).Assert(); |
} |
return *symbol; |
} |
@@ -1907,9 +1911,10 @@ enum PropertyDescriptorIndices { |
}; |
-static Handle<Object> GetOwnProperty(Isolate* isolate, |
- Handle<JSObject> obj, |
- Handle<Name> name) { |
+MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty( |
+ Isolate* isolate, |
+ Handle<JSObject> obj, |
+ Handle<Name> name) { |
Heap* heap = isolate->heap(); |
Factory* factory = isolate->factory(); |
// Due to some WebKit tests, we want to make sure that we do not log |
@@ -1940,8 +1945,10 @@ static Handle<Object> GetOwnProperty(Isolate* isolate, |
if (!has_accessors) { |
elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0)); |
// Runtime::GetObjectProperty does access check. |
- Handle<Object> value = Runtime::GetObjectProperty(isolate, obj, name); |
- RETURN_IF_EMPTY_HANDLE_VALUE(isolate, value, Handle<Object>::null()); |
+ Handle<Object> value; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, value, Runtime::GetObjectProperty(isolate, obj, name), |
+ Object); |
elms->set(VALUE_INDEX, *value); |
} else { |
// Access checks are performed for both accessors separately. |
@@ -1953,14 +1960,14 @@ static Handle<Object> GetOwnProperty(Isolate* isolate, |
ASSERT(!isolate->has_scheduled_exception()); |
elms->set(GETTER_INDEX, *getter); |
} else { |
- RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
} |
if (!setter->IsMap() && CheckPropertyAccess(obj, name, v8::ACCESS_SET)) { |
ASSERT(!isolate->has_scheduled_exception()); |
elms->set(SETTER_INDEX, *setter); |
} else { |
- RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
} |
} |
@@ -1980,8 +1987,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) { |
ASSERT(args.length() == 2); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
- Handle<Object> result = GetOwnProperty(isolate, obj, name); |
- RETURN_IF_EMPTY_HANDLE(isolate, result); |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, GetOwnProperty(isolate, obj, name)); |
return *result; |
} |
@@ -4880,9 +4888,9 @@ static Handle<Object> GetCharAt(Handle<String> string, uint32_t index) { |
} |
-Handle<Object> Runtime::GetElementOrCharAt(Isolate* isolate, |
- Handle<Object> object, |
- uint32_t index) { |
+MaybeHandle<Object> Runtime::GetElementOrCharAt(Isolate* isolate, |
+ Handle<Object> object, |
+ uint32_t index) { |
// Handle [] indexing on Strings |
if (object->IsString()) { |
Handle<Object> result = GetCharAt(Handle<String>::cast(object), index); |
@@ -4937,9 +4945,9 @@ MaybeHandle<Object> Runtime::HasObjectProperty(Isolate* isolate, |
} |
-Handle<Object> Runtime::GetObjectProperty(Isolate* isolate, |
- Handle<Object> object, |
- Handle<Object> key) { |
+MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate, |
+ Handle<Object> object, |
+ Handle<Object> key) { |
if (object->IsUndefined() || object->IsNull()) { |
Handle<Object> args[2] = { key, object }; |
isolate->Throw(*isolate->factory()->NewTypeError("non_object_property_load", |
@@ -4973,8 +4981,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetProperty) { |
Handle<Object> object = args.at<Object>(0); |
Handle<Object> key = args.at<Object>(1); |
- Handle<Object> result = Runtime::GetObjectProperty(isolate, object, key); |
- RETURN_IF_EMPTY_HANDLE(isolate, result); |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ Runtime::GetObjectProperty(isolate, object, key)); |
return *result; |
} |
@@ -5076,9 +5086,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { |
// Fall back to GetObjectProperty. |
HandleScope scope(isolate); |
- Handle<Object> result = Runtime::GetObjectProperty( |
- isolate, args.at<Object>(0), args.at<Object>(1)); |
- RETURN_IF_EMPTY_HANDLE(isolate, result); |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ Runtime::GetObjectProperty( |
+ isolate, args.at<Object>(0), args.at<Object>(1))); |
return *result; |
} |
@@ -5745,9 +5757,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { |
HandleScope scope(isolate); |
ASSERT(args.length() == 1); |
CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
- bool threw = false; |
- Handle<JSArray> result = GetKeysFor(object, &threw); |
- if (threw) return Failure::Exception(); |
+ Handle<JSArray> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, GetKeysFor(object)); |
return *result; |
} |
@@ -5767,10 +5778,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { |
HandleScope scope(isolate); |
Handle<JSReceiver> object(raw_object); |
- bool threw = false; |
- Handle<FixedArray> content = |
- GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, &threw); |
- if (threw) return Failure::Exception(); |
+ Handle<FixedArray> content; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, content, GetKeysInFixedArrayFor(object, INCLUDE_PROTOS)); |
// Test again, since cache may have been built by preceding call. |
if (object->IsSimpleEnum()) return object->map(); |
@@ -5999,10 +6009,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) { |
object = Handle<JSObject>::cast(proto); |
} |
- bool threw = false; |
- Handle<FixedArray> contents = |
- GetKeysInFixedArrayFor(object, LOCAL_ONLY, &threw); |
- if (threw) return Failure::Exception(); |
+ Handle<FixedArray> contents; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, contents, GetKeysInFixedArrayFor(object, LOCAL_ONLY)); |
// Some fast paths through GetKeysInFixedArrayFor reuse a cached |
// property array and since the result is mutable we have to create |
@@ -6067,9 +6076,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) { |
return frame->GetParameter(index); |
} else { |
Handle<Object> initial_prototype(isolate->initial_object_prototype()); |
- Handle<Object> result = |
- Object::GetElement(isolate, initial_prototype, index); |
- RETURN_IF_EMPTY_HANDLE(isolate, result); |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ Object::GetElement(isolate, initial_prototype, index)); |
return *result; |
} |
} |
@@ -8929,8 +8939,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { |
} |
for (int i = 0; i < argc; ++i) { |
- argv[i] = Object::GetElement(isolate, arguments, offset + i); |
- RETURN_IF_EMPTY_HANDLE(isolate, argv[i]); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, argv[i], |
+ Object::GetElement(isolate, arguments, offset + i)); |
} |
bool threw; |
@@ -10280,8 +10291,10 @@ static bool IterateElements(Isolate* isolate, |
} else if (JSReceiver::HasElement(receiver, j)) { |
// Call GetElement on receiver, not its prototype, or getters won't |
// have the correct receiver. |
- element_value = Object::GetElement(isolate, receiver, j); |
- RETURN_IF_EMPTY_HANDLE_VALUE(isolate, element_value, false); |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
+ isolate, element_value, |
+ Object::GetElement(isolate, receiver, j), |
+ false); |
visitor->visit(j, element_value); |
} |
} |
@@ -10305,9 +10318,11 @@ static bool IterateElements(Isolate* isolate, |
} else if (JSReceiver::HasElement(receiver, j)) { |
// Call GetElement on receiver, not its prototype, or getters won't |
// have the correct receiver. |
- Handle<Object> element_value = |
- Object::GetElement(isolate, receiver, j); |
- RETURN_IF_EMPTY_HANDLE_VALUE(isolate, element_value, false); |
+ Handle<Object> element_value; |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
+ isolate, element_value, |
+ Object::GetElement(isolate, receiver, j), |
+ false); |
visitor->visit(j, element_value); |
} |
} |
@@ -10325,8 +10340,11 @@ static bool IterateElements(Isolate* isolate, |
while (j < n) { |
HandleScope loop_scope(isolate); |
uint32_t index = indices[j]; |
- Handle<Object> element = Object::GetElement(isolate, receiver, index); |
- RETURN_IF_EMPTY_HANDLE_VALUE(isolate, element, false); |
+ Handle<Object> element; |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
+ isolate, element, |
+ Object::GetElement(isolate, receiver, index), |
+ false); |
visitor->visit(index, element); |
// Skip to next different index (i.e., omit duplicates). |
do { |
@@ -10669,7 +10687,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) { |
isolate->factory()->NewFixedArray( |
current->NumberOfLocalElements(NONE)); |
current->GetLocalElementKeys(*current_keys, NONE); |
- keys = FixedArray::UnionOfKeys(keys, current_keys); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, keys, FixedArray::UnionOfKeys(keys, current_keys)); |
} |
// Erase any keys >= length. |
// TODO(adamk): Remove this step when the contract of %GetArrayKeys |
@@ -10851,9 +10870,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) { |
uint32_t index; |
if (name->AsArrayIndex(&index)) { |
Handle<FixedArray> details = isolate->factory()->NewFixedArray(2); |
- Handle<Object> element_or_char = |
- Runtime::GetElementOrCharAt(isolate, obj, index); |
- RETURN_IF_EMPTY_HANDLE(isolate, element_or_char); |
+ Handle<Object> element_or_char; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, element_or_char, |
+ Runtime::GetElementOrCharAt(isolate, obj, index)); |
details->set(0, *element_or_char); |
details->set( |
1, PropertyDetails(NONE, NORMAL, Representation::None()).AsSmi()); |
@@ -10991,8 +11011,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugIndexedInterceptorElementValue) { |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
RUNTIME_ASSERT(obj->HasIndexedInterceptor()); |
CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); |
- Handle<Object> result = JSObject::GetElementWithInterceptor(obj, obj, index); |
- RETURN_IF_EMPTY_HANDLE(isolate, result); |
+ Handle<Object> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, JSObject::GetElementWithInterceptor(obj, obj, index)); |
return *result; |
} |
@@ -11482,7 +11503,8 @@ static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate, |
ASSERT(!frame->GetParameter(i)->IsTheHole()); |
HandleScope scope(isolate); |
Handle<String> name(scope_info->ParameterName(i)); |
- Handle<Object> value = Object::GetPropertyOrElement(target, name); |
+ Handle<Object> value = |
+ Object::GetPropertyOrElement(target, name).ToHandleChecked(); |
frame->SetParameterValue(i, *value); |
} |
@@ -11491,7 +11513,8 @@ static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate, |
if (frame->GetExpression(i)->IsTheHole()) continue; |
HandleScope scope(isolate); |
Handle<Object> value = Object::GetPropertyOrElement( |
- target, Handle<String>(scope_info->StackLocalName(i))); |
+ target, |
+ handle(scope_info->StackLocalName(i), isolate)).ToHandleChecked(); |
frame->SetExpression(i, *value); |
} |
} |
@@ -11522,23 +11545,21 @@ MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeLocalContext( |
if (function_context->has_extension() && |
!function_context->IsNativeContext()) { |
Handle<JSObject> ext(JSObject::cast(function_context->extension())); |
- bool threw = false; |
- Handle<FixedArray> keys = |
- GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS, &threw); |
- if (threw) return Handle<JSObject>(); |
+ Handle<FixedArray> keys; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, keys, GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS), JSObject); |
for (int i = 0; i < keys->length(); i++) { |
// Names of variables introduced by eval are strings. |
ASSERT(keys->get(i)->IsString()); |
Handle<String> key(String::cast(keys->get(i))); |
+ Handle<Object> value; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, value, Object::GetPropertyOrElement(ext, key), JSObject); |
RETURN_ON_EXCEPTION( |
isolate, |
- Runtime::SetObjectProperty(isolate, |
- target, |
- key, |
- Object::GetPropertyOrElement(ext, key), |
- NONE, |
- SLOPPY), |
+ Runtime::SetObjectProperty( |
+ isolate, target, key, value, NONE, SLOPPY), |
JSObject); |
} |
} |
@@ -11677,20 +11698,22 @@ MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeClosure( |
// be variables introduced by eval. |
if (context->has_extension()) { |
Handle<JSObject> ext(JSObject::cast(context->extension())); |
- bool threw = false; |
- Handle<FixedArray> keys = |
- GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS, &threw); |
- if (threw) return Handle<JSObject>(); |
+ Handle<FixedArray> keys; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, keys, GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS), JSObject); |
for (int i = 0; i < keys->length(); i++) { |
+ HandleScope scope(isolate); |
// Names of variables introduced by eval are strings. |
ASSERT(keys->get(i)->IsString()); |
Handle<String> key(String::cast(keys->get(i))); |
- RETURN_ON_EXCEPTION( |
+ Handle<Object> value; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, value, Object::GetPropertyOrElement(ext, key), JSObject); |
+ RETURN_ON_EXCEPTION( |
isolate, |
- Runtime::SetObjectProperty(isolate, closure_scope, key, |
- Object::GetPropertyOrElement(ext, key), |
- NONE, SLOPPY), |
+ Runtime::SetObjectProperty( |
+ isolate, closure_scope, key, value, NONE, SLOPPY), |
JSObject); |
} |
} |
@@ -13808,8 +13831,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLanguageTagVariants) { |
Handle<Name> base = |
isolate->factory()->NewStringFromAscii(CStrVector("base")); |
for (unsigned int i = 0; i < length; ++i) { |
- Handle<Object> locale_id = Object::GetElement(isolate, input, i); |
- RETURN_IF_EMPTY_HANDLE(isolate, locale_id); |
+ Handle<Object> locale_id; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, locale_id, Object::GetElement(isolate, input, i)); |
if (!locale_id->IsString()) { |
return isolate->Throw(isolate->heap()->illegal_argument_string()); |
} |