Index: src/debug/debug-scopes.cc |
diff --git a/src/debug/debug-scopes.cc b/src/debug/debug-scopes.cc |
index 76beed3b9e54f0d8493dce38b0889704d578b048..7c6f944335baa6341fe3809b461fd4fab70fad31 100644 |
--- a/src/debug/debug-scopes.cc |
+++ b/src/debug/debug-scopes.cc |
@@ -607,12 +607,43 @@ MaybeHandle<JSObject> ScopeIterator::MaterializeModuleScope() { |
return module_scope; |
} |
+bool ScopeIterator::SetParameterValue(Handle<ScopeInfo> scope_info, |
+ JavaScriptFrame* frame, |
+ Handle<String> parameter_name, |
+ Handle<Object> new_value) { |
+ // Setting stack locals of optimized frames is not supported. |
+ if (frame->is_optimized()) return false; |
+ HandleScope scope(isolate_); |
+ for (int i = 0; i < scope_info->ParameterCount(); ++i) { |
+ if (String::Equals(handle(scope_info->ParameterName(i)), parameter_name)) { |
+ frame->SetParameterValue(i, *new_value); |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+bool ScopeIterator::SetStackVariableValue(Handle<ScopeInfo> scope_info, |
+ JavaScriptFrame* frame, |
+ Handle<String> variable_name, |
+ Handle<Object> new_value) { |
+ // Setting stack locals of optimized frames is not supported. |
+ if (frame->is_optimized()) return false; |
+ HandleScope scope(isolate_); |
+ for (int i = 0; i < scope_info->StackLocalCount(); ++i) { |
+ if (String::Equals(handle(scope_info->StackLocalName(i)), variable_name)) { |
+ frame->SetExpression(scope_info->StackLocalIndex(i), *new_value); |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
-// Set the context local variable value. |
-bool ScopeIterator::SetContextLocalValue(Handle<ScopeInfo> scope_info, |
- Handle<Context> context, |
- Handle<String> variable_name, |
- Handle<Object> new_value) { |
+bool ScopeIterator::SetContextVariableValue(Handle<ScopeInfo> scope_info, |
+ Handle<Context> context, |
+ Handle<String> variable_name, |
+ Handle<Object> new_value) { |
+ HandleScope scope(isolate_); |
for (int i = 0; i < scope_info->ContextLocalCount(); i++) { |
Handle<String> next_name(scope_info->ContextLocalName(i)); |
if (String::Equals(variable_name, next_name)) { |
@@ -626,143 +657,70 @@ bool ScopeIterator::SetContextLocalValue(Handle<ScopeInfo> scope_info, |
} |
} |
+ if (context->has_extension()) { |
+ Handle<JSObject> ext(context->extension_object()); |
+ Maybe<bool> maybe = JSReceiver::HasOwnProperty(ext, variable_name); |
+ DCHECK(maybe.IsJust()); |
+ if (maybe.FromJust()) { |
+ // We don't expect this to do anything except replacing property value. |
+ JSObject::SetOwnPropertyIgnoreAttributes(ext, variable_name, new_value, |
+ NONE) |
+ .Check(); |
+ return true; |
+ } |
+ } |
+ |
return false; |
} |
- |
bool ScopeIterator::SetLocalVariableValue(Handle<String> variable_name, |
Handle<Object> new_value) { |
JavaScriptFrame* frame = GetFrame(); |
- // Optimized frames are not supported. |
- if (frame->is_optimized()) return false; |
- |
- Handle<JSFunction> function(frame->function()); |
- Handle<SharedFunctionInfo> shared(function->shared()); |
- Handle<ScopeInfo> scope_info(shared->scope_info()); |
- |
- bool default_result = false; |
+ Handle<ScopeInfo> scope_info(frame->function()->shared()->scope_info()); |
- // Parameters. |
- for (int i = 0; i < scope_info->ParameterCount(); ++i) { |
- HandleScope scope(isolate_); |
- if (String::Equals(handle(scope_info->ParameterName(i)), variable_name)) { |
- frame->SetParameterValue(i, *new_value); |
- // Argument might be shadowed in heap context, don't stop here. |
- default_result = true; |
- } |
- } |
+ // Parameter might be shadowed in context. Don't stop here. |
+ bool result = SetParameterValue(scope_info, frame, variable_name, new_value); |
// Stack locals. |
- for (int i = 0; i < scope_info->StackLocalCount(); ++i) { |
- HandleScope scope(isolate_); |
- if (String::Equals(handle(scope_info->StackLocalName(i)), variable_name)) { |
- frame->SetExpression(scope_info->StackLocalIndex(i), *new_value); |
- return true; |
- } |
+ if (SetStackVariableValue(scope_info, frame, variable_name, new_value)) { |
+ return true; |
} |
- if (scope_info->HasContext()) { |
- // Context locals. |
- Handle<Context> frame_context(Context::cast(frame->context())); |
- Handle<Context> function_context(frame_context->declaration_context()); |
- if (SetContextLocalValue(scope_info, function_context, variable_name, |
- new_value)) { |
- return true; |
- } |
- |
- // Function context extension. These are variables introduced by eval. |
- if (function_context->closure() == *function) { |
- if (function_context->has_extension() && |
- !function_context->IsNativeContext()) { |
- Handle<JSObject> ext(function_context->extension_object()); |
- |
- Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name); |
- DCHECK(maybe.IsJust()); |
- if (maybe.FromJust()) { |
- // We don't expect this to do anything except replacing |
- // property value. |
- Runtime::SetObjectProperty(isolate_, ext, variable_name, new_value, |
- SLOPPY) |
- .Assert(); |
- return true; |
- } |
- } |
- } |
+ if (scope_info->HasContext() && |
+ SetContextVariableValue(scope_info, CurrentContext(), variable_name, |
+ new_value)) { |
+ return true; |
} |
- return default_result; |
+ return result; |
} |
- |
bool ScopeIterator::SetBlockVariableValue(Handle<String> variable_name, |
Handle<Object> new_value) { |
Handle<ScopeInfo> scope_info = CurrentScopeInfo(); |
JavaScriptFrame* frame = GetFrame(); |
- for (int i = 0; i < scope_info->StackLocalCount(); ++i) { |
- HandleScope scope(isolate_); |
- if (String::Equals(handle(scope_info->StackLocalName(i)), variable_name)) { |
- frame->SetExpression(scope_info->StackLocalIndex(i), *new_value); |
- return true; |
- } |
+ // Setting stack locals of optimized frames is not supported. |
+ if (SetStackVariableValue(scope_info, frame, variable_name, new_value)) { |
+ return true; |
} |
- if (HasContext()) { |
- Handle<Context> context = CurrentContext(); |
- if (SetContextLocalValue(scope_info, context, variable_name, new_value)) { |
- return true; |
- } |
- |
- Handle<JSObject> ext(context->extension_object(), isolate_); |
- if (!ext.is_null()) { |
- Maybe<bool> maybe = JSReceiver::HasOwnProperty(ext, variable_name); |
- DCHECK(maybe.IsJust()); |
- if (maybe.FromJust()) { |
- // We don't expect this to do anything except replacing property value. |
- JSObject::SetOwnPropertyIgnoreAttributes(ext, variable_name, new_value, |
- NONE) |
- .Check(); |
- return true; |
- } |
- } |
+ if (HasContext() && SetContextVariableValue(scope_info, CurrentContext(), |
+ variable_name, new_value)) { |
+ return true; |
} |
return false; |
} |
- |
// This method copies structure of MaterializeClosure method above. |
bool ScopeIterator::SetClosureVariableValue(Handle<String> variable_name, |
Handle<Object> new_value) { |
- Handle<Context> context = CurrentContext(); |
- DCHECK(context->IsFunctionContext()); |
- |
- // Context locals to the context extension. |
- Handle<SharedFunctionInfo> shared(context->closure()->shared()); |
- Handle<ScopeInfo> scope_info(shared->scope_info()); |
- if (SetContextLocalValue(scope_info, context, variable_name, new_value)) { |
- return true; |
- } |
- |
- // Properties from the function context extension. This will |
- // be variables introduced by eval. |
- if (context->has_extension()) { |
- Handle<JSObject> ext(JSObject::cast(context->extension_object())); |
- Maybe<bool> maybe = JSReceiver::HasOwnProperty(ext, variable_name); |
- DCHECK(maybe.IsJust()); |
- if (maybe.FromJust()) { |
- // We don't expect this to do anything except replacing property value. |
- JSObject::SetOwnPropertyIgnoreAttributes(ext, variable_name, new_value, |
- NONE) |
- .Check(); |
- return true; |
- } |
- } |
- |
- return false; |
+ DCHECK(CurrentContext()->IsFunctionContext()); |
+ return SetContextVariableValue(CurrentScopeInfo(), CurrentContext(), |
+ variable_name, new_value); |
} |
- |
bool ScopeIterator::SetScriptVariableValue(Handle<String> variable_name, |
Handle<Object> new_value) { |
Handle<Context> context = CurrentContext(); |
@@ -780,7 +738,6 @@ bool ScopeIterator::SetScriptVariableValue(Handle<String> variable_name, |
return false; |
} |
- |
bool ScopeIterator::SetCatchVariableValue(Handle<String> variable_name, |
Handle<Object> new_value) { |
Handle<Context> context = CurrentContext(); |