1c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 5c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#ifndef V8_TYPING_H_ 6c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#define V8_TYPING_H_ 7c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compiler.h" 134b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/effects.h" 144b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/scopes.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/type-info.h" 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h" 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone.h" 18c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 19c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgnamespace v8 { 20c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgnamespace internal { 21c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 22c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 23c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgclass AstTyper: public AstVisitor { 24c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org public: 2541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void Run(CompilationInfo* info); 26c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 27c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void* operator new(size_t size, Zone* zone) { 28c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org return zone->New(static_cast<int>(size)); 29c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 30c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void operator delete(void* pointer, Zone* zone) { } 31c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void operator delete(void* pointer) { } 32c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 33c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 34c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 35c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org private: 36c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org explicit AstTyper(CompilationInfo* info); 37c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 384f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org Effect ObservedOnStack(Object* value); 394f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org void ObserveTypesAtOsrEntry(IterationStatement* stmt); 404f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 41594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org static const int kNoVar = INT_MIN; 42594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org typedef v8::internal::Effects<int, kNoVar> Effects; 43594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org typedef v8::internal::NestedEffects<int, kNoVar> Store; 44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 45c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CompilationInfo* info_; 46c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org TypeFeedbackOracle oracle_; 47594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Store store_; 48c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 49c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org TypeFeedbackOracle* oracle() { return &oracle_; } 50c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 51169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void NarrowType(Expression* e, Bounds b) { 526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org e->set_bounds(Bounds::Both(e->bounds(), b, zone())); 531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void NarrowLowerType(Expression* e, Type* t) { 556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org e->set_bounds(Bounds::NarrowLower(e->bounds(), t, zone())); 56bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 58594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects EnterEffects() { 59594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_ = store_.Push(); 60594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return store_.Top(); 61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 62594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void ExitEffects() { store_ = store_.Pop(); } 63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 644f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org int parameter_index(int index) { return -index - 2; } 654f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org int stack_local_index(int index) { return index; } 664f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org 67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int variable_index(Variable* var) { 68113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // Stack locals have the range [0 .. l] 69113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // Parameters have the range [-1 .. p] 70113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org // We map this to [-p-2 .. -1, 0 .. l] 714f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return var->IsStackLocal() ? stack_local_index(var->index()) : 724f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org var->IsParameter() ? parameter_index(var->index()) : kNoVar; 73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 75c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void VisitDeclarations(ZoneList<Declaration*>* declarations); 76c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void VisitStatements(ZoneList<Statement*>* statements); 77c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 78c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#define DECLARE_VISIT(type) virtual void Visit##type(type* node); 79c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org AST_NODE_LIST(DECLARE_VISIT) 80c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#undef DECLARE_VISIT 81c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 82c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org DISALLOW_COPY_AND_ASSIGN(AstTyper); 83c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org}; 84c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 85c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} } // namespace v8::internal 86c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 87c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#endif // V8_TYPING_H_ 88