• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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_CRANKSHAFT_TYPING_H_
6 #define V8_CRANKSHAFT_TYPING_H_
7 
8 #include "src/allocation.h"
9 #include "src/ast/ast-type-bounds.h"
10 #include "src/ast/ast-types.h"
11 #include "src/ast/ast.h"
12 #include "src/ast/variables.h"
13 #include "src/effects.h"
14 #include "src/type-info.h"
15 #include "src/zone/zone.h"
16 
17 namespace v8 {
18 namespace internal {
19 
20 class DeclarationScope;
21 class Isolate;
22 class FunctionLiteral;
23 
24 class AstTyper final : public AstVisitor<AstTyper> {
25  public:
26   AstTyper(Isolate* isolate, Zone* zone, Handle<JSFunction> closure,
27            DeclarationScope* scope, BailoutId osr_ast_id, FunctionLiteral* root,
28            AstTypeBounds* bounds);
29   void Run();
30 
31   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
32 
33  private:
34   Effect ObservedOnStack(Object* value);
35   void ObserveTypesAtOsrEntry(IterationStatement* stmt);
36 
37   static const int kNoVar = INT_MIN;
38   typedef v8::internal::Effects<int, kNoVar> Effects;
39   typedef v8::internal::NestedEffects<int, kNoVar> Store;
40 
41   Isolate* isolate_;
42   Zone* zone_;
43   Handle<JSFunction> closure_;
44   DeclarationScope* scope_;
45   BailoutId osr_ast_id_;
46   FunctionLiteral* root_;
47   TypeFeedbackOracle oracle_;
48   Store store_;
49   AstTypeBounds* bounds_;
50 
zone()51   Zone* zone() const { return zone_; }
oracle()52   TypeFeedbackOracle* oracle() { return &oracle_; }
53 
NarrowType(Expression * e,AstBounds b)54   void NarrowType(Expression* e, AstBounds b) {
55     bounds_->set(e, AstBounds::Both(bounds_->get(e), b, zone()));
56   }
NarrowLowerType(Expression * e,AstType * t)57   void NarrowLowerType(Expression* e, AstType* t) {
58     bounds_->set(e, AstBounds::NarrowLower(bounds_->get(e), t, zone()));
59   }
60 
EnterEffects()61   Effects EnterEffects() {
62     store_ = store_.Push();
63     return store_.Top();
64   }
ExitEffects()65   void ExitEffects() { store_ = store_.Pop(); }
66 
parameter_index(int index)67   int parameter_index(int index) { return -index - 2; }
stack_local_index(int index)68   int stack_local_index(int index) { return index; }
69 
70   int variable_index(Variable* var);
71 
72   void VisitDeclarations(Declaration::List* declarations);
73   void VisitStatements(ZoneList<Statement*>* statements);
74 
75 #define DECLARE_VISIT(type) void Visit##type(type* node);
76   AST_NODE_LIST(DECLARE_VISIT)
77 #undef DECLARE_VISIT
78 
79   DISALLOW_COPY_AND_ASSIGN(AstTyper);
80 };
81 
82 }  // namespace internal
83 }  // namespace v8
84 
85 #endif  // V8_CRANKSHAFT_TYPING_H_
86