Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 959a04242cba1ab7689449d1c01ef1066c011e16..52c170a96b23ad6f097962d213260d8ad24b3acf 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -213,13 +213,13 @@ static Handle<Map> ComputeObjectLiteralMap( |
| } |
| -static Handle<Object> CreateLiteralBoilerplate( |
| +static MaybeHandle<Object> CreateLiteralBoilerplate( |
|
Igor Sheludko
2014/04/04 10:58:19
I think you should add MUST_USE_RESULT here and fo
Yang
2014/04/04 11:17:41
Done.
|
| Isolate* isolate, |
| Handle<FixedArray> literals, |
| Handle<FixedArray> constant_properties); |
| -static Handle<Object> CreateObjectLiteralBoilerplate( |
| +static MaybeHandle<Object> CreateObjectLiteralBoilerplate( |
| Isolate* isolate, |
| Handle<FixedArray> literals, |
| Handle<FixedArray> constant_properties, |
| @@ -274,27 +274,29 @@ static Handle<Object> CreateObjectLiteralBoilerplate( |
| // The value contains the constant_properties of a |
| // simple object or array literal. |
| Handle<FixedArray> array = Handle<FixedArray>::cast(value); |
| - value = CreateLiteralBoilerplate(isolate, literals, array); |
| - if (value.is_null()) return value; |
| + ASSIGN_RETURN_ON_EXCEPTION( |
| + isolate, value, |
| + CreateLiteralBoilerplate(isolate, literals, array), |
| + Object); |
| } |
| - Handle<Object> result; |
| + MaybeHandle<Object> maybe_result; |
| uint32_t element_index = 0; |
| StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT; |
| if (key->IsInternalizedString()) { |
| if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { |
| // Array index as string (uint32). |
| - result = JSObject::SetOwnElement( |
| + maybe_result = JSObject::SetOwnElement( |
| boilerplate, element_index, value, SLOPPY); |
| } else { |
| Handle<String> name(String::cast(*key)); |
| ASSERT(!name->AsArrayIndex(&element_index)); |
| - result = JSObject::SetLocalPropertyIgnoreAttributes( |
| + maybe_result = JSObject::SetLocalPropertyIgnoreAttributes( |
| boilerplate, name, value, NONE, |
| Object::OPTIMAL_REPRESENTATION, mode); |
| } |
| } else if (key->ToArrayIndex(&element_index)) { |
| // Array index (uint32). |
| - result = JSObject::SetOwnElement( |
| + maybe_result = JSObject::SetOwnElement( |
| boilerplate, element_index, value, SLOPPY); |
| } else { |
| // Non-uint32 number. |
| @@ -305,7 +307,7 @@ static Handle<Object> CreateObjectLiteralBoilerplate( |
| const char* str = DoubleToCString(num, buffer); |
| Handle<String> name = |
| isolate->factory()->NewStringFromAscii(CStrVector(str)); |
| - result = JSObject::SetLocalPropertyIgnoreAttributes( |
| + maybe_result = JSObject::SetLocalPropertyIgnoreAttributes( |
| boilerplate, name, value, NONE, |
| Object::OPTIMAL_REPRESENTATION, mode); |
| } |
| @@ -313,7 +315,7 @@ static Handle<Object> CreateObjectLiteralBoilerplate( |
| // exception, the exception is converted to an empty handle in |
| // the handle based operations. In that case, we need to |
| // convert back to an exception. |
| - if (result.is_null()) return result; |
| + RETURN_ON_EXCEPTION(isolate, maybe_result, Object); |
| } |
| // Transform to fast properties if necessary. For object literals with |
| @@ -347,7 +349,7 @@ MaybeObject* TransitionElements(Handle<Object> object, |
| static const int kSmiLiteralMinimumLength = 1024; |
| -Handle<Object> Runtime::CreateArrayLiteralBoilerplate( |
| +MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate( |
| Isolate* isolate, |
| Handle<FixedArray> literals, |
| Handle<FixedArray> elements) { |
| @@ -406,9 +408,11 @@ Handle<Object> Runtime::CreateArrayLiteralBoilerplate( |
| // The value contains the constant_properties of a |
| // simple object or array literal. |
| Handle<FixedArray> fa(FixedArray::cast(fixed_array_values->get(i))); |
| - Handle<Object> result = |
| - CreateLiteralBoilerplate(isolate, literals, fa); |
| - if (result.is_null()) return result; |
| + Handle<Object> result; |
| + ASSIGN_RETURN_ON_EXCEPTION( |
| + isolate, result, |
| + CreateLiteralBoilerplate(isolate, literals, fa), |
| + Object); |
| fixed_array_values_copy->set(i, *result); |
| } |
| } |
| @@ -437,7 +441,7 @@ Handle<Object> Runtime::CreateArrayLiteralBoilerplate( |
| } |
| -static Handle<Object> CreateLiteralBoilerplate( |
| +static MaybeHandle<Object> CreateLiteralBoilerplate( |
| Isolate* isolate, |
| Handle<FixedArray> literals, |
| Handle<FixedArray> array) { |
| @@ -461,7 +465,7 @@ static Handle<Object> CreateLiteralBoilerplate( |
| isolate, literals, elements); |
| default: |
| UNREACHABLE(); |
| - return Handle<Object>::null(); |
| + return MaybeHandle<Object>(); |
| } |
| } |
| @@ -481,13 +485,15 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_CreateObjectLiteral) { |
| Handle<AllocationSite> site; |
| Handle<JSObject> boilerplate; |
| if (*literal_site == isolate->heap()->undefined_value()) { |
| - Handle<Object> raw_boilerplate = CreateObjectLiteralBoilerplate( |
| - isolate, |
| - literals, |
| - constant_properties, |
| - should_have_fast_elements, |
| - has_function_literal); |
| - RETURN_IF_EMPTY_HANDLE(isolate, raw_boilerplate); |
| + Handle<Object> raw_boilerplate; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, raw_boilerplate, |
| + CreateObjectLiteralBoilerplate( |
| + isolate, |
| + literals, |
| + constant_properties, |
| + should_have_fast_elements, |
| + has_function_literal)); |
| boilerplate = Handle<JSObject>::cast(raw_boilerplate); |
| AllocationSiteCreationContext creation_context(isolate); |
| @@ -513,7 +519,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_CreateObjectLiteral) { |
| } |
| -static Handle<AllocationSite> GetLiteralAllocationSite( |
| +static MaybeHandle<AllocationSite> GetLiteralAllocationSite( |
| Isolate* isolate, |
| Handle<FixedArray> literals, |
| int literals_index, |
| @@ -523,9 +529,11 @@ static Handle<AllocationSite> GetLiteralAllocationSite( |
| Handle<AllocationSite> site; |
| if (*literal_site == isolate->heap()->undefined_value()) { |
| ASSERT(*elements != isolate->heap()->empty_fixed_array()); |
| - Handle<Object> boilerplate = |
| - Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
| - if (boilerplate.is_null()) return Handle<AllocationSite>::null(); |
| + Handle<Object> boilerplate; |
| + ASSIGN_RETURN_ON_EXCEPTION( |
| + isolate, boilerplate, |
| + Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements), |
| + AllocationSite); |
| AllocationSiteCreationContext creation_context(isolate); |
| site = creation_context.EnterNewScope(); |
| @@ -549,9 +557,10 @@ static MaybeObject* CreateArrayLiteralImpl(Isolate* isolate, |
| int literals_index, |
| Handle<FixedArray> elements, |
| int flags) { |
| - Handle<AllocationSite> site = GetLiteralAllocationSite(isolate, literals, |
| - literals_index, elements); |
| - RETURN_IF_EMPTY_HANDLE(isolate, site); |
| + Handle<AllocationSite> site; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, site, |
| + GetLiteralAllocationSite(isolate, literals, literals_index, elements)); |
| bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0; |
| Handle<JSObject> boilerplate(JSObject::cast(site->transition_info())); |
| @@ -632,7 +641,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateGlobalPrivateSymbol) { |
| ASSERT(symbol->IsUndefined()); |
| symbol = isolate->factory()->NewPrivateSymbol(); |
| Handle<Symbol>::cast(symbol)->set_name(*name); |
| - JSObject::SetProperty(privates, name, symbol, NONE, STRICT); |
| + JSObject::SetProperty(privates, name, symbol, NONE, STRICT).Assert(); |
| } |
| return *symbol; |
| } |
| @@ -2207,7 +2216,8 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_DeclareGlobals) { |
| global, name, value, static_cast<PropertyAttributes>(attr))); |
| } else { |
| // Do a [[Put]] on the existing (own) property. |
| - RETURN_IF_EMPTY_HANDLE(isolate, |
| + RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, |
| JSObject::SetProperty( |
| global, name, value, static_cast<PropertyAttributes>(attr), |
| strict_mode)); |
| @@ -2263,7 +2273,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_DeclareContextSlot) { |
| // Slow case: The property is in the context extension object of a |
| // function context or the global object of a native context. |
| Handle<JSObject> object = Handle<JSObject>::cast(holder); |
| - RETURN_IF_EMPTY_HANDLE( |
| + RETURN_FAILURE_ON_EXCEPTION( |
| isolate, |
| JSReceiver::SetProperty(object, name, initial_value, mode, SLOPPY)); |
| } |
| @@ -2310,7 +2320,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_DeclareContextSlot) { |
| RETURN_IF_EMPTY_HANDLE(isolate, |
| JSObject::SetLocalPropertyIgnoreAttributes(object, name, value, mode)); |
| } else { |
| - RETURN_IF_EMPTY_HANDLE(isolate, |
| + RETURN_FAILURE_ON_EXCEPTION(isolate, |
| JSReceiver::SetProperty(object, name, value, mode, SLOPPY)); |
| } |
| } |
| @@ -2355,9 +2365,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) { |
| // Found an interceptor that's not read only. |
| if (assign) { |
| CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| - Handle<Object> result = JSObject::SetPropertyForResult( |
| - holder, &lookup, name, value, attributes, strict_mode); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + JSObject::SetPropertyForResult( |
| + holder, &lookup, name, value, attributes, strict_mode)); |
| return *result; |
| } else { |
| return isolate->heap()->undefined_value(); |
| @@ -2368,9 +2380,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) { |
| if (assign) { |
| CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| Handle<GlobalObject> global(isolate->context()->global_object()); |
| - Handle<Object> result = JSReceiver::SetProperty( |
| - global, name, value, attributes, strict_mode); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + JSReceiver::SetProperty(global, name, value, attributes, strict_mode)); |
| return *result; |
| } |
| return isolate->heap()->undefined_value(); |
| @@ -2421,7 +2434,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_InitializeConstGlobal) { |
| // property through an interceptor and only do it if it's |
| // uninitialized, e.g. the hole. Nirk... |
| // Passing sloppy mode because the property is writable. |
| - RETURN_IF_EMPTY_HANDLE( |
| + RETURN_FAILURE_ON_EXCEPTION( |
| isolate, |
| JSReceiver::SetProperty(global, name, value, attributes, SLOPPY)); |
| return *value; |
| @@ -2491,7 +2504,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_InitializeConstContextSlot) { |
| Handle<JSObject> global = Handle<JSObject>( |
| isolate->context()->global_object()); |
| // Strict mode not needed (const disallowed in strict mode). |
| - RETURN_IF_EMPTY_HANDLE( |
| + RETURN_FAILURE_ON_EXCEPTION( |
| isolate, |
| JSReceiver::SetProperty(global, name, value, NONE, SLOPPY)); |
| return *value; |
| @@ -2542,7 +2555,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_InitializeConstContextSlot) { |
| // read-only property. |
| if ((attributes & READ_ONLY) == 0) { |
| // Strict mode not needed (const disallowed in strict mode). |
| - RETURN_IF_EMPTY_HANDLE( |
| + RETURN_FAILURE_ON_EXCEPTION( |
| isolate, |
| JSReceiver::SetProperty(object, name, value, attributes, SLOPPY)); |
| } |
| @@ -2704,7 +2717,7 @@ static Handle<JSFunction> InstallBuiltin(Isolate* isolate, |
| code, |
| false); |
| optimized->shared()->DontAdaptArguments(); |
| - JSReceiver::SetProperty(holder, key, optimized, NONE, STRICT); |
| + JSReceiver::SetProperty(holder, key, optimized, NONE, STRICT).Assert(); |
| return optimized; |
| } |
| @@ -5165,14 +5178,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
| // TODO(mstarzinger): So far this only works if property attributes don't |
| // change, this should be fixed once we cleanup the underlying code. |
| if (callback->IsForeign() && lookup.GetAttributes() == attr) { |
| - Handle<Object> result_object = |
| + Handle<Object> result_object; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result_object, |
| JSObject::SetPropertyWithCallback(js_object, |
| callback, |
| name, |
| obj_value, |
| handle(lookup.holder()), |
| - STRICT); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result_object); |
| + STRICT)); |
| return *result_object; |
| } |
| } |
| @@ -5194,17 +5208,18 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
| JSObject::NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0); |
| // Use IgnoreAttributes version since a readonly property may be |
| // overridden and SetProperty does not allow this. |
| - Handle<Object> result = JSObject::SetLocalPropertyIgnoreAttributes( |
| - js_object, name, obj_value, attr); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + JSObject::SetLocalPropertyIgnoreAttributes( |
| + js_object, name, obj_value, attr)); |
| return *result; |
| } |
| - Handle<Object> result = Runtime::ForceSetObjectProperty(isolate, js_object, |
| - name, |
| - obj_value, |
| - attr); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + Runtime::ForceSetObjectProperty(js_object, name, obj_value, attr)); |
| return *result; |
| } |
| @@ -5239,12 +5254,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDataProperty) { |
| } |
| -Handle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
| - Handle<Object> object, |
| - Handle<Object> key, |
| - Handle<Object> value, |
| - PropertyAttributes attr, |
| - StrictMode strict_mode) { |
| +MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
| + Handle<Object> object, |
| + Handle<Object> key, |
| + Handle<Object> value, |
| + PropertyAttributes attr, |
| + StrictMode strict_mode) { |
| SetPropertyMode set_mode = attr == NONE ? SET_PROPERTY : DEFINE_PROPERTY; |
| if (object->IsUndefined() || object->IsNull()) { |
| @@ -5343,11 +5358,11 @@ Handle<Object> Runtime::SetObjectProperty(Isolate* isolate, |
| } |
| -Handle<Object> Runtime::ForceSetObjectProperty(Isolate* isolate, |
| - Handle<JSObject> js_object, |
| - Handle<Object> key, |
| - Handle<Object> value, |
| - PropertyAttributes attr) { |
| +MaybeHandle<Object> Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, |
| + Handle<Object> key, |
| + Handle<Object> value, |
| + PropertyAttributes attr) { |
| + Isolate* isolate = js_object->GetIsolate(); |
| // Check if the given key is an array index. |
| uint32_t index; |
| if (key->ToArrayIndex(&index)) { |
| @@ -5472,11 +5487,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetProperty) { |
| strict_mode = strict_mode_arg; |
| } |
| - Handle<Object> result = Runtime::SetObjectProperty(isolate, object, key, |
| - value, |
| - attributes, |
| - strict_mode); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + Runtime::SetObjectProperty( |
| + isolate, object, key, value, attributes, strict_mode)); |
| return *result; |
| } |
| @@ -5635,9 +5650,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { |
| (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
| attributes = static_cast<PropertyAttributes>(unchecked_value); |
| } |
| - Handle<Object> result = JSObject::SetLocalPropertyIgnoreAttributes( |
| - object, name, value, attributes); |
| - RETURN_IF_EMPTY_HANDLE(isolate, result); |
| + Handle<Object> result; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, result, |
| + JSObject::SetLocalPropertyIgnoreAttributes( |
| + object, name, value, attributes)); |
| return *result; |
| } |
| @@ -8237,7 +8254,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionBindArguments) { |
| Handle<Object> new_length(args.at<Object>(3)); |
| PropertyAttributes attr = |
| static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY); |
| - ForceSetProperty(bound_function, length_string, new_length, attr); |
| + Runtime::ForceSetObjectProperty( |
| + bound_function, length_string, new_length, attr).Assert(); |
| return *bound_function; |
| } |
| @@ -9172,7 +9190,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_DeclareModules) { |
| case MODULE: { |
| Object* referenced_context = Context::cast(host_context)->get(index); |
| Handle<JSModule> value(Context::cast(referenced_context)->module()); |
| - JSReceiver::SetProperty(module, name, value, FROZEN, STRICT); |
| + JSReceiver::SetProperty(module, name, value, FROZEN, STRICT).Assert(); |
| break; |
| } |
| case INTERNAL: |
| @@ -9459,7 +9477,7 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StoreContextSlot) { |
| // Set the property if it's not read only or doesn't yet exist. |
| if ((attributes & READ_ONLY) == 0 || |
| (JSReceiver::GetLocalPropertyAttribute(object, name) == ABSENT)) { |
| - RETURN_IF_EMPTY_HANDLE( |
| + RETURN_FAILURE_ON_EXCEPTION( |
| isolate, |
| JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); |
| } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) { |
| @@ -11444,7 +11462,7 @@ static bool ParameterIsShadowedByContextLocal(Handle<ScopeInfo> info, |
| // Create a plain JSObject which materializes the local scope for the specified |
| // frame. |
| -static Handle<JSObject> MaterializeStackLocalsWithFrameInspector( |
| +static MaybeHandle<JSObject> MaterializeStackLocalsWithFrameInspector( |
| Isolate* isolate, |
| Handle<JSObject> target, |
| Handle<JSFunction> function, |
| @@ -11465,10 +11483,10 @@ static Handle<JSObject> MaterializeStackLocalsWithFrameInspector( |
| ASSERT(!value->IsTheHole()); |
| Handle<String> name(scope_info->ParameterName(i)); |
| - RETURN_IF_EMPTY_HANDLE_VALUE( |
| + RETURN_ON_EXCEPTION( |
| isolate, |
| Runtime::SetObjectProperty(isolate, target, name, value, NONE, SLOPPY), |
| - Handle<JSObject>()); |
| + JSObject); |
| } |
| // Second fill all stack locals. |
| @@ -11477,10 +11495,10 @@ static Handle<JSObject> MaterializeStackLocalsWithFrameInspector( |
| Handle<Object> value(frame_inspector->GetExpression(i), isolate); |
| if (value->IsTheHole()) continue; |
| - RETURN_IF_EMPTY_HANDLE_VALUE( |
| + RETURN_ON_EXCEPTION( |
| isolate, |
| Runtime::SetObjectProperty(isolate, target, name, value, NONE, SLOPPY), |
| - Handle<JSObject>()); |
| + JSObject); |
| } |
| return target; |
| @@ -11525,10 +11543,11 @@ static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate, |
| } |
| -static Handle<JSObject> MaterializeLocalContext(Isolate* isolate, |
| - Handle<JSObject> target, |
| - Handle<JSFunction> function, |
| - JavaScriptFrame* frame) { |
| +static MaybeHandle<JSObject> MaterializeLocalContext( |
| + Isolate* isolate, |
| + Handle<JSObject> target, |
| + Handle<JSFunction> function, |
| + JavaScriptFrame* frame) { |
| HandleScope scope(isolate); |
| Handle<SharedFunctionInfo> shared(function->shared()); |
| Handle<ScopeInfo> scope_info(shared->scope_info()); |
| @@ -11540,7 +11559,7 @@ static Handle<JSObject> MaterializeLocalContext(Isolate* isolate, |
| Handle<Context> function_context(frame_context->declaration_context()); |
| if (!ScopeInfo::CopyContextLocalsToScopeObject( |
| scope_info, function_context, target)) { |
| - return Handle<JSObject>(); |
| + return MaybeHandle<JSObject>(); |
| } |
| // Finally copy any properties from the function context extension. |
| @@ -11558,7 +11577,7 @@ static Handle<JSObject> MaterializeLocalContext(Isolate* isolate, |
| // Names of variables introduced by eval are strings. |
| ASSERT(keys->get(i)->IsString()); |
| Handle<String> key(String::cast(keys->get(i))); |
| - RETURN_IF_EMPTY_HANDLE_VALUE( |
| + RETURN_ON_EXCEPTION( |
| isolate, |
| Runtime::SetObjectProperty(isolate, |
| target, |
| @@ -11566,7 +11585,7 @@ static Handle<JSObject> MaterializeLocalContext(Isolate* isolate, |
| Object::GetPropertyOrElement(ext, key), |
| NONE, |
| SLOPPY), |
| - Handle<JSObject>()); |
| + JSObject); |
| } |
| } |
| } |
| @@ -11575,7 +11594,7 @@ static Handle<JSObject> MaterializeLocalContext(Isolate* isolate, |
| } |
| -static Handle<JSObject> MaterializeLocalScope( |
| +static MaybeHandle<JSObject> MaterializeLocalScope( |
| Isolate* isolate, |
| JavaScriptFrame* frame, |
| int inlined_jsframe_index) { |
| @@ -11584,9 +11603,11 @@ static Handle<JSObject> MaterializeLocalScope( |
| Handle<JSObject> local_scope = |
| isolate->factory()->NewJSObject(isolate->object_function()); |
| - local_scope = MaterializeStackLocalsWithFrameInspector( |
| - isolate, local_scope, function, &frame_inspector); |
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, local_scope, Handle<JSObject>()); |
| + ASSIGN_RETURN_ON_EXCEPTION( |
| + isolate, local_scope, |
| + MaterializeStackLocalsWithFrameInspector( |
| + isolate, local_scope, function, &frame_inspector), |
| + JSObject); |
| return MaterializeLocalContext(isolate, local_scope, function, frame); |
| } |
| @@ -11666,7 +11687,7 @@ static bool SetLocalVariableValue(Isolate* isolate, |
| // We don't expect this to do anything except replacing |
| // property value. |
| Runtime::SetObjectProperty(isolate, ext, variable_name, new_value, |
| - NONE, SLOPPY); |
| + NONE, SLOPPY).Assert(); |
| return true; |
| } |
| } |
| @@ -11679,8 +11700,8 @@ static bool SetLocalVariableValue(Isolate* isolate, |
| // Create a plain JSObject which materializes the closure content for the |
| // context. |
| -static Handle<JSObject> MaterializeClosure(Isolate* isolate, |
| - Handle<Context> context) { |
| +static MaybeHandle<JSObject> MaterializeClosure(Isolate* isolate, |
| + Handle<Context> context) { |
| ASSERT(context->IsFunctionContext()); |
| Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
| @@ -11694,7 +11715,7 @@ static Handle<JSObject> MaterializeClosure(Isolate* isolate, |
| // Fill all context locals to the context extension. |
| if (!ScopeInfo::CopyContextLocalsToScopeObject( |
| scope_info, context, closure_scope)) { |
| - return Handle<JSObject>(); |
| + return MaybeHandle<JSObject>(); |
| } |
| // Finally copy any properties from the function context extension. This will |
| @@ -11710,12 +11731,12 @@ static Handle<JSObject> MaterializeClosure(Isolate* isolate, |
| // Names of variables introduced by eval are strings. |
| ASSERT(keys->get(i)->IsString()); |
| Handle<String> key(String::cast(keys->get(i))); |
| - RETURN_IF_EMPTY_HANDLE_VALUE( |
| + RETURN_ON_EXCEPTION( |
| isolate, |
| Runtime::SetObjectProperty(isolate, closure_scope, key, |
| Object::GetPropertyOrElement(ext, key), |
| NONE, SLOPPY), |
| - Handle<JSObject>()); |
| + JSObject); |
| } |
| } |
| @@ -11746,7 +11767,7 @@ static bool SetClosureVariableValue(Isolate* isolate, |
| if (JSReceiver::HasProperty(ext, variable_name)) { |
| // We don't expect this to do anything except replacing property value. |
| Runtime::SetObjectProperty(isolate, ext, variable_name, new_value, |
| - NONE, SLOPPY); |
| + NONE, SLOPPY).Assert(); |
| return true; |
| } |
| } |
| @@ -11757,19 +11778,19 @@ static bool SetClosureVariableValue(Isolate* isolate, |
| // Create a plain JSObject which materializes the scope for the specified |
| // catch context. |
| -static Handle<JSObject> MaterializeCatchScope(Isolate* isolate, |
| - Handle<Context> context) { |
| +static MaybeHandle<JSObject> MaterializeCatchScope(Isolate* isolate, |
| + Handle<Context> context) { |
| ASSERT(context->IsCatchContext()); |
| Handle<String> name(String::cast(context->extension())); |
| Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), |
| isolate); |
| Handle<JSObject> catch_scope = |
| isolate->factory()->NewJSObject(isolate->object_function()); |
| - RETURN_IF_EMPTY_HANDLE_VALUE( |
| + RETURN_ON_EXCEPTION( |
| isolate, |
| Runtime::SetObjectProperty(isolate, catch_scope, name, thrown_object, |
| NONE, SLOPPY), |
| - Handle<JSObject>()); |
| + JSObject); |
| return catch_scope; |
| } |
| @@ -11790,7 +11811,7 @@ static bool SetCatchVariableValue(Isolate* isolate, |
| // Create a plain JSObject which materializes the block scope for the specified |
| // block context. |
| -static Handle<JSObject> MaterializeBlockScope( |
| +static MaybeHandle<JSObject> MaterializeBlockScope( |
| Isolate* isolate, |
| Handle<Context> context) { |
| ASSERT(context->IsBlockContext()); |
| @@ -11804,7 +11825,7 @@ static Handle<JSObject> MaterializeBlockScope( |
| // Fill all context locals. |
| if (!ScopeInfo::CopyContextLocalsToScopeObject( |
| scope_info, context, block_scope)) { |
| - return Handle<JSObject>(); |
| + return MaybeHandle<JSObject>(); |
| } |
| return block_scope; |
| @@ -11813,7 +11834,7 @@ static Handle<JSObject> MaterializeBlockScope( |
| // Create a plain JSObject which materializes the module scope for the specified |
| // module context. |
| -static Handle<JSObject> MaterializeModuleScope( |
| +static MaybeHandle<JSObject> MaterializeModuleScope( |
| Isolate* isolate, |
| Handle<Context> context) { |
| ASSERT(context->IsModuleContext()); |
| @@ -11827,7 +11848,7 @@ static Handle<JSObject> MaterializeModuleScope( |
| // Fill all context locals. |
| if (!ScopeInfo::CopyContextLocalsToScopeObject( |
| scope_info, context, module_scope)) { |
| - return Handle<JSObject>(); |
| + return MaybeHandle<JSObject>(); |
| } |
| return module_scope; |
| @@ -12037,7 +12058,7 @@ class ScopeIterator { |
| } |
| // Return the JavaScript object with the content of the current scope. |
| - Handle<JSObject> ScopeObject() { |
| + MaybeHandle<JSObject> ScopeObject() { |
| ASSERT(!failed_); |
| switch (Type()) { |
| case ScopeIterator::ScopeTypeGlobal: |
| @@ -12314,7 +12335,7 @@ static const int kScopeDetailsObjectIndex = 1; |
| static const int kScopeDetailsSize = 2; |
| -static Handle<JSObject> MaterializeScopeDetails(Isolate* isolate, |
| +static MaybeHandle<JSObject> MaterializeScopeDetails(Isolate* isolate, |
| ScopeIterator* it) { |
| // Calculate the size of the result. |
| int details_size = kScopeDetailsSize; |
| @@ -12322,8 +12343,9 @@ static Handle<JSObject> MaterializeScopeDetails(Isolate* isolate, |
| // Fill in scope details. |
| details->set(kScopeDetailsTypeIndex, Smi::FromInt(it->Type())); |
| - Handle<JSObject> scope_object = it->ScopeObject(); |
| - RETURN_IF_EMPTY_HANDLE_VALUE(isolate, scope_object, Handle<JSObject>()); |
| + Handle<JSObject> scope_object; |
| + ASSIGN_RETURN_ON_EXCEPTION( |
| + isolate, scope_object, it->ScopeObject(), JSObject); |
| details->set(kScopeDetailsObjectIndex, *scope_object); |
| return isolate->factory()->NewJSArrayWithElements(details); |
| @@ -12367,8 +12389,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) { |
| if (it.Done()) { |
| return isolate->heap()->undefined_value(); |
| } |
| - Handle<JSObject> details = MaterializeScopeDetails(isolate, &it); |
| - RETURN_IF_EMPTY_HANDLE(isolate, details); |
| + Handle<JSObject> details; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, details, MaterializeScopeDetails(isolate, &it)); |
| return *details; |
| } |
| @@ -12409,8 +12432,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetAllScopesDetails) { |
| List<Handle<JSObject> > result(4); |
| ScopeIterator it(isolate, frame, inlined_jsframe_index, ignore_nested_scopes); |
| for (; !it.Done(); it.Next()) { |
| - Handle<JSObject> details = MaterializeScopeDetails(isolate, &it); |
| - RETURN_IF_EMPTY_HANDLE(isolate, details); |
| + Handle<JSObject> details; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, details, MaterializeScopeDetails(isolate, &it)); |
| result.Add(details); |
| } |
| @@ -12457,7 +12481,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionScopeDetails) { |
| return isolate->heap()->undefined_value(); |
| } |
| - Handle<JSObject> details = MaterializeScopeDetails(isolate, &it); |
| + Handle<JSObject> details; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, details, MaterializeScopeDetails(isolate, &it)); |
| RETURN_IF_EMPTY_HANDLE(isolate, details); |
| return *details; |
| } |
| @@ -12837,7 +12863,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearStepping) { |
| // Helper function to find or create the arguments object for |
| // Runtime_DebugEvaluate. |
| -static Handle<JSObject> MaterializeArgumentsObject( |
| +static MaybeHandle<JSObject> MaterializeArgumentsObject( |
| Isolate* isolate, |
| Handle<JSObject> target, |
| Handle<JSFunction> function) { |
| @@ -12852,11 +12878,12 @@ static Handle<JSObject> MaterializeArgumentsObject( |
| // FunctionGetArguments can't throw an exception. |
| Handle<JSObject> arguments = Handle<JSObject>::cast( |
| Accessors::FunctionGetArguments(function)); |
| - Runtime::SetObjectProperty(isolate, target, |
| - isolate->factory()->arguments_string(), |
| - arguments, |
| - ::NONE, |
| - SLOPPY); |
| + Handle<String> arguments_str = isolate->factory()->arguments_string(); |
| + RETURN_ON_EXCEPTION( |
| + isolate, |
| + Runtime::SetObjectProperty( |
| + isolate, target, arguments_str, arguments, ::NONE, SLOPPY), |
| + JSObject); |
| return target; |
| } |
| @@ -12946,12 +12973,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { |
| Handle<JSObject> materialized = |
| isolate->factory()->NewJSObject(isolate->object_function()); |
| - materialized = MaterializeStackLocalsWithFrameInspector( |
| - isolate, materialized, function, &frame_inspector); |
| - RETURN_IF_EMPTY_HANDLE(isolate, materialized); |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, materialized, |
| + MaterializeStackLocalsWithFrameInspector( |
| + isolate, materialized, function, &frame_inspector)); |
| - materialized = MaterializeArgumentsObject(isolate, materialized, function); |
| - RETURN_IF_EMPTY_HANDLE(isolate, materialized); |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, materialized, |
| + MaterializeArgumentsObject(isolate, materialized, function)); |
| // Add the materialized object in a with-scope to shadow the stack locals. |
| context = isolate->factory()->NewWithContext(function, context, materialized); |