| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_ |
| #define CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_ |
| |
| #include "v8/include/v8.h" |
| |
| namespace extensions { |
| |
| // An unsafe way to pass Persistent handles around. Do not use unless you know |
| // what you're doing. UnsafePersistent is only safe to use when we know that the |
| // memory pointed by it is not going away: 1) When GC cannot happen while the |
| // UnsafePersistent is alive or 2) when there is a strong Persistent keeping the |
| // memory alive while the UnsafePersistent is alive. |
| template<typename T> class UnsafePersistent { |
| public: |
| UnsafePersistent() : value_(0) { } |
| |
| explicit UnsafePersistent(v8::Persistent<T>* handle) { |
| value_ = handle->ClearAndLeak(); |
| } |
| |
| UnsafePersistent(v8::Isolate* isolate, const v8::Handle<T>& handle) { |
| v8::Persistent<T> persistent(isolate, handle); |
| value_ = persistent.ClearAndLeak(); |
| } |
| |
| // Usage of this function requires |
| // V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR to be defined |
| void dispose() { |
| v8::Persistent<T> handle(value_); |
| handle.Reset(); |
| value_ = 0; |
| } |
| |
| // Usage of this function requires |
| // V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR to be defined |
| v8::Local<T> newLocal(v8::Isolate* isolate) { |
| return v8::Local<T>::New(isolate, v8::Local<T>(value_)); |
| } |
| |
| private: |
| T* value_; |
| }; |
| |
| } // namespace extensions |
| |
| #endif // CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_ |