Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Unified Diff: src/debug/debug-scopes.cc

Issue 1961833002: [debugger] refactor debug-scopes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: address comment Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/debug/debug-scopes.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « src/debug/debug-scopes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698