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

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

Issue 1500933002: [debugger] fix debug-evaluate wrt shadowed context var. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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/ast/scopeinfo.cc ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/debug/debug-evaluate.cc
diff --git a/src/debug/debug-evaluate.cc b/src/debug/debug-evaluate.cc
index 65bbc3fe50e134c06c2917e0014dc1afd8a80989..c08ea58c2579097864d9e36252a4f07b57d20604 100644
--- a/src/debug/debug-evaluate.cc
+++ b/src/debug/debug-evaluate.cc
@@ -271,6 +271,23 @@ void DebugEvaluate::ContextBuilder::MaterializeArgumentsObject(
}
+// Iterate the context chain until a function context of a non-arrow function.
+// Return whether that function context-allocates the receiver.
+bool HasContextAllocatedReceiver(Context* context) {
+ DisallowHeapAllocation no_gc;
+ while (!context->IsNativeContext() && !context->IsScriptContext()) {
Michael Starzinger 2015/12/07 10:42:57 This iteration seems to walk the context chain unt
+ ScopeInfo* scope_info = context->closure()->shared()->scope_info();
+ if (scope_info->HasReceiver()) {
+ // Normal function. If the receiver is not context-allocated, we won't be
+ // able to find the correct receiver value.
+ return scope_info->HasContextAllocatedReceiver();
+ }
+ context = context->previous();
+ }
+ return false;
+}
+
+
Handle<Context> DebugEvaluate::ContextBuilder::MaterializeReceiver(
Handle<Context> target, Handle<JSFunction> function) {
Handle<SharedFunctionInfo> shared(function->shared());
@@ -278,18 +295,21 @@ Handle<Context> DebugEvaluate::ContextBuilder::MaterializeReceiver(
Handle<Object> receiver;
switch (scope_info->scope_type()) {
case FUNCTION_SCOPE: {
- VariableMode mode;
- InitializationFlag init_flag;
- MaybeAssignedFlag maybe_assigned_flag;
-
- // Don't bother creating a fake context node if "this" is in the context
- // already.
- if (ScopeInfo::ContextSlotIndex(scope_info,
- isolate_->factory()->this_string(), &mode,
- &init_flag, &maybe_assigned_flag) >= 0) {
- return target;
+ // Use existing context if it already includes "this".
+ if (scope_info->ReceiverContextSlotIndex() >= 0) return target;
+ if (!scope_info->HasReceiver()) {
+ // Arrow functions do not have an own receiver. It is resolved like any
+ // other variable from outer scopes. If it's not context-allocated in
+ // outer contexts, we cannot find its value. In that case, prevent
+ // resolving to the incorrect "this" by defaulting to undefined.
+ if (HasContextAllocatedReceiver(*target)) {
+ return target;
+ } else {
+ receiver = isolate_->factory()->undefined_value();
+ }
+ } else {
+ receiver = handle(frame_->receiver(), isolate_);
}
- receiver = handle(frame_->receiver(), isolate_);
break;
}
case MODULE_SCOPE:
@@ -299,8 +319,7 @@ Handle<Context> DebugEvaluate::ContextBuilder::MaterializeReceiver(
receiver = handle(function->global_proxy(), isolate_);
break;
default:
- // For eval code, arrow functions, and the like, there's no "this" binding
- // to materialize.
+ // For eval code, there's no "this" binding to materialize.
return target;
}
« no previous file with comments | « src/ast/scopeinfo.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698