13 #ifndef hifi_V8Types_h
14 #define hifi_V8Types_h
18 #include <libplatform/libplatform.h>
21 #include "ScriptEngineV8.h"
24 class V8ScriptValueTemplate {
26 V8ScriptValueTemplate() =
delete;
28 V8ScriptValueTemplate(ScriptEngineV8 *engine,
const v8::Local<T> value) : _engine(engine) {
29 v8::Locker locker(_engine->getIsolate());
30 v8::Isolate::Scope isolateScope(_engine->getIsolate());
31 v8::HandleScope handleScope(_engine->getIsolate());
32 v8::Context::Scope(_engine->getContext());
33 #ifdef OVERTE_V8_MEMORY_DEBUG
34 _engine->incrementScriptValueCounter();
36 _value.reset(
new v8::UniquePersistent<T>(_engine->getIsolate(), value));
39 V8ScriptValueTemplate& operator= (
const V8ScriptValueTemplate &source) {
40 v8::Locker locker(_engine->getIsolate());
41 v8::Isolate::Scope isolateScope(_engine->getIsolate());
42 v8::HandleScope handleScope(_engine->getIsolate());
43 v8::Context::Scope(_engine->getContext());
44 _engine = source.getEngine();
45 _value.reset(
new v8::UniquePersistent<T>(_engine->getIsolate(), source.constGet()));
49 V8ScriptValueTemplate(ScriptEngineV8 *engine) : _engine(engine) {
50 v8::Locker locker(_engine->getIsolate());
51 v8::Isolate::Scope isolateScope(_engine->getIsolate());
52 v8::HandleScope handleScope(_engine->getIsolate());
53 v8::Context::Scope(_engine->getContext());
54 #ifdef OVERTE_V8_MEMORY_DEBUG
55 _engine->incrementScriptValueCounter();
57 _value.reset(
new v8::UniquePersistent<T>(_engine->getIsolate(), v8::Local<T>()));
60 V8ScriptValueTemplate(
const V8ScriptValueTemplate &copied) : _engine(copied.getEngine()) {
61 v8::Locker locker(_engine->getIsolate());
62 v8::Isolate::Scope isolateScope(_engine->getIsolate());
63 v8::HandleScope handleScope(_engine->getIsolate());
64 v8::Context::Scope(_engine->getContext());
65 #ifdef OVERTE_V8_MEMORY_DEBUG
66 _engine->incrementScriptValueCounter();
68 _value.reset(
new v8::UniquePersistent<T>(_engine->getIsolate(), copied.constGet()));
72 Q_ASSERT(_engine->getIsolate()->IsCurrent());
73 v8::EscapableHandleScope handleScope(_engine->getIsolate());
74 return handleScope.Escape(_value.get()->Get(_engine->getIsolate()));
77 const v8::Local<T> constGet()
const {
78 Q_ASSERT(_engine->getIsolate()->IsCurrent());
79 v8::EscapableHandleScope handleScope(_engine->getIsolate());
80 return handleScope.Escape(_value.get()->Get(_engine->getIsolate()));
83 const v8::Local<v8::Context> constGetContext()
const {
84 Q_ASSERT(_engine->getIsolate()->IsCurrent());
85 v8::EscapableHandleScope handleScope(_engine->getIsolate());
86 return handleScope.Escape(_engine->getIsolate()->GetCurrentContext());
89 const v8::Isolate* constGetIsolate()
const {
return _engine->getIsolate(); };
90 v8::Isolate* getIsolate() {
return _engine->getIsolate();};
92 ScriptEngineV8* getEngine()
const {
return _engine; };
94 v8::Local<v8::Context> getContext() {
95 Q_ASSERT(_engine->getIsolate()->IsCurrent());
96 v8::EscapableHandleScope handleScope(_engine->getIsolate());
97 return handleScope.Escape(_engine->getIsolate()->GetCurrentContext());
100 void reset(v8::Isolate *isolate, v8::Local<T>) {
104 ~V8ScriptValueTemplate() {
105 v8::Locker locker(_engine->getIsolate());
106 v8::Isolate::Scope isolateScope(_engine->getIsolate());
107 v8::HandleScope handleScope(_engine->getIsolate());
109 #ifdef OVERTE_V8_MEMORY_DEBUG
110 _engine->decrementScriptValueCounter();
116 std::shared_ptr<v8::UniquePersistent<T>> _value;
117 ScriptEngineV8 *_engine;
120 class V8ScriptString :
public V8ScriptValueTemplate<v8::String> {
122 V8ScriptString() =
delete;
123 V8ScriptString(ScriptEngineV8 *engine,
const v8::Local<v8::String> value) : V8ScriptValueTemplate<v8::String>(engine, value) {};
124 const QString toQString()
const {
125 v8::Locker locker(getEngine()->getIsolate());
126 v8::Isolate::Scope isolateScope(getEngine()->getIsolate());
127 v8::HandleScope handleScope(getEngine()->getIsolate());
128 v8::Context::Scope contextScope(getEngine()->getContext());
129 Q_ASSERT(constGet()->IsString());
130 return QString(*v8::String::Utf8Value(
const_cast<v8::Isolate*
>(constGetIsolate()), constGet()));
132 bool operator==(
const V8ScriptString&
string)
const {
133 v8::Locker locker(getEngine()->getIsolate());
134 v8::Isolate::Scope isolateScope(getEngine()->getIsolate());
135 v8::HandleScope handleScope(getEngine()->getIsolate());
136 v8::Context::Scope contextScope(getEngine()->getContext());
137 Q_ASSERT(constGet()->IsString());
138 return constGet()->StringEquals(
string.constGet());
142 inline uint qHash(
const V8ScriptString &key, uint seed = 0) {
143 return qHash(key.toQString(), seed);