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

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

Issue 1961963002: [debugger] make strict eval-scope visible to debugging. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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
Index: src/debug/debug-scopes.cc
diff --git a/src/debug/debug-scopes.cc b/src/debug/debug-scopes.cc
index 7c6f944335baa6341fe3809b461fd4fab70fad31..b8546b1409d3a5b801e506c339aa5e26056061e7 100644
--- a/src/debug/debug-scopes.cc
+++ b/src/debug/debug-scopes.cc
@@ -5,6 +5,7 @@
#include "src/debug/debug-scopes.h"
#include "src/ast/scopes.h"
+#include "src/compiler.h"
#include "src/debug/debug.h"
#include "src/frames-inl.h"
#include "src/globals.h"
@@ -80,34 +81,29 @@ ScopeIterator::ScopeIterator(Isolate* isolate, FrameInspector* frame_inspector,
}
// Reparse the code and analyze the scopes.
- Scope* scope = NULL;
// Check whether we are in global, eval or function code.
Zone zone(isolate->allocator());
+ base::SmartPointer<ParseInfo> info;
if (scope_info->scope_type() != FUNCTION_SCOPE) {
// Global or eval code.
Handle<Script> script(Script::cast(shared_info->script()));
- ParseInfo info(&zone, script);
+ info.Reset(new ParseInfo(&zone, script));
+ info->set_toplevel();
if (scope_info->scope_type() == SCRIPT_SCOPE) {
- info.set_global();
+ info->set_global();
} else {
DCHECK(scope_info->scope_type() == EVAL_SCOPE);
- info.set_eval();
- info.set_context(Handle<Context>(function->context()));
- }
- if (Parser::ParseStatic(&info) && Scope::Analyze(&info)) {
- scope = info.literal()->scope();
+ info->set_eval();
+ info->set_context(Handle<Context>(function->context()));
}
- if (!ignore_nested_scopes) RetrieveScopeChain(scope);
- if (collect_non_locals) CollectNonLocals(scope);
} else {
- // Function code
- ParseInfo info(&zone, function);
- if (Parser::ParseStatic(&info) && Scope::Analyze(&info)) {
- scope = info.literal()->scope();
- }
- if (!ignore_nested_scopes) RetrieveScopeChain(scope);
- if (collect_non_locals) CollectNonLocals(scope);
+ // Inner function.
+ info.Reset(new ParseInfo(&zone, function));
}
+ Scope* scope = NULL;
+ if (Compiler::ParseAndAnalyze(info.get())) scope = info->literal()->scope();
+ if (!ignore_nested_scopes) RetrieveScopeChain(scope);
+ if (collect_non_locals) CollectNonLocals(scope);
UnwrapEvaluationContext();
}
@@ -236,7 +232,8 @@ ScopeIterator::ScopeType ScopeIterator::Type() {
DCHECK(!scope_info->HasContext() || context_->IsBlockContext());
return ScopeTypeBlock;
case EVAL_SCOPE:
- UNREACHABLE();
+ DCHECK(!scope_info->HasContext() || context_->IsFunctionContext());
+ return ScopeTypeEval;
jgruber1 2016/05/11 08:38:06 Should we add a default clause here or alternative
Yang 2016/05/11 11:37:23 The compiler would fail if the switch does not lis
}
}
if (context_->IsNativeContext()) {
@@ -284,7 +281,8 @@ MaybeHandle<JSObject> ScopeIterator::ScopeObject() {
// Materialize the content of the closure scope into a JSObject.
return MaterializeClosure();
case ScopeIterator::ScopeTypeBlock:
- return MaterializeBlockScope();
+ case ScopeIterator::ScopeTypeEval:
+ return MaterializeInnerScope();
case ScopeIterator::ScopeTypeModule:
return MaterializeModuleScope();
}
@@ -295,7 +293,8 @@ MaybeHandle<JSObject> ScopeIterator::ScopeObject() {
bool ScopeIterator::HasContext() {
ScopeType type = Type();
- if (type == ScopeTypeBlock || type == ScopeTypeLocal) {
+ if (type == ScopeTypeBlock || type == ScopeTypeLocal ||
+ type == ScopeTypeEval) {
if (!nested_scope_chain_.is_empty()) {
return nested_scope_chain_.last().scope_info->HasContext();
}
@@ -321,7 +320,8 @@ bool ScopeIterator::SetVariableValue(Handle<String> variable_name,
case ScopeIterator::ScopeTypeScript:
return SetScriptVariableValue(variable_name, new_value);
case ScopeIterator::ScopeTypeBlock:
- return SetBlockVariableValue(variable_name, new_value);
+ case ScopeIterator::ScopeTypeEval:
+ return SetInnerScopeVariableValue(variable_name, new_value);
case ScopeIterator::ScopeTypeModule:
// TODO(2399): should we implement it?
break;
@@ -482,19 +482,16 @@ MaybeHandle<JSObject> ScopeIterator::MaterializeLocalScope() {
if (!scope_info->HasContext()) return local_scope;
- // Third fill all context locals.
+ // Fill all context locals.
Handle<Context> function_context(frame_context->closure_context());
CopyContextLocalsToScopeObject(scope_info, function_context, local_scope);
// Finally copy any properties from the function context extension.
// These will be variables introduced by eval.
if (function_context->closure() == *function &&
- function_context->has_extension() &&
!function_context->IsNativeContext()) {
- bool success = CopyContextExtensionToScopeObject(
- handle(function_context->extension_object(), isolate_), local_scope,
- INCLUDE_PROTOS);
- if (!success) return MaybeHandle<JSObject>();
+ CopyContextExtensionToScopeObject(function_context, local_scope,
+ INCLUDE_PROTOS);
}
return local_scope;
@@ -520,12 +517,7 @@ Handle<JSObject> ScopeIterator::MaterializeClosure() {
// Finally copy any properties from the function context extension. This will
// be variables introduced by eval.
- if (context->has_extension()) {
- bool success = CopyContextExtensionToScopeObject(
- handle(context->extension_object(), isolate_), closure_scope, OWN_ONLY);
- DCHECK(success);
- USE(success);
- }
+ CopyContextExtensionToScopeObject(context, closure_scope, OWN_ONLY);
return closure_scope;
}
@@ -560,14 +552,14 @@ Handle<JSObject> ScopeIterator::WithContextExtension() {
// Create a plain JSObject which materializes the block scope for the specified
// block context.
-Handle<JSObject> ScopeIterator::MaterializeBlockScope() {
- Handle<JSObject> block_scope =
+Handle<JSObject> ScopeIterator::MaterializeInnerScope() {
+ Handle<JSObject> inner_scope =
isolate_->factory()->NewJSObjectWithNullProto();
Handle<Context> context = Handle<Context>::null();
if (!nested_scope_chain_.is_empty()) {
Handle<ScopeInfo> scope_info = nested_scope_chain_.last().scope_info;
- frame_inspector_->MaterializeStackLocals(block_scope, scope_info);
+ frame_inspector_->MaterializeStackLocals(inner_scope, scope_info);
if (scope_info->HasContext()) context = CurrentContext();
} else {
context = CurrentContext();
@@ -575,17 +567,10 @@ Handle<JSObject> ScopeIterator::MaterializeBlockScope() {
if (!context.is_null()) {
// Fill all context locals.
- CopyContextLocalsToScopeObject(handle(context->scope_info()),
- context, block_scope);
- // Fill all extension variables.
- if (context->extension_object() != nullptr) {
- bool success = CopyContextExtensionToScopeObject(
- handle(context->extension_object()), block_scope, OWN_ONLY);
- DCHECK(success);
- USE(success);
- }
+ CopyContextLocalsToScopeObject(CurrentScopeInfo(), context, inner_scope);
+ CopyContextExtensionToScopeObject(context, inner_scope, OWN_ONLY);
}
- return block_scope;
+ return inner_scope;
}
@@ -695,9 +680,11 @@ bool ScopeIterator::SetLocalVariableValue(Handle<String> variable_name,
return result;
}
-bool ScopeIterator::SetBlockVariableValue(Handle<String> variable_name,
- Handle<Object> new_value) {
+bool ScopeIterator::SetInnerScopeVariableValue(Handle<String> variable_name,
+ Handle<Object> new_value) {
Handle<ScopeInfo> scope_info = CurrentScopeInfo();
+ DCHECK(scope_info->scope_type() == BLOCK_SCOPE ||
+ scope_info->scope_type() == EVAL_SCOPE);
JavaScriptFrame* frame = GetFrame();
// Setting stack locals of optimized frames is not supported.
@@ -772,31 +759,29 @@ void ScopeIterator::CopyContextLocalsToScopeObject(
}
}
-bool ScopeIterator::CopyContextExtensionToScopeObject(
- Handle<JSObject> extension, Handle<JSObject> scope_object,
+void ScopeIterator::CopyContextExtensionToScopeObject(
+ Handle<Context> context, Handle<JSObject> scope_object,
KeyCollectionType type) {
- Handle<FixedArray> keys;
- ASSIGN_RETURN_ON_EXCEPTION_VALUE(
- isolate_, keys, JSReceiver::GetKeys(extension, type, ENUMERABLE_STRINGS),
- false);
+ if (!context->has_extension()) return;
+ Handle<JSObject> extension(context->extension_object());
+ Handle<FixedArray> keys =
+ JSReceiver::GetKeys(extension, type, ENUMERABLE_STRINGS)
+ .ToHandleChecked();
for (int i = 0; i < keys->length(); i++) {
// Names of variables introduced by eval are strings.
DCHECK(keys->get(i)->IsString());
Handle<String> key(String::cast(keys->get(i)));
- Handle<Object> value;
- ASSIGN_RETURN_ON_EXCEPTION_VALUE(
- isolate_, value, Object::GetPropertyOrElement(extension, key), false);
- RETURN_ON_EXCEPTION_VALUE(
- isolate_, JSObject::SetOwnPropertyIgnoreAttributes(
- scope_object, key, value, NONE), false);
+ Handle<Object> value =
+ Object::GetPropertyOrElement(extension, key).ToHandleChecked();
+ JSObject::SetOwnPropertyIgnoreAttributes(scope_object, key, value, NONE)
+ .Check();
}
- return true;
}
void ScopeIterator::GetNestedScopeChain(Isolate* isolate, Scope* scope,
int position) {
- if (!scope->is_eval_scope() && !scope->is_hidden()) {
+ if (!scope->is_hidden()) {
nested_scope_chain_.Add(ExtendedScopeInfo(scope->GetScopeInfo(isolate),
scope->start_position(),
scope->end_position()));
« no previous file with comments | « src/debug/debug-scopes.h ('k') | src/debug/mirrors.js » ('j') | src/debug/mirrors.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698