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