| Index: src/V8Upgrade.h |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/src/V8Upgrade.h |
| @@ -0,0 +1,116 @@ |
| +/* |
| + * This file is part of Adblock Plus <https://adblockplus.org/>, |
| + * Copyright (C) 2006-2016 Eyeo GmbH |
| + * |
| + * Adblock Plus is free software: you can redistribute it and/or modify |
| + * it under the terms of the GNU General Public License version 3 as |
| + * published by the Free Software Foundation. |
| + * |
| + * Adblock Plus is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +/** |
| + * \file V8Upgrade Facilities to ease the upgrade from old versions of v8 |
| + */ |
| + |
| +#if !defined(V8_UPGRADE_H) |
| +#define V8_UPGRADE_H |
| + |
| +#include <v8.h> |
| + |
| +/** |
| + * Mimic for the next-generation version of v8::Persistent |
| + * |
| + * Recent versions of v8 significantly improve the usability of v8::Persistent. |
| + * This class provides an interface that mimics the new version. |
| + * An upgraded version of v8::Peristent should drop in and replace this class |
| + * with no changes to code other than the type declaration. |
| + * |
| + * Features present in new versions of v8::Persistent that are present here: |
| + * - Objects follow conventional C++ scope behavior. |
| + * Dispose() is no longer present; its equivalent is called in the destructor. |
| + * - Get() is a convenience method to convert to a Local<T> |
| + * - A copy constructor. |
| + */ |
| +template<class T> |
| +class V8PersistentNG |
| +{ |
| + /** |
| + * The underlying Persistent |
| + */ |
| + v8::Persistent<T> persistent; |
| + /** |
| + * Isolate pointer from which this Persistent was constructed. |
| + * This is needed for the copy constructor using the old Persistent class. |
| + */ |
| + v8::Isolate* isolate; |
| + |
| +public: |
| + V8PersistentNG() // = default; |
| + {} |
| + |
| + template<class S> |
| + V8PersistentNG(v8::Isolate* isolate, v8::Local<S> that) |
| + : persistent(isolate, that), |
| + isolate(isolate) |
| + {} |
| + |
| + ~V8PersistentNG() |
| + { |
| + persistent.Dispose(); |
| + } |
| + |
| + /** |
| + * Copy constructor |
| + */ |
| + V8PersistentNG(const V8PersistentNG<T>& that) |
| + : isolate(that.isolate) |
| + { |
| + persistent.Reset(that.isolate, that.persistent); |
| + } |
| + /** |
| + * Move constructor |
| + */ |
| + V8PersistentNG(V8PersistentNG<T>&& that) |
| + : isolate(that.isolate) |
| + { |
| + persistent.Reset(that.isolate, that.persistent); |
| + } |
| + /** |
| + * Copy assignment |
| + */ |
| + V8PersistentNG& operator=(const V8PersistentNG<T>& that) |
| + { |
| + isolate = that.isolate; |
| + persistent.Reset(that.isolate, that.persistent); |
| + return *this; |
| + } |
| + /** |
| + * Move assignment |
| + */ |
| + V8PersistentNG& operator=(V8PersistentNG<T>&& that) |
| + { |
| + isolate = that.isolate; |
| + persistent.Reset(that.isolate, that.persistent); |
| + return *this; |
| + } |
| + |
| + /** |
| + * Create a Local from this Persistent. |
| + * |
| + * The function signature matches that of the new v8. |
| + * The `isolate` argument seems redundant, but that's out of our hands. |
| + */ |
| + v8::Local<T> Get(v8::Isolate* isolate) const |
| + { |
| + return v8::Local<T>::New(isolate, persistent); |
| + } |
| +}; |
| + |
| +#endif |