1bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 5bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#ifndef V8_INTERFACE_H_ 6bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#define V8_INTERFACE_H_ 7bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/ast-value-factory.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone-inl.h" // For operator new. 10bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 11bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comnamespace v8 { 12bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comnamespace internal { 13bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 14bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 15bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// This class implements the following abstract grammar of interfaces 16bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// (i.e. module types): 1728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// interface ::= UNDETERMINED | VALUE | CONST | MODULE(exports) 18bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// exports ::= {name : interface, ...} 1928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// A frozen type is one that is fully determined. Unification does not 2028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// allow to turn non-const values into const, or adding additional exports to 2128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// frozen interfaces. Otherwise, unifying modules merges their exports. 22bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Undetermined types are unification variables that can be unified freely. 2328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// There is a natural subsort lattice that reflects the increase of knowledge: 2428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// 2528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// undetermined 2628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// // | \\ . 2728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// value (frozen) module 2828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// // \\ / \ // 2928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// const fr.value fr.module 3028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// \\ / 3128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// fr.const 3228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// 3328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// where the bold lines are the only transitions allowed. 34bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 35bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comclass Interface : public ZoneObject { 36bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com public: 37bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // --------------------------------------------------------------------------- 38bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Factory methods. 39bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 4028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static Interface* NewUnknown(Zone* zone) { 4128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org return new(zone) Interface(NONE); 4228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org } 4328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 44bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com static Interface* NewValue() { 45bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com static Interface value_interface(VALUE + FROZEN); // Cached. 46bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com return &value_interface; 47bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 48bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 4928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static Interface* NewConst() { 5028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static Interface value_interface(VALUE + CONST + FROZEN); // Cached. 5128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org return &value_interface; 52bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 53bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 547028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org static Interface* NewModule(Zone* zone) { 557028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return new(zone) Interface(MODULE); 56bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 57bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 58bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // --------------------------------------------------------------------------- 59bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Mutators. 60bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 61bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Add a name to the list of exports. If it already exists, unify with 62bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // interface, otherwise insert unless this is closed. 6308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org void Add(const AstRawString* name, Interface* interface, Zone* zone, 6408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org bool* ok) { 6508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org DoAdd(name, name->hash(), interface, zone, ok); 66bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 67bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 68bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Unify with another interface. If successful, both interface objects will 69bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // represent the same type, and changes to one are reflected in the other. 707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void Unify(Interface* that, Zone* zone, bool* ok); 71bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 72bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Determine this interface to be a value interface. 73bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com void MakeValue(bool* ok) { 74bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com *ok = !IsModule(); 75bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com if (*ok) Chase()->flags_ |= VALUE; 76bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 77bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 7828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // Determine this interface to be an immutable interface. 7928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org void MakeConst(bool* ok) { 8028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org *ok = !IsModule() && (IsConst() || !IsFrozen()); 8128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org if (*ok) Chase()->flags_ |= VALUE + CONST; 8228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org } 8328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 84bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Determine this interface to be a module interface. 85bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com void MakeModule(bool* ok) { 86bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com *ok = !IsValue(); 87bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com if (*ok) Chase()->flags_ |= MODULE; 88bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 89bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 90bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Do not allow any further refinements, directly or through unification. 91bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com void Freeze(bool* ok) { 92bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com *ok = IsValue() || IsModule(); 93bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com if (*ok) Chase()->flags_ |= FROZEN; 94bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 95bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // Assign an index. 978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org void Allocate(int index) { 98e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsModule() && IsFrozen() && Chase()->index_ == -1); 998e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Chase()->index_ = index; 1008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 1018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 102bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // --------------------------------------------------------------------------- 103bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Accessors. 104bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 105bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Check whether this is still a fully undetermined type. 106bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com bool IsUnknown() { return Chase()->flags_ == NONE; } 107bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 108bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Check whether this is a value type. 109bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com bool IsValue() { return Chase()->flags_ & VALUE; } 110bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 11128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // Check whether this is a constant type. 11228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org bool IsConst() { return Chase()->flags_ & CONST; } 11328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 114bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Check whether this is a module type. 115bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com bool IsModule() { return Chase()->flags_ & MODULE; } 116bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 117bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Check whether this is closed (i.e. fully determined). 118bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com bool IsFrozen() { return Chase()->flags_ & FROZEN; } 119bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool IsUnified(Interface* that) { 1218e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return Chase() == that->Chase() 1228e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org || (this->IsValue() == that->IsValue() && 1238e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org this->IsConst() == that->IsConst()); 1248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 1258e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1268e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org int Length() { 127e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsModule() && IsFrozen()); 1288e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ZoneHashMap* exports = Chase()->exports_; 1298e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return exports ? exports->occupancy() : 0; 1308e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 1318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1328e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // The context slot in the hosting global context pointing to this module. 1338e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org int Index() { 134e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsModule() && IsFrozen()); 1358e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return Chase()->index_; 1368e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 137ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 138ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Look up an exported name. Returns NULL if not (yet) defined. 1397028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org Interface* Lookup(Handle<String> name, Zone* zone); 140ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 141ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // --------------------------------------------------------------------------- 142ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Iterators. 143ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 144ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Use like: 145ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // for (auto it = interface->iterator(); !it.done(); it.Advance()) { 146ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // ... it.name() ... it.interface() ... 147ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // } 148ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com class Iterator { 149ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com public: 150ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com bool done() const { return entry_ == NULL; } 15108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* name() const { 152e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!done()); 15308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return static_cast<const AstRawString*>(entry_->key); 154ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 155ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Interface* interface() const { 156e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!done()); 157ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return static_cast<Interface*>(entry_->value); 158ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 159ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com void Advance() { entry_ = exports_->Next(entry_); } 160ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 161ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com private: 162ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com friend class Interface; 163ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com explicit Iterator(const ZoneHashMap* exports) 164ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com : exports_(exports), entry_(exports ? exports->Start() : NULL) {} 165ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 166ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com const ZoneHashMap* exports_; 167ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com ZoneHashMap::Entry* entry_; 168ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com }; 169ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 170ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Iterator iterator() const { return Iterator(this->exports_); } 171ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 172bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // --------------------------------------------------------------------------- 173bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Debugging. 174bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#ifdef DEBUG 175bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com void Print(int n = 0); // n = indentation; n < 0 => don't print recursively 176bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#endif 177bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 178bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // --------------------------------------------------------------------------- 179bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Implementation. 180bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com private: 181bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com enum Flags { // All flags are monotonic 182bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com NONE = 0, 183bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com VALUE = 1, // This type describes a value 18428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org CONST = 2, // This type describes a constant 18528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org MODULE = 4, // This type describes a module 18628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org FROZEN = 8 // This type is fully determined 187bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com }; 188bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 189bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com int flags_; 190bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* forward_; // Unification link 191bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com ZoneHashMap* exports_; // Module exports and their types (allocated lazily) 1928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org int index_; 193bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 194bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com explicit Interface(int flags) 195bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com : flags_(flags), 196bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com forward_(NULL), 1978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org exports_(NULL), 1988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org index_(-1) { 199bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#ifdef DEBUG 200bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com if (FLAG_print_interface_details) 201bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com PrintF("# Creating %p\n", static_cast<void*>(this)); 202bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#endif 203bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 204bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 205bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* Chase() { 206bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* result = this; 207bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com while (result->forward_ != NULL) result = result->forward_; 208bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com if (result != this) forward_ = result; // On-the-fly path compression. 209bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com return result; 210bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 211bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 21208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org void DoAdd(const void* name, uint32_t hash, Interface* interface, Zone* zone, 2137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org bool* ok); 2147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void DoUnify(Interface* that, bool* ok, Zone* zone); 215bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}; 216bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 217bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com} } // namespace v8::internal 218bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 219bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com#endif // V8_INTERFACE_H_ 220