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