Home | History | Annotate | Download | only in extensions
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_
      6 #define CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_
      7 
      8 #include "v8/include/v8.h"
      9 
     10 namespace extensions {
     11 
     12 // An unsafe way to pass Persistent handles around. Do not use unless you know
     13 // what you're doing. UnsafePersistent is only safe to use when we know that the
     14 // memory pointed by it is not going away: 1) When GC cannot happen while the
     15 // UnsafePersistent is alive or 2) when there is a strong Persistent keeping the
     16 // memory alive while the UnsafePersistent is alive.
     17 template<typename T> class UnsafePersistent {
     18  public:
     19   UnsafePersistent() : value_(0) { }
     20 
     21   explicit UnsafePersistent(v8::Persistent<T>* handle) {
     22     value_ = handle->ClearAndLeak();
     23   }
     24 
     25   UnsafePersistent(v8::Isolate* isolate, const v8::Handle<T>& handle) {
     26     v8::Persistent<T> persistent(isolate, handle);
     27     value_ = persistent.ClearAndLeak();
     28   }
     29 
     30   // Usage of this function requires
     31   // V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR to be defined
     32   void dispose() {
     33     v8::Persistent<T> handle(value_);
     34     handle.Dispose();
     35     value_ = 0;
     36   }
     37 
     38   // Usage of this function requires
     39   // V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR to be defined
     40   v8::Local<T> newLocal(v8::Isolate* isolate) {
     41     return v8::Local<T>::New(isolate, v8::Local<T>(value_));
     42   }
     43 
     44  private:
     45   T* value_;
     46 };
     47 
     48 }  // namespace extensions
     49 
     50 #endif  // CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_
     51