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