| Index: src/handles.h
 | 
| ===================================================================
 | 
| --- src/handles.h	(revision 7267)
 | 
| +++ src/handles.h	(working copy)
 | 
| @@ -44,6 +44,7 @@
 | 
|   public:
 | 
|    INLINE(explicit Handle(T** location)) { location_ = location; }
 | 
|    INLINE(explicit Handle(T* obj));
 | 
| +  INLINE(Handle(T* obj, Isolate* isolate));
 | 
|  
 | 
|    INLINE(Handle()) : location_(NULL) {}
 | 
|  
 | 
| @@ -82,7 +83,7 @@
 | 
|    }
 | 
|  
 | 
|    static Handle<T> null() { return Handle<T>(); }
 | 
| -  bool is_null() { return location_ == NULL; }
 | 
| +  bool is_null() const { return location_ == NULL; }
 | 
|  
 | 
|    // Closes the given scope, but lets this handle escape. See
 | 
|    // implementation in api.h.
 | 
| @@ -107,34 +108,20 @@
 | 
|  // for which the handle scope has been deleted is undefined.
 | 
|  class HandleScope {
 | 
|   public:
 | 
| -  HandleScope() : prev_next_(current_.next), prev_limit_(current_.limit) {
 | 
| -    current_.level++;
 | 
| -  }
 | 
| +  inline HandleScope();
 | 
| +  explicit inline HandleScope(Isolate* isolate);
 | 
|  
 | 
| -  ~HandleScope() {
 | 
| -    CloseScope();
 | 
| -  }
 | 
| +  inline ~HandleScope();
 | 
|  
 | 
|    // Counts the number of allocated handles.
 | 
|    static int NumberOfHandles();
 | 
|  
 | 
|    // Creates a new handle with the given value.
 | 
|    template <typename T>
 | 
| -  static inline T** CreateHandle(T* value) {
 | 
| -    internal::Object** cur = current_.next;
 | 
| -    if (cur == current_.limit) cur = Extend();
 | 
| -    // Update the current next field, set the value in the created
 | 
| -    // handle, and return the result.
 | 
| -    ASSERT(cur < current_.limit);
 | 
| -    current_.next = cur + 1;
 | 
| +  static inline T** CreateHandle(T* value, Isolate* isolate);
 | 
|  
 | 
| -    T** result = reinterpret_cast<T**>(cur);
 | 
| -    *result = value;
 | 
| -    return result;
 | 
| -  }
 | 
| -
 | 
|    // Deallocates any extensions used by the current scope.
 | 
| -  static void DeleteExtensions();
 | 
| +  static void DeleteExtensions(Isolate* isolate);
 | 
|  
 | 
|    static Address current_next_address();
 | 
|    static Address current_limit_address();
 | 
| @@ -145,21 +132,10 @@
 | 
|    // a Handle backed by the parent scope holding the
 | 
|    // value of the argument handle.
 | 
|    template <typename T>
 | 
| -  Handle<T> CloseAndEscape(Handle<T> handle_value) {
 | 
| -    T* value = *handle_value;
 | 
| -    // Throw away all handles in the current scope.
 | 
| -    CloseScope();
 | 
| -    // Allocate one handle in the parent scope.
 | 
| -    ASSERT(current_.level > 0);
 | 
| -    Handle<T> result(CreateHandle<T>(value));
 | 
| -    // Reinitialize the current scope (so that it's ready
 | 
| -    // to be used or closed again).
 | 
| -    prev_next_ = current_.next;
 | 
| -    prev_limit_ = current_.limit;
 | 
| -    current_.level++;
 | 
| -    return result;
 | 
| -  }
 | 
| +  Handle<T> CloseAndEscape(Handle<T> handle_value);
 | 
|  
 | 
| +  Isolate* isolate() { return isolate_; }
 | 
| +
 | 
|   private:
 | 
|    // Prevent heap allocation or illegal handle scopes.
 | 
|    HandleScope(const HandleScope&);
 | 
| @@ -167,21 +143,9 @@
 | 
|    void* operator new(size_t size);
 | 
|    void operator delete(void* size_t);
 | 
|  
 | 
| -  inline void CloseScope() {
 | 
| -    current_.next = prev_next_;
 | 
| -    current_.level--;
 | 
| -    if (current_.limit != prev_limit_) {
 | 
| -      current_.limit = prev_limit_;
 | 
| -      DeleteExtensions();
 | 
| -    }
 | 
| -#ifdef DEBUG
 | 
| -    ZapRange(prev_next_, prev_limit_);
 | 
| -#endif
 | 
| -  }
 | 
| +  inline void CloseScope();
 | 
|  
 | 
| -  static v8::ImplementationUtilities::HandleScopeData current_;
 | 
| -  // Holds values on entry. The prev_next_ value is never NULL
 | 
| -  // on_entry, but is set to NULL when this scope is closed.
 | 
| +  Isolate* isolate_;
 | 
|    Object** prev_next_;
 | 
|    Object** prev_limit_;
 | 
|  
 | 
| 
 |