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