// 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 class UnsafePersistent { public: UnsafePersistent() : value_(0) { } explicit UnsafePersistent(v8::Persistent* handle) { value_ = handle->ClearAndLeak(); } UnsafePersistent(v8::Isolate* isolate, const v8::Handle& handle) { v8::Persistent 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 handle(value_); handle.Reset(); value_ = 0; } // Usage of this function requires // V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR to be defined v8::Local newLocal(v8::Isolate* isolate) { return v8::Local::New(isolate, v8::Local(value_)); } private: T* value_; }; } // namespace extensions #endif // CHROME_RENDERER_EXTENSIONS_UNSAFE_PERSISTENT_H_