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 auto isolate = _engine->getIsolate();
30 Q_ASSERT(isolate->IsCurrent());
31 v8::HandleScope handleScope(isolate);
32 v8::Context::Scope(_engine->getContext());
33 #ifdef OVERTE_V8_MEMORY_DEBUG
34 _engine->incrementScriptValueCounter();
36 _value.reset(
new v8::UniquePersistent<T>(isolate, value));
39 V8ScriptValueTemplate& operator= (
const V8ScriptValueTemplate &source) {
40 auto isolate = _engine->getIsolate();
41 Q_ASSERT(isolate->IsCurrent());
42 v8::HandleScope handleScope(isolate);
43 v8::Context::Scope(_engine->getContext());
44 _engine = source.getEngine();
45 _value.reset(
new v8::UniquePersistent<T>(isolate, source.constGet()));
49 V8ScriptValueTemplate(ScriptEngineV8 *engine) : _engine(engine) {
50 auto isolate = _engine->getIsolate();
51 Q_ASSERT(isolate->IsCurrent());
52 v8::HandleScope handleScope(isolate);
53 v8::Context::Scope(_engine->getContext());
54 #ifdef OVERTE_V8_MEMORY_DEBUG
55 _engine->incrementScriptValueCounter();
57 _value.reset(
new v8::UniquePersistent<T>(isolate, v8::Local<T>()));
60 V8ScriptValueTemplate(
const V8ScriptValueTemplate &copied) : _engine(copied.getEngine()) {
61 auto isolate = _engine->getIsolate();
62 Q_ASSERT(isolate->IsCurrent());
63 v8::HandleScope handleScope(isolate);
64 v8::Context::Scope(_engine->getContext());
65 #ifdef OVERTE_V8_MEMORY_DEBUG
66 _engine->incrementScriptValueCounter();
68 _value.reset(
new v8::UniquePersistent<T>(isolate, 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 auto isolate = _engine->getIsolate();
106 Q_ASSERT(isolate->IsCurrent());
107 v8::HandleScope handleScope(isolate);
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 auto isolate = getEngine()->getIsolate();
126 Q_ASSERT(isolate->IsCurrent());
127 v8::HandleScope handleScope(isolate);
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 auto isolate = getEngine()->getIsolate();
134 Q_ASSERT(isolate->IsCurrent());
135 v8::HandleScope handleScope(isolate);
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);