From 71ce8b6bf211bd3bffc221338160a55a0b793186 Mon Sep 17 00:00:00 2001 From: Heather Anderson Date: Sun, 20 Mar 2022 22:12:34 -0700 Subject: [PATCH] identify the largest number of parameters any of our method overrides accept and discard script parameters beyond that count --- .../script-engine/src/qtscript/ScriptObjectQtProxy.cpp | 9 ++++++--- .../script-engine/src/qtscript/ScriptObjectQtProxy.h | 8 ++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp b/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp index 02dbd31850..96a867b7a2 100644 --- a/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp +++ b/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp @@ -205,9 +205,11 @@ void ScriptObjectQtProxy::investigate() { } } } else { + int parameterCount = method.parameterCount(); if (nameLookup == methodNames.end()) { MethodDef& methodDef = _methods.insert(idx, MethodDef()).value(); methodDef.name = name; + methodDef.numMaxParms = parameterCount; methodDef.methods.append(method); methodNames.insert(name, idx); } else { @@ -215,6 +217,7 @@ void ScriptObjectQtProxy::investigate() { MethodDefMap::iterator methodLookup = _methods.find(originalMethodId); Q_ASSERT(methodLookup != _methods.end()); MethodDef& methodDef = methodLookup.value(); + if(methodDef.numMaxParms < parameterCount) methodDef.numMaxParms = parameterCount; methodDef.methods.append(method); } } @@ -312,8 +315,9 @@ QScriptValue ScriptObjectQtProxy::property(const QScriptValue& object, const QSc int methodId = id & ~TYPE_MASK; MethodDefMap::const_iterator lookup = _methods.find(methodId); if (lookup == _methods.cend()) return QScriptValue(); + const MethodDef& methodDef = lookup.value(); return static_cast(_engine)->newObject( - new ScriptMethodQtProxy(_engine, qobject, object, lookup.value().methods)); + new ScriptMethodQtProxy(_engine, qobject, object, methodDef.methods, methodDef.numMaxParms)); } case SIGNAL_TYPE: { int signalId = id & ~TYPE_MASK; @@ -430,8 +434,7 @@ QVariant ScriptMethodQtProxy::extension(Extension extension, const QVariant& arg } int scriptNumArgs = context->argumentCount(); - Q_ASSERT(scriptNumArgs < 10); - int numArgs = std::min(scriptNumArgs, 10); + int numArgs = std::min(scriptNumArgs, _numMaxParms); const int scriptValueTypeId = qMetaTypeId(); diff --git a/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.h b/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.h index a3844a8e53..34ee852611 100644 --- a/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.h +++ b/libraries/script-engine/src/qtscript/ScriptObjectQtProxy.h @@ -41,6 +41,7 @@ private: // implementation }; struct MethodDef { QScriptString name; + int numMaxParms; QList methods; }; struct SignalDef { @@ -137,8 +138,10 @@ private: // storage class ScriptMethodQtProxy final : public QScriptClass { public: // construction - inline ScriptMethodQtProxy(ScriptEngineQtScript* engine, QObject* object, QScriptValue lifetime, const QList& metas) : - QScriptClass(engine), _engine(engine), _object(object), _objectLifetime(lifetime), _metas(metas) {} + inline ScriptMethodQtProxy(ScriptEngineQtScript* engine, QObject* object, QScriptValue lifetime, + const QList& metas, int numMaxParms) : + QScriptClass(engine), + _engine(engine), _object(object), _objectLifetime(lifetime), _metas(metas), _numMaxParms(numMaxParms) {} public: // QScriptClass implementation virtual QString name() const override { return fullName(); } @@ -149,6 +152,7 @@ private: QString fullName() const; private: // storage + const int _numMaxParms; ScriptEngineQtScript* _engine; QPointer _object; QScriptValue _objectLifetime;