2020-03-24 16:03:29 +00:00
|
|
|
// Copyright (c) 2020 Slack Technologies, Inc.
|
|
|
|
// Use of this source code is governed by the MIT license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2021-11-22 07:34:31 +00:00
|
|
|
#ifndef ELECTRON_SHELL_COMMON_GIN_HELPER_PINNABLE_H_
|
|
|
|
#define ELECTRON_SHELL_COMMON_GIN_HELPER_PINNABLE_H_
|
2020-03-24 16:03:29 +00:00
|
|
|
|
2024-07-29 17:42:57 +00:00
|
|
|
#include "v8/include/v8-isolate.h"
|
|
|
|
#include "v8/include/v8-local-handle.h"
|
|
|
|
#include "v8/include/v8-persistent-handle.h"
|
|
|
|
#include "v8/include/v8-value.h"
|
2020-03-24 16:03:29 +00:00
|
|
|
|
|
|
|
namespace gin_helper {
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
class Pinnable {
|
|
|
|
protected:
|
|
|
|
// Prevent the object from being garbage collected until Unpin() is called.
|
|
|
|
void Pin(v8::Isolate* isolate) {
|
|
|
|
v8::HandleScope scope(isolate);
|
|
|
|
v8::Local<v8::Value> wrapper;
|
|
|
|
if (static_cast<T*>(this)->GetWrapper(isolate).ToLocal(&wrapper)) {
|
|
|
|
pinned_.Reset(isolate, wrapper);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Allow the object to be garbage collected.
|
|
|
|
void Unpin() { pinned_.Reset(); }
|
|
|
|
|
|
|
|
private:
|
|
|
|
v8::Global<v8::Value> pinned_;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace gin_helper
|
|
|
|
|
2021-11-22 07:34:31 +00:00
|
|
|
#endif // ELECTRON_SHELL_COMMON_GIN_HELPER_PINNABLE_H_
|