LCOV - code coverage report
Current view: top level - src/debug - debug-scopes.h (source / functions) Hit Total Coverage
Test: app.info Lines: 1 1 100.0 %
Date: 2019-01-20 Functions: 1 1 100.0 %

          Line data    Source code
       1             : // Copyright 2015 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_DEBUG_DEBUG_SCOPES_H_
       6             : #define V8_DEBUG_DEBUG_SCOPES_H_
       7             : 
       8             : #include <vector>
       9             : 
      10             : #include "src/debug/debug-frames.h"
      11             : #include "src/frames.h"
      12             : 
      13             : namespace v8 {
      14             : namespace internal {
      15             : 
      16             : class ParseInfo;
      17             : 
      18             : // Iterate over the actual scopes visible from a stack frame or from a closure.
      19             : // The iteration proceeds from the innermost visible nested scope outwards.
      20             : // All scopes are backed by an actual context except the local scope,
      21             : // which is inserted "artificially" in the context chain.
      22             : class ScopeIterator {
      23             :  public:
      24             :   enum ScopeType {
      25             :     ScopeTypeGlobal = 0,
      26             :     ScopeTypeLocal,
      27             :     ScopeTypeWith,
      28             :     ScopeTypeClosure,
      29             :     ScopeTypeCatch,
      30             :     ScopeTypeBlock,
      31             :     ScopeTypeScript,
      32             :     ScopeTypeEval,
      33             :     ScopeTypeModule
      34             :   };
      35             : 
      36             :   static const int kScopeDetailsTypeIndex = 0;
      37             :   static const int kScopeDetailsObjectIndex = 1;
      38             :   static const int kScopeDetailsNameIndex = 2;
      39             :   static const int kScopeDetailsStartPositionIndex = 3;
      40             :   static const int kScopeDetailsEndPositionIndex = 4;
      41             :   static const int kScopeDetailsFunctionIndex = 5;
      42             :   static const int kScopeDetailsSize = 6;
      43             : 
      44             :   enum Option { DEFAULT, IGNORE_NESTED_SCOPES, COLLECT_NON_LOCALS };
      45             : 
      46             :   ScopeIterator(Isolate* isolate, FrameInspector* frame_inspector,
      47             :                 Option options = DEFAULT);
      48             : 
      49             :   ScopeIterator(Isolate* isolate, Handle<JSFunction> function);
      50             :   ScopeIterator(Isolate* isolate, Handle<JSGeneratorObject> generator);
      51             :   ~ScopeIterator();
      52             : 
      53             :   Handle<JSObject> MaterializeScopeDetails();
      54             : 
      55             :   // More scopes?
      56        6480 :   bool Done() const { return context_.is_null(); }
      57             : 
      58             :   // Move to the next scope.
      59             :   void Next();
      60             : 
      61             :   // Restart to the first scope and context.
      62             :   void Restart();
      63             : 
      64             :   // Return the type of the current scope.
      65             :   ScopeType Type() const;
      66             : 
      67             :   // Indicates which variables should be visited. Either only variables from the
      68             :   // scope that are available on the stack, or all variables.
      69             :   enum class Mode { STACK, ALL };
      70             : 
      71             :   // Return the JavaScript object with the content of the current scope.
      72             :   Handle<JSObject> ScopeObject(Mode mode);
      73             : 
      74             :   // Returns whether the current scope declares any variables.
      75             :   bool DeclaresLocals(Mode mode) const;
      76             : 
      77             :   // Set variable value and return true on success.
      78             :   bool SetVariableValue(Handle<String> variable_name, Handle<Object> new_value);
      79             : 
      80             :   // Populate the set with collected non-local variable names.
      81             :   Handle<StringSet> GetNonLocals();
      82             : 
      83             :   // Similar to JSFunction::GetName return the function's name or it's inferred
      84             :   // name.
      85             :   Handle<Object> GetFunctionDebugName() const;
      86             : 
      87             :   Handle<Script> GetScript() const { return script_; }
      88             : 
      89             :   bool HasPositionInfo();
      90             :   int start_position();
      91             :   int end_position();
      92             : 
      93             : #ifdef DEBUG
      94             :   // Debug print of the content of the current scope.
      95             :   void DebugPrint();
      96             : #endif
      97             : 
      98             :   bool InInnerScope() const { return !function_.is_null(); }
      99             :   bool HasContext() const;
     100             :   Handle<Context> CurrentContext() const {
     101             :     DCHECK(HasContext());
     102             :     return context_;
     103             :   }
     104             : 
     105             :  private:
     106             :   Isolate* isolate_;
     107             :   ParseInfo* info_ = nullptr;
     108             :   FrameInspector* const frame_inspector_ = nullptr;
     109             :   Handle<JSGeneratorObject> generator_;
     110             :   Handle<JSFunction> function_;
     111             :   Handle<Context> context_;
     112             :   Handle<Script> script_;
     113             :   Handle<StringSet> non_locals_;
     114             :   DeclarationScope* closure_scope_ = nullptr;
     115             :   Scope* start_scope_ = nullptr;
     116             :   Scope* current_scope_ = nullptr;
     117             :   bool seen_script_scope_ = false;
     118             : 
     119             :   inline JavaScriptFrame* GetFrame() const {
     120             :     return frame_inspector_->javascript_frame();
     121             :   }
     122             : 
     123             :   int GetSourcePosition();
     124             : 
     125             :   void TryParseAndRetrieveScopes(ScopeIterator::Option option);
     126             : 
     127             :   void RetrieveScopeChain(DeclarationScope* scope);
     128             : 
     129             :   void UnwrapEvaluationContext();
     130             : 
     131             :   typedef std::function<bool(Handle<String> name, Handle<Object> value)>
     132             :       Visitor;
     133             : 
     134             :   Handle<JSObject> WithContextExtension();
     135             : 
     136             :   bool SetLocalVariableValue(Handle<String> variable_name,
     137             :                              Handle<Object> new_value);
     138             :   bool SetContextVariableValue(Handle<String> variable_name,
     139             :                                Handle<Object> new_value);
     140             :   bool SetContextExtensionValue(Handle<String> variable_name,
     141             :                                 Handle<Object> new_value);
     142             :   bool SetScriptVariableValue(Handle<String> variable_name,
     143             :                               Handle<Object> new_value);
     144             :   bool SetModuleVariableValue(Handle<String> variable_name,
     145             :                               Handle<Object> new_value);
     146             : 
     147             :   // Helper functions.
     148             :   void VisitScope(const Visitor& visitor, Mode mode) const;
     149             :   void VisitLocalScope(const Visitor& visitor, Mode mode) const;
     150             :   void VisitScriptScope(const Visitor& visitor) const;
     151             :   void VisitModuleScope(const Visitor& visitor) const;
     152             :   bool VisitLocals(const Visitor& visitor, Mode mode) const;
     153             :   bool VisitContextLocals(const Visitor& visitor, Handle<ScopeInfo> scope_info,
     154             :                           Handle<Context> context) const;
     155             : 
     156             :   DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator);
     157             : };
     158             : 
     159             : }  // namespace internal
     160             : }  // namespace v8
     161             : 
     162             : #endif  // V8_DEBUG_DEBUG_SCOPES_H_

Generated by: LCOV version 1.10