History

first pass creating Qt <-> QtScript interface

Heather Anderson committed 4 years ago

Commit bc6eaf21 parent bd0455463 files · +1707 −294Browse files

Showing the changes to libraries/script-engine/src/qtscript/ScriptEngineQtScript.cpp (1 of 63 files). Show all

Unified · Split

libraries/script-engine/src/qtscript/ScriptEngineQtScript.cpp+21−128
@@ -49,17 +49,13 @@ · 48 unmodified lines
4949 #include "../ScriptValue.h"
5050
5151 #include "ScriptContextQtWrapper.h"
52+#include "ScriptObjectQtProxy.h"
5253 #include "ScriptProgramQtWrapper.h"
5354 #include "ScriptValueQtWrapper.h"
5455 #include "ScriptContextQtAgent.h"
5556
5657 static const int MAX_DEBUG_VALUE_LENGTH { 80 };
5758
58−static const QScriptEngine::QObjectWrapOptions DEFAULT_QOBJECT_WRAP_OPTIONS =
59− QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects;
60−
61−Q_DECLARE_METATYPE(ScriptValue);
62−
6359 Q_DECLARE_METATYPE(QScriptEngine::FunctionSignature)
6460 int qfunctionSignatureMetaID = qRegisterMetaType<QScriptEngine::FunctionSignature>();
6561
@@ -311,21 +307,12 @@ void ScriptEngineQtScript::_debugDump(const QString& header, const QScriptValue& · 245 unmodified lines
311307 }
312308 #endif
313309
314−static QScriptValue ScriptValueToQScriptValue(QScriptEngine* engine, const ScriptValue& src) {
315− return ScriptValueQtWrapper::fullUnwrap(static_cast<ScriptEngineQtScript*>(engine), src);
316−}
317−
318−static void ScriptValueFromQScriptValue(const QScriptValue& src, ScriptValue& dest) {
319− ScriptEngineQtScript* engine = static_cast<ScriptEngineQtScript*>(src.engine());
320− dest = ScriptValue(new ScriptValueQtWrapper(engine, src));
321−}
322−
323310 ScriptEngineQtScript::ScriptEngineQtScript(ScriptManager* scriptManager) :
324311 QScriptEngine(),
325312 _scriptManager(scriptManager),
326313 _arrayBufferClass(new ArrayBufferClass(this))
327314 {
328− qScriptRegisterMetaType(this, ScriptValueToQScriptValue, ScriptValueFromQScriptValue);
315+ registerSystemTypes();
329316
330317 if (_scriptManager) {
331318 connect(this, &QScriptEngine::signalHandlerException, this, [this](const QScriptValue& exception) {
@@ -343,10 +330,10 @@ ScriptEngineQtScript::ScriptEngineQtScript(ScriptManager* scriptManager) : · 11 unmodified lines
343330 }
344331
345332 QScriptValue null = QScriptEngine::nullValue();
346− _nullValue = ScriptValue(new ScriptValueQtWrapper(const_cast<ScriptEngineQtScript*>(this), std::move(null)));
333+ _nullValue = ScriptValue(new ScriptValueQtWrapper(this, std::move(null)));
347334
348335 QScriptValue undefined = QScriptEngine::undefinedValue();
349− _undefinedValue = ScriptValue(new ScriptValueQtWrapper(const_cast<ScriptEngineQtScript*>(this), std::move(undefined)));
336+ _undefinedValue = ScriptValue(new ScriptValueQtWrapper(this, std::move(undefined)));
350337
351338 QScriptEngine::setProcessEventsInterval(MSECS_PER_SECOND);
352339
@@ -417,7 +404,7 @@ void ScriptEngineQtScript::registerGlobalObject(const QString& name, QObject* ob · 64 unmodified lines
417404
418405 if (!QScriptEngine::globalObject().property(name).isValid()) {
419406 if (object) {
420− QScriptValue value = QScriptEngine::newQObject(object, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS);
407+ QScriptValue value = ScriptObjectQtProxy::newQObject(this, object, ScriptEngine::QtOwnership);
421408 QScriptEngine::globalObject().setProperty(name, value);
422409 } else {
423410 QScriptEngine::globalObject().setProperty(name, QScriptValue());
@@ -747,7 +734,7 @@ void ScriptEngineQtScript::updateMemoryCost(const qint64& deltaSize) { · 323 unmodified lines
747734
748735 ScriptValue ScriptEngineQtScript::globalObject() const {
749736 QScriptValue global = QScriptEngine::globalObject(); // can't cache the value as it may change
750− return ScriptValue(new ScriptValueQtWrapper(const_cast < ScriptEngineQtScript*>(this), std::move(global)));
737+ return ScriptValue(new ScriptValueQtWrapper(const_cast<ScriptEngineQtScript*>(this), std::move(global)));
751738 }
752739
753740 ScriptManager* ScriptEngineQtScript::manager() const {
@@ -783,8 +770,7 @@ ScriptProgramPointer ScriptEngineQtScript::newProgram(const QString& sourceCode, · 29 unmodified lines
783770 ScriptValue ScriptEngineQtScript::newQObject(QObject* object,
784771 ScriptEngine::ValueOwnership ownership,
785772 const ScriptEngine::QObjectWrapOptions& options) {
786− QScriptValue result = QScriptEngine::newQObject(object, static_cast<QScriptEngine::ValueOwnership>(ownership),
787− (QScriptEngine::QObjectWrapOptions)((int)options | DEFAULT_QOBJECT_WRAP_OPTIONS));
773+ QScriptValue result = ScriptObjectQtProxy::newQObject(this, object, ownership, options);
788774 return ScriptValue(new ScriptValueQtWrapper(this, std::move(result)));
789775 }
790776
@@ -824,7 +810,7 @@ ScriptValue ScriptEngineQtScript::newValue(const char* value) { · 33 unmodified lines
824810 }
825811
826812 ScriptValue ScriptEngineQtScript::newVariant(const QVariant& value) {
827− QScriptValue result = QScriptEngine::newVariant(value);
813+ QScriptValue result = castVariantToValue(value);
828814 return ScriptValue(new ScriptValueQtWrapper(this, std::move(result)));
829815 }
830816
@@ -832,13 +818,6 @@ ScriptValue ScriptEngineQtScript::nullValue() { · 1 unmodified line
832818 return _nullValue;
833819 }
834820
835−void ScriptEngineQtScript::setDefaultPrototype(int metaTypeId, const ScriptValue& prototype){
836− ScriptValueQtWrapper* unwrappedPrototype = ScriptValueQtWrapper::unwrap(prototype);
837− if (unwrappedPrototype) {
838− QScriptEngine::setDefaultPrototype(metaTypeId, unwrappedPrototype->toQtValue());
839− }
840−}
841−
842821 ScriptValue ScriptEngineQtScript::undefinedValue() {
843822 return _undefinedValue;
844823 }
@@ -928,112 +907,26 @@ bool ScriptEngineQtScript::raiseException(const ScriptValue& exception) { · 83 unmodified lines
928907 }
929908
930909 ScriptValue ScriptEngineQtScript::create(int type, const void* ptr) {
931− QScriptValue result = qScriptValueFromValue_helper(this, type, ptr);
932− return ScriptValue(new ScriptValueQtWrapper(const_cast<ScriptEngineQtScript*>(this), std::move(result)));
910+ QVariant variant(type, ptr);
911+ QScriptValue scriptValue = castVariantToValue(variant);
912+ return ScriptValue(new ScriptValueQtWrapper(this, std::move(scriptValue)));
933913 }
934914
935−bool ScriptEngineQtScript::convert(const ScriptValue& value, int type, void* ptr) {
915+QVariant ScriptEngineQtScript::convert(const ScriptValue& value, int type) {
936916 ScriptValueQtWrapper* unwrapped = ScriptValueQtWrapper::unwrap(value);
937917 if (unwrapped == nullptr) {
938− return false;
918+ return QVariant();
939919 }
940− return qscriptvalue_cast_helper(unwrapped->toQtValue(), type, ptr);
941−}
942920
943−template <int i>
944−class CustomTypeInstance {
945−public:
946− static ScriptEngine::MarshalFunction marshalFunc;
947− static ScriptEngine::DemarshalFunction demarshalFunc;
948−
949− static QScriptValue internalMarshalFunc(QScriptEngine* engine, const void* src) {
950− ScriptEngineQtScript* unwrappedEngine = static_cast<ScriptEngineQtScript*>(engine);
951− ScriptValue dest = marshalFunc(unwrappedEngine, src);
952− return ScriptValueQtWrapper::fullUnwrap(unwrappedEngine, dest);
953− }
954−
955− static void internalDemarshalFunc(const QScriptValue& src, void* dest) {
956− ScriptEngineQtScript* unwrappedEngine = static_cast<ScriptEngineQtScript*>(src.engine());
957− ScriptValue wrappedSrc(new ScriptValueQtWrapper(unwrappedEngine, src));
958− demarshalFunc(wrappedSrc, dest);
959− }
960−};
961−template <int i>
962−ScriptEngine::MarshalFunction CustomTypeInstance<i>::marshalFunc;
963−template <int i>
964−ScriptEngine::DemarshalFunction CustomTypeInstance<i>::demarshalFunc;
965−
966−// I would *LOVE* it if there was a different way to do this, jeez!
967−// Qt requires two functions that have no parameters that give any context,
968−// one of the must return a QScriptValue (so we can't void* them into generics and stick them in the templates).
969−// This *has* to be done via templates but the whole point of this is to avoid leaking types into the rest of
970−// the system that would require anyone other than us to have a dependency on QtScript
971−#define CUSTOM_TYPE_ENTRY(idx) \
972− case idx: \
973− CustomTypeInstance<idx>::marshalFunc = marshalFunc; \
974− CustomTypeInstance<idx>::demarshalFunc = demarshalFunc; \
975− internalMarshalFunc = CustomTypeInstance<idx>::internalMarshalFunc; \
976− internalDemarshalFunc = CustomTypeInstance<idx>::internalDemarshalFunc; \
977− break;
978−#define CUSTOM_TYPE_ENTRY_10(idx) \
979− CUSTOM_TYPE_ENTRY((idx * 10)); \
980− CUSTOM_TYPE_ENTRY((idx * 10) + 1); \
981− CUSTOM_TYPE_ENTRY((idx * 10) + 2); \
982− CUSTOM_TYPE_ENTRY((idx * 10) + 3); \
983− CUSTOM_TYPE_ENTRY((idx * 10) + 4); \
984− CUSTOM_TYPE_ENTRY((idx * 10) + 5); \
985− CUSTOM_TYPE_ENTRY((idx * 10) + 6); \
986− CUSTOM_TYPE_ENTRY((idx * 10) + 7); \
987− CUSTOM_TYPE_ENTRY((idx * 10) + 8); \
988− CUSTOM_TYPE_ENTRY((idx * 10) + 9);
989−
990−void ScriptEngineQtScript::registerCustomType(int type,
991− ScriptEngine::MarshalFunction marshalFunc,
992− ScriptEngine::DemarshalFunction demarshalFunc,
993− const ScriptValue& prototype)
994−{
995− QScriptValue unwrapped = ScriptValueQtWrapper::fullUnwrap(this, prototype);
996− QScriptEngine::MarshalFunction internalMarshalFunc;
997− QScriptEngine::DemarshalFunction internalDemarshalFunc;
921+ QVariant var;
922+ if (!castValueToVariant(unwrapped->toQtValue(), var, type)) {
923+ return QVariant();
924+ }
998925
999− if (_nextCustomType >= 300) { // have we ran out of translators?
1000− Q_ASSERT(false);
1001− return;
926+ int destType = var.userType();
927+ if (destType != type) {
928+ var.convert(type); // if conversion fails then var is set to QVariant()
1002929 }
1003930
1004− switch (_nextCustomType++) {
1005− CUSTOM_TYPE_ENTRY_10(0);
1006− CUSTOM_TYPE_ENTRY_10(1);
1007− CUSTOM_TYPE_ENTRY_10(2);
1008− CUSTOM_TYPE_ENTRY_10(3);
1009− CUSTOM_TYPE_ENTRY_10(4);
1010− CUSTOM_TYPE_ENTRY_10(5);
1011− CUSTOM_TYPE_ENTRY_10(6);
1012− CUSTOM_TYPE_ENTRY_10(7);
1013− CUSTOM_TYPE_ENTRY_10(8);
1014− CUSTOM_TYPE_ENTRY_10(9);
1015− CUSTOM_TYPE_ENTRY_10(10);
1016− CUSTOM_TYPE_ENTRY_10(11);
1017− CUSTOM_TYPE_ENTRY_10(12);
1018− CUSTOM_TYPE_ENTRY_10(13);
1019− CUSTOM_TYPE_ENTRY_10(14);
1020− CUSTOM_TYPE_ENTRY_10(15);
1021− CUSTOM_TYPE_ENTRY_10(16);
1022− CUSTOM_TYPE_ENTRY_10(17);
1023− CUSTOM_TYPE_ENTRY_10(18);
1024− CUSTOM_TYPE_ENTRY_10(19);
1025− CUSTOM_TYPE_ENTRY_10(20);
1026− CUSTOM_TYPE_ENTRY_10(21);
1027− CUSTOM_TYPE_ENTRY_10(22);
1028− CUSTOM_TYPE_ENTRY_10(23);
1029− CUSTOM_TYPE_ENTRY_10(24);
1030− CUSTOM_TYPE_ENTRY_10(25);
1031− CUSTOM_TYPE_ENTRY_10(26);
1032− CUSTOM_TYPE_ENTRY_10(27);
1033− CUSTOM_TYPE_ENTRY_10(28);
1034− CUSTOM_TYPE_ENTRY_10(29);
1035− CUSTOM_TYPE_ENTRY_10(30);
1036− }
1037−
1038− qScriptRegisterMetaType_helper(this, type, internalMarshalFunc, internalDemarshalFunc, unwrapped);
931+ return var;
1039932 }