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 4d6889a677
commit a822110a62
2 changed files with 12 additions and 5 deletions

View file

@ -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<QScriptEngine*>(_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<ScriptValue>();

View file

@ -41,6 +41,7 @@ private: // implementation
};
struct MethodDef {
QScriptString name;
int numMaxParms;
QList<QMetaMethod> 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<QMetaMethod>& metas) :
QScriptClass(engine), _engine(engine), _object(object), _objectLifetime(lifetime), _metas(metas) {}
inline ScriptMethodQtProxy(ScriptEngineQtScript* engine, QObject* object, QScriptValue lifetime,
const QList<QMetaMethod>& 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<QObject> _object;
QScriptValue _objectLifetime;