| 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_;
|
|
|
|
|