13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
26ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Redistribution and use in source and binary forms, with or without
36ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// modification, are permitted provided that the following conditions are
46ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// met:
56ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//
66ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Redistributions of source code must retain the above copyright
76ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       notice, this list of conditions and the following disclaimer.
86ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Redistributions in binary form must reproduce the above
96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       copyright notice, this list of conditions and the following
106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       disclaimer in the documentation and/or other materials provided
116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       with the distribution.
126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Neither the name of Google Inc. nor the names of its
136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       contributors may be used to endorse or promote products derived
146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       from this software without specific prior written permission.
156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//
166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifndef V8_TYPE_INFO_H_
296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8_TYPE_INFO_H_
306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "ast.h"
336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "globals.h"
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "zone-inl.h"
356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
366ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
376ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal {
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochconst int kMaxKeyedPolymorphism = 4;
403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//         Unknown
42257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//           |   \____________
43257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//           |                |
44257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//      Primitive       Non-primitive
45257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//           |   \_______     |
46257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//           |           |    |
47257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//        Number       String |
48257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//         /   \         |    |
49257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//    Double  Integer32  |   /
50257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//        |      |      /   /
51257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//        |     Smi    /   /
52257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//        |      |    / __/
53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch//        Uninitialized.
546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
556ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass TypeInfo {
566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TypeInfo() : type_(kUninitialized) { }
586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Unknown() { return TypeInfo(kUnknown); }
606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // We know it's a primitive type.
61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Primitive() { return TypeInfo(kPrimitive); }
626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // We know it's a number of some sort.
63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Number() { return TypeInfo(kNumber); }
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // We know it's a signed 32 bit integer.
65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Integer32() { return TypeInfo(kInteger32); }
666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // We know it's a Smi.
67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Smi() { return TypeInfo(kSmi); }
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // We know it's a Symbol.
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static TypeInfo Symbol() { return TypeInfo(kSymbol); }
706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // We know it's a heap number.
71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Double() { return TypeInfo(kDouble); }
726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // We know it's a string.
73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo String() { return TypeInfo(kString); }
74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // We know it's a non-primitive (object) type.
75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo NonPrimitive() { return TypeInfo(kNonPrimitive); }
766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // We haven't started collecting info yet.
77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static TypeInfo Uninitialized() { return TypeInfo(kUninitialized); }
786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int ToInt() {
806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return type_;
816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TypeInfo FromInt(int bit_representation) {
846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Type t = static_cast<Type>(bit_representation);
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(t == kUnknown ||
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kPrimitive ||
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kNumber ||
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kInteger32 ||
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kSmi ||
90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kDouble ||
91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kString ||
92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           t == kNonPrimitive);
936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return TypeInfo(t);
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Return the weakest (least precise) common type.
976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TypeInfo Combine(TypeInfo a, TypeInfo b) {
986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return TypeInfo(static_cast<Type>(a.type_ & b.type_));
996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Integer32 is an integer that can be represented as a signed
1031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // 32-bit integer. It has to be
1041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // in the range [-2^31, 2^31 - 1]. We also have to check for negative 0
105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // as it is not an Integer32.
1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static inline bool IsInt32Double(double value) {
1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    const DoubleRepresentation minus_zero(-0.0);
1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    DoubleRepresentation rep(value);
1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (rep.bits == minus_zero.bits) return false;
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (value >= kMinInt && value <= kMaxInt &&
111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        value == static_cast<int32_t>(value)) {
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return true;
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return false;
1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static TypeInfo TypeFromValue(Handle<Object> value);
1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool Equals(const TypeInfo& other) {
120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == other.type_;
121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsUnknown() {
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == kUnknown;
126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  inline bool IsPrimitive() {
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kPrimitive) == kPrimitive);
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsNumber() {
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kNumber) == kNumber);
1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsSmi() {
139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kSmi) == kSmi);
1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  inline bool IsSymbol() {
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(type_ != kUninitialized);
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return ((type_ & kSymbol) == kSymbol);
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  inline bool IsNonSymbol() {
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(type_ != kUninitialized);
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return ((type_ & kSymbol) == kString);
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsInteger32() {
154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kInteger32) == kInteger32);
1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsDouble() {
159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kDouble) == kDouble);
1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsString() {
164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kString) == kString);
166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  inline bool IsNonPrimitive() {
169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kNonPrimitive) == kNonPrimitive);
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  inline bool IsUninitialized() {
174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == kUninitialized;
1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  const char* ToString() {
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    switch (type_) {
179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kUnknown: return "Unknown";
180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kPrimitive: return "Primitive";
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kNumber: return "Number";
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kInteger32: return "Integer32";
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kSmi: return "Smi";
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case kSymbol: return "Symbol";
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kDouble: return "Double";
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kString: return "String";
187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kNonPrimitive: return "Object";
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kUninitialized: return "Uninitialized";
1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    UNREACHABLE();
1916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return "Unreachable code";
1926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private:
1956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  enum Type {
196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUnknown = 0,          // 0000000
197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kPrimitive = 0x10,     // 0010000
198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNumber = 0x11,        // 0010001
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kInteger32 = 0x13,     // 0010011
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kSmi = 0x17,           // 0010111
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kDouble = 0x19,        // 0011001
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kString = 0x30,        // 0110000
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kSymbol = 0x32,        // 0110010
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNonPrimitive = 0x40,  // 1000000
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUninitialized = 0x7f  // 1111111
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  };
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  explicit inline TypeInfo(Type t) : type_(t) { }
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Type type_;
2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochenum StringStubFeedback {
214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DEFAULT_STRING_STUB = 0,
215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  STRING_INDEX_OUT_OF_BOUNDS = 1
216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
217b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations.
220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Assignment;
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass BinaryOperation;
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Call;
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass CallNew;
22469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass CaseClause;
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass CompareOperation;
226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass CompilationInfo;
22769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass CountOperation;
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass Expression;
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Property;
23069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass SmallMapList;
23169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass UnaryOperation;
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass ForInStatement;
23369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass TypeFeedbackOracle BASE_EMBEDDED {
236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  TypeFeedbackOracle(Handle<Code> code,
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     Handle<Context> global_context,
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     Isolate* isolate);
2406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool LoadIsMonomorphicNormal(Property* expr);
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool LoadIsUninitialized(Property* expr);
2433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool LoadIsMegamorphicWithTypeInfo(Property* expr);
2443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool StoreIsMonomorphicNormal(Expression* expr);
2453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool StoreIsMegamorphicWithTypeInfo(Expression* expr);
246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CallIsMonomorphic(Call* expr);
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool CallNewIsMonomorphic(CallNew* expr);
2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool ObjectLiteralStoreIsMonomorphic(ObjectLiteral::Property* prop);
2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsForInFastCase(ForInStatement* expr);
2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> LoadMonomorphicReceiverType(Property* expr);
2538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Map> StoreMonomorphicReceiverType(Expression* expr);
2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void LoadReceiverTypes(Property* expr,
25669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                         Handle<String> name,
25769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                         SmallMapList* types);
25869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void StoreReceiverTypes(Assignment* expr,
25969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                          Handle<String> name,
26069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                          SmallMapList* types);
26169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void CallReceiverTypes(Call* expr,
26269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                         Handle<String> name,
26369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                         CallKind call_kind,
26469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                         SmallMapList* types);
2653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void CollectKeyedReceiverTypes(unsigned ast_id,
26669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                 SmallMapList* types);
26744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static bool CanRetainOtherContext(Map* map, Context* global_context);
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static bool CanRetainOtherContext(JSFunction* function,
2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    Context* global_context);
2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  CheckType GetCallCheckType(Call* expr);
273b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> GetPrototypeForPrimitiveCheck(CheckType check);
274b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> GetCallTarget(Call* expr);
2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> GetCallNewTarget(CallNew* expr);
2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> GetObjectLiteralStoreMap(ObjectLiteral::Property* prop);
2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool LoadIsBuiltin(Property* expr, Builtins::Name id);
2816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // TODO(1571) We can't use ToBooleanStub::Types as the return value because
28369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // of various cylces in our headers. Death to tons of implementations in
28469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // headers!! :-P
28569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  byte ToBooleanTypes(unsigned ast_id);
28669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Get type information for arithmetic operations and compares.
288257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  TypeInfo UnaryType(UnaryOperation* expr);
2891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  TypeInfo BinaryType(BinaryOperation* expr);
2901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  TypeInfo CompareType(CompareOperation* expr);
291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool IsSymbolCompare(CompareOperation* expr);
2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> GetCompareMap(CompareOperation* expr);
293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TypeInfo SwitchType(CaseClause* clause);
294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  TypeInfo IncrementType(CountOperation* expr);
2956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
29769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void CollectReceiverTypes(unsigned ast_id,
29869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                            Handle<String> name,
29969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                            Code::Flags flags,
30069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                            SmallMapList* types);
3016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void SetInfo(unsigned ast_id, Object* target);
3038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void BuildDictionary(Handle<Code> code);
3053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void GetRelocInfos(Handle<Code> code, ZoneList<RelocInfo>* infos);
3063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void CreateDictionary(Handle<Code> code, ZoneList<RelocInfo>* infos);
3073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void RelocateRelocInfos(ZoneList<RelocInfo>* infos,
3083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                          byte* old_start,
3093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                          byte* new_start);
3103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void ProcessRelocInfos(ZoneList<RelocInfo>* infos);
3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void ProcessTypeFeedbackCells(Handle<Code> code);
3126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
31344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns an element from the backing store. Returns undefined if
31444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // there is no information.
315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Handle<Object> GetInfo(unsigned ast_id);
31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
317b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<Context> global_context_;
3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Isolate* isolate_;
319c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  Handle<UnseededNumberDictionary> dictionary_;
3206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TypeFeedbackOracle);
322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} }  // namespace v8::internal
3256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // V8_TYPE_INFO_H_
327