Overte C++ Documentation
ScriptValueV8Wrapper.h
1 //
2 // ScriptValueV8Wrapper.h
3 // libraries/script-engine/src/v8
4 //
5 // Created by Heather Anderson on 5/16/21.
6 // Modified for V8 by dr Karol Suprynowicz on 2022/10/08
7 // Copyright 2021 Vircadia contributors.
8 // Copyright 2022-2023 Overte e.V.
9 //
10 // Distributed under the Apache License, Version 2.0.
11 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
12 // SPDX-License-Identifier: Apache-2.0
13 //
14 
17 
18 #ifndef hifi_ScriptValueV8Wrapper_h
19 #define hifi_ScriptValueV8Wrapper_h
20 
21 #include <QtCore/QPointer>
22 
23 #include <utility>
24 
25 #include "../ScriptValue.h"
26 #include "ScriptEngineV8.h"
27 #include "V8Types.h"
28 
29 //#define OVERTE_V8_SCRIPT_VALUE_WRAPPER_DELETE_GUARD
30 
32 class ScriptValueV8Wrapper final : public ScriptValueProxy {
33 public: // construction
34  ScriptValueV8Wrapper() = delete;
35  //ScriptValueV8Wrapper(ScriptValueV8Wrapper &) = delete;
36  inline ScriptValueV8Wrapper(ScriptEngineV8* engine, const V8ScriptValue& value) :
37  _engine(engine), _value(value) {
38 #ifdef OVERTE_V8_MEMORY_DEBUG
39  engine->incrementScriptValueProxyCounter();
40 #endif
41  }
42  inline ScriptValueV8Wrapper(ScriptEngineV8* engine, V8ScriptValue&& value) :
43  _engine(engine), _value(std::move(value)) {
44 #ifdef OVERTE_V8_MEMORY_DEBUG
45  engine->incrementScriptValueProxyCounter();
46 #endif
47  }
48  static ScriptValueV8Wrapper* unwrap(const ScriptValue& val);
49  inline const V8ScriptValue& toV8Value() const { return _value; }
50  static V8ScriptValue fullUnwrap(ScriptEngineV8* engine, const ScriptValue& value);
51  ScriptEngineV8* getV8Engine() {return _engine;}
52 
53 public:
54  virtual void enqueueRelease() override;
55  virtual void release() override;
56  virtual ScriptValueProxy* copy() const override;
57 
58 public: // ScriptValue implementation
59  virtual ScriptValue call(const ScriptValue& thisObject = ScriptValue(),
60  const ScriptValueList& args = ScriptValueList()) override;
61  virtual ScriptValue call(const ScriptValue& thisObject, const ScriptValue& arguments) override;
62  virtual ScriptValue construct(const ScriptValueList& args = ScriptValueList()) override;
63  virtual ScriptValue construct(const ScriptValue& arguments) override;
64  virtual ScriptValue data() const override;
65  virtual ScriptEnginePointer engine() const override;
66  virtual ScriptValueIteratorPointer newIterator() const override;
67  virtual ScriptValue property(const QString& name,
68  const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype) const override;
69  virtual ScriptValue property(quint32 arrayIndex,
70  const ScriptValue::ResolveFlags& mode = ScriptValue::ResolvePrototype) const override;
71  virtual ScriptValue prototype() const override;
72  virtual void setData(const ScriptValue& val) override;
73 
74  virtual bool hasProperty(const QString &name) const override;
75 
76  virtual void setProperty(const QString& name,
77  const ScriptValue& value,
78  const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags) override;
79  virtual void setProperty(quint32 arrayIndex,
80  const ScriptValue& value,
81  const ScriptValue::PropertyFlags& flags = ScriptValue::KeepExistingFlags) override;
82  virtual void setPrototype(const ScriptValue& prototype) override;
83  virtual bool strictlyEquals(const ScriptValue& other) const override;
84  virtual QList<QString> getPropertyNames() const override;
85 
86  virtual bool equals(const ScriptValue& other) const override;
87  virtual bool isArray() const override;
88  virtual bool isBool() const override;
89  virtual bool isError() const override;
90  virtual bool isFunction() const override;
91  virtual bool isNumber() const override;
92  virtual bool isNull() const override;
93  virtual bool isObject() const override;
94  virtual bool isString() const override;
95  virtual bool isUndefined() const override;
96  virtual bool isValid() const override;
97  virtual bool isVariant() const override;
98  virtual bool toBool() const override;
99  virtual qint32 toInt32() const override;
100  virtual double toInteger() const override;
101  virtual double toNumber() const override;
102  virtual QString toString() const override;
103  virtual quint16 toUInt16() const override;
104  virtual quint32 toUInt32() const override;
105  virtual QVariant toVariant() const override;
106  virtual QObject* toQObject() const override;
107 
108  virtual QString repr() const override;
109 
110 #ifdef OVERTE_V8_SCRIPT_VALUE_WRAPPER_DELETE_GUARD
111  // These can be used for debugging crashes caused access after delete
112  // If delete guard is enabled, deleting wrapper will cause a crash and thus trigger debugger and reveal location where object was deleted.
113  void enableDeleteGuard() { deleteGuard = true;}
114  void disableDeleteGuard() { deleteGuard = false;}
115 #endif
116 
117 protected:
118  virtual ~ScriptValueV8Wrapper() {
119 #ifdef OVERTE_V8_MEMORY_DEBUG
120  _engine->decrementScriptValueProxyCounter();
121 #endif
122 #ifdef OVERTE_V8_SCRIPT_VALUE_WRAPPER_DELETE_GUARD
123  if (deleteGuard) {
124  uint32_t* crashTrigger = nullptr;
125  *crashTrigger = 0x12345678;
126  }
127 #endif
128  };
129 
130 private: // helper functions
131  V8ScriptValue fullUnwrap(const ScriptValue& value) const;
132 
133 private: // storage
134  ScriptEngineV8 *_engine;
135  V8ScriptValue _value;
136 
137 #ifdef OVERTE_V8_SCRIPT_VALUE_WRAPPER_DELETE_GUARD
138  bool deleteGuard{false};
139 #endif
140  // This is to prevent proxy being deleted when it is in use for example during callbacks from inside it
141  mutable QReadWriteLock lock;
142 
143  Q_DISABLE_COPY(ScriptValueV8Wrapper)
144 };
145 
146 #endif // hifi_ScriptValueV8Wrapper_h
147 
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:132
[V8] Implements ScriptValue for V8 and translates calls for V8ScriptValue
Definition: ScriptValueV8Wrapper.h:32