identify the largest number of parameters any of our method overrides accept and discard script parameters beyond that count

This commit is contained in:
Heather Anderson 2022-03-20 22:12:34 -07:00 committed by ksuprynowicz
parent baf8aef694
commit 71ce8b6bf2
2 changed files with 12 additions and 5 deletions

View file

@ -205,9 +205,11 @@ void ScriptObjectQtProxy::investigate() {
} }
} }
} else { } else {
int parameterCount = method.parameterCount();
if (nameLookup == methodNames.end()) { if (nameLookup == methodNames.end()) {
MethodDef& methodDef = _methods.insert(idx, MethodDef()).value(); MethodDef& methodDef = _methods.insert(idx, MethodDef()).value();
methodDef.name = name; methodDef.name = name;
methodDef.numMaxParms = parameterCount;
methodDef.methods.append(method); methodDef.methods.append(method);
methodNames.insert(name, idx); methodNames.insert(name, idx);
} else { } else {
@ -215,6 +217,7 @@ void ScriptObjectQtProxy::investigate() {
MethodDefMap::iterator methodLookup = _methods.find(originalMethodId); MethodDefMap::iterator methodLookup = _methods.find(originalMethodId);
Q_ASSERT(methodLookup != _methods.end()); Q_ASSERT(methodLookup != _methods.end());
MethodDef& methodDef = methodLookup.value(); MethodDef& methodDef = methodLookup.value();
if(methodDef.numMaxParms < parameterCount) methodDef.numMaxParms = parameterCount;
methodDef.methods.append(method); methodDef.methods.append(method);
} }
} }
@ -312,8 +315,9 @@ QScriptValue ScriptObjectQtProxy::property(const QScriptValue& object, const QSc
int methodId = id & ~TYPE_MASK; int methodId = id & ~TYPE_MASK;
MethodDefMap::const_iterator lookup = _methods.find(methodId); MethodDefMap::const_iterator lookup = _methods.find(methodId);
if (lookup == _methods.cend()) return QScriptValue(); if (lookup == _methods.cend()) return QScriptValue();
const MethodDef& methodDef = lookup.value();
return static_cast<QScriptEngine*>(_engine)->newObject( return static_cast<QScriptEngine*>(_engine)->newObject(
new ScriptMethodQtProxy(_engine, qobject, object, lookup.value().methods)); new ScriptMethodQtProxy(_engine, qobject, object, methodDef.methods, methodDef.numMaxParms));
} }
case SIGNAL_TYPE: { case SIGNAL_TYPE: {
int signalId = id & ~TYPE_MASK; int signalId = id & ~TYPE_MASK;
@ -430,8 +434,7 @@ QVariant ScriptMethodQtProxy::extension(Extension extension, const QVariant& arg
} }
int scriptNumArgs = context->argumentCount(); int scriptNumArgs = context->argumentCount();
Q_ASSERT(scriptNumArgs < 10); int numArgs = std::min(scriptNumArgs, _numMaxParms);
int numArgs = std::min(scriptNumArgs, 10);
const int scriptValueTypeId = qMetaTypeId<ScriptValue>(); const int scriptValueTypeId = qMetaTypeId<ScriptValue>();

View file

@ -41,6 +41,7 @@ private: // implementation
}; };
struct MethodDef { struct MethodDef {
QScriptString name; QScriptString name;
int numMaxParms;
QList<QMetaMethod> methods; QList<QMetaMethod> methods;
}; };
struct SignalDef { struct SignalDef {
@ -137,8 +138,10 @@ private: // storage
class ScriptMethodQtProxy final : public QScriptClass { class ScriptMethodQtProxy final : public QScriptClass {
public: // construction public: // construction
inline ScriptMethodQtProxy(ScriptEngineQtScript* engine, QObject* object, QScriptValue lifetime, const QList<QMetaMethod>& metas) : inline ScriptMethodQtProxy(ScriptEngineQtScript* engine, QObject* object, QScriptValue lifetime,
QScriptClass(engine), _engine(engine), _object(object), _objectLifetime(lifetime), _metas(metas) {} const QList<QMetaMethod>& metas, int numMaxParms) :
QScriptClass(engine),
_engine(engine), _object(object), _objectLifetime(lifetime), _metas(metas), _numMaxParms(numMaxParms) {}
public: // QScriptClass implementation public: // QScriptClass implementation
virtual QString name() const override { return fullName(); } virtual QString name() const override { return fullName(); }
@ -149,6 +152,7 @@ private:
QString fullName() const; QString fullName() const;
private: // storage private: // storage
const int _numMaxParms;
ScriptEngineQtScript* _engine; ScriptEngineQtScript* _engine;
QPointer<QObject> _object; QPointer<QObject> _object;
QScriptValue _objectLifetime; QScriptValue _objectLifetime;