Index: src/debug/debug-scopes.h |
diff --git a/src/debug/debug-scopes.h b/src/debug/debug-scopes.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0247cc4bcecfd77bd60e85e1a7920d10f855639f |
--- /dev/null |
+++ b/src/debug/debug-scopes.h |
@@ -0,0 +1,126 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_DEBUG_DEBUG_SCOPES_H_ |
+#define V8_DEBUG_DEBUG_SCOPES_H_ |
+ |
+#include "src/debug/debug-frames.h" |
+#include "src/frames.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+// Iterate over the actual scopes visible from a stack frame or from a closure. |
+// The iteration proceeds from the innermost visible nested scope outwards. |
+// All scopes are backed by an actual context except the local scope, |
+// which is inserted "artificially" in the context chain. |
+class ScopeIterator { |
+ public: |
+ enum ScopeType { |
+ ScopeTypeGlobal = 0, |
+ ScopeTypeLocal, |
+ ScopeTypeWith, |
+ ScopeTypeClosure, |
+ ScopeTypeCatch, |
+ ScopeTypeBlock, |
+ ScopeTypeScript, |
+ ScopeTypeModule |
+ }; |
+ |
+ static const int kScopeDetailsTypeIndex = 0; |
+ static const int kScopeDetailsObjectIndex = 1; |
+ static const int kScopeDetailsSize = 2; |
+ |
+ ScopeIterator(Isolate* isolate, FrameInspector* frame_inspector, |
+ bool ignore_nested_scopes = false); |
+ |
+ ScopeIterator(Isolate* isolate, Handle<JSFunction> function); |
+ |
+ MUST_USE_RESULT MaybeHandle<JSObject> MaterializeScopeDetails(); |
+ |
+ // More scopes? |
+ bool Done() { |
+ DCHECK(!failed_); |
+ return context_.is_null(); |
+ } |
+ |
+ bool Failed() { return failed_; } |
+ |
+ // Move to the next scope. |
+ void Next(); |
+ |
+ // Return the type of the current scope. |
+ ScopeType Type(); |
+ |
+ // Return the JavaScript object with the content of the current scope. |
+ MaybeHandle<JSObject> ScopeObject(); |
+ |
+ bool HasContext(); |
+ |
+ // Set variable value and return true on success. |
+ bool SetVariableValue(Handle<String> variable_name, Handle<Object> new_value); |
+ |
+ Handle<ScopeInfo> CurrentScopeInfo(); |
+ |
+ // Return the context for this scope. For the local context there might not |
+ // be an actual context. |
+ Handle<Context> CurrentContext(); |
+ |
+#ifdef DEBUG |
+ // Debug print of the content of the current scope. |
+ void DebugPrint(); |
+#endif |
+ |
+ private: |
+ Isolate* isolate_; |
+ FrameInspector* const frame_inspector_; |
+ Handle<Context> context_; |
+ List<Handle<ScopeInfo> > nested_scope_chain_; |
+ bool seen_script_scope_; |
+ bool failed_; |
+ |
+ inline JavaScriptFrame* GetFrame() { |
+ return frame_inspector_->GetArgumentsFrame(); |
+ } |
+ |
+ inline Handle<JSFunction> GetFunction() { |
+ return Handle<JSFunction>( |
+ JSFunction::cast(frame_inspector_->GetFunction())); |
+ } |
+ |
+ void RetrieveScopeChain(Scope* scope, Handle<SharedFunctionInfo> shared_info); |
+ |
+ MUST_USE_RESULT MaybeHandle<JSObject> MaterializeScriptScope(); |
+ MUST_USE_RESULT MaybeHandle<JSObject> MaterializeLocalScope(); |
+ MUST_USE_RESULT MaybeHandle<JSObject> MaterializeModuleScope(); |
+ Handle<JSObject> MaterializeClosure(); |
+ Handle<JSObject> MaterializeCatchScope(); |
+ Handle<JSObject> MaterializeBlockScope(); |
+ |
+ bool SetLocalVariableValue(Handle<String> variable_name, |
+ Handle<Object> new_value); |
+ bool SetBlockVariableValue(Handle<String> variable_name, |
+ Handle<Object> new_value); |
+ bool SetClosureVariableValue(Handle<String> variable_name, |
+ Handle<Object> new_value); |
+ bool SetScriptVariableValue(Handle<String> variable_name, |
+ Handle<Object> new_value); |
+ bool SetCatchVariableValue(Handle<String> variable_name, |
+ Handle<Object> new_value); |
+ bool SetContextLocalValue(Handle<ScopeInfo> scope_info, |
+ Handle<Context> context, |
+ Handle<String> variable_name, |
+ Handle<Object> new_value); |
+ |
+ void CopyContextLocalsToScopeObject(Handle<ScopeInfo> scope_info, |
+ Handle<Context> context, |
+ Handle<JSObject> scope_object); |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); |
+}; |
+ |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_DEBUG_DEBUG_SCOPES_H_ |