1c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without 3c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// modification, are permitted provided that the following conditions are 4c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// met: 5c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// 6c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// * Redistributions of source code must retain the above copyright 7c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// notice, this list of conditions and the following disclaimer. 8c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// * Redistributions in binary form must reproduce the above 9c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// copyright notice, this list of conditions and the following 10c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// disclaimer in the documentation and/or other materials provided 11c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// with the distribution. 12c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// * Neither the name of Google Inc. nor the names of its 13c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// contributors may be used to endorse or promote products derived 14c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// from this software without specific prior written permission. 15c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// 16c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 28c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#ifndef V8_TYPING_H_ 29c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#define V8_TYPING_H_ 30c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 31c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "v8.h" 32c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 33c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "allocation.h" 34c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "ast.h" 35c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "compiler.h" 36c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "type-info.h" 37169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org#include "types.h" 38594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#include "effects.h" 39c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "zone.h" 40c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "scopes.h" 41c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 42c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgnamespace v8 { 43c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgnamespace internal { 44c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 45c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 46c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgclass AstTyper: public AstVisitor { 47c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org public: 4841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void Run(CompilationInfo* info); 49c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 50c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void* operator new(size_t size, Zone* zone) { 51c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org return zone->New(static_cast<int>(size)); 52c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 53c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void operator delete(void* pointer, Zone* zone) { } 54c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void operator delete(void* pointer) { } 55c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 56c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 57c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 58c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org private: 59c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org explicit AstTyper(CompilationInfo* info); 60c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org static const int kNoVar = INT_MIN; 62594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org typedef v8::internal::Effects<int, kNoVar> Effects; 63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org typedef v8::internal::NestedEffects<int, kNoVar> Store; 64594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 65c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CompilationInfo* info_; 66c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org TypeFeedbackOracle oracle_; 67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Store store_; 68c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 69c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org TypeFeedbackOracle* oracle() { return &oracle_; } 70c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Zone* zone() const { return info_->zone(); } 71c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 72169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void NarrowType(Expression* e, Bounds b) { 73169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org e->set_bounds(Bounds::Both(e->bounds(), b, isolate_)); 741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 75169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void NarrowLowerType(Expression* e, Handle<Type> t) { 76169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org e->set_bounds(Bounds::NarrowLower(e->bounds(), t, isolate_)); 77bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org } 781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 79594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Effects EnterEffects() { 80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org store_ = store_.Push(); 81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return store_.Top(); 82594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 83594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void ExitEffects() { store_ = store_.Pop(); } 84594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 85594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int variable_index(Variable* var) { 86594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return var->IsStackLocal() ? var->index() : 87594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org var->IsParameter() ? -var->index() : kNoVar; 88594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 89594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 90c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void VisitDeclarations(ZoneList<Declaration*>* declarations); 91c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void VisitStatements(ZoneList<Statement*>* statements); 92c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 93c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#define DECLARE_VISIT(type) virtual void Visit##type(type* node); 94c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org AST_NODE_LIST(DECLARE_VISIT) 95c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#undef DECLARE_VISIT 96c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 97c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org DISALLOW_COPY_AND_ASSIGN(AstTyper); 98c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org}; 99c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 100c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} } // namespace v8::internal 101c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 102c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#endif // V8_TYPING_H_ 103