// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_TYPER_H_
#define V8_COMPILER_TYPER_H_

#include "src/v8.h"

#include "src/compiler/graph.h"
#include "src/compiler/opcodes.h"
#include "src/types.h"

namespace v8 {
namespace internal {
namespace compiler {

// Forward declarations.
class LazyTypeCache;


class Typer {
 public:
  explicit Typer(Graph* graph, MaybeHandle<Context> context);
  ~Typer();

  void Run();

  Graph* graph() { return graph_; }
  MaybeHandle<Context> context() { return context_; }
  Zone* zone() { return graph_->zone(); }
  Isolate* isolate() { return zone()->isolate(); }

 private:
  class Visitor;
  class Decorator;

  Graph* graph_;
  MaybeHandle<Context> context_;
  Decorator* decorator_;

  Zone* zone_;
  Type* boolean_or_number;
  Type* undefined_or_null;
  Type* undefined_or_number;
  Type* negative_signed32;
  Type* non_negative_signed32;
  Type* singleton_false;
  Type* singleton_true;
  Type* singleton_zero;
  Type* singleton_one;
  Type* zero_or_one;
  Type* zeroish;
  Type* signed32ish;
  Type* unsigned32ish;
  Type* falsish;
  Type* truish;
  Type* integer;
  Type* weakint;
  Type* number_fun0_;
  Type* number_fun1_;
  Type* number_fun2_;
  Type* weakint_fun1_;
  Type* random_fun_;
  LazyTypeCache* cache_;

  ZoneVector<Handle<Object> > weaken_min_limits_;
  ZoneVector<Handle<Object> > weaken_max_limits_;
  DISALLOW_COPY_AND_ASSIGN(Typer);
};

}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_TYPER_H_