History

Fixes for code review

ksuprynowicz committed 4 years ago

Commit 586bd7f1 parent e9bfdd416 files · +142 −117Browse files

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

Unified · Split

libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp+42−36
@@ -17,6 +17,8 @@ · 16 unmodified lines
17 17
18#include <QtScript/QScriptContext>18#include <QtScript/QScriptContext>
19 19
20#include "../ScriptEngineLogging.h"
21
20#include "ScriptContextQtWrapper.h"22#include "ScriptContextQtWrapper.h"
21#include "ScriptValueQtWrapper.h"23#include "ScriptValueQtWrapper.h"
22 24
@@ -190,7 +192,7 @@ void ScriptObjectQtProxy::investigate() { · 167 unmodified lines
190 }192 }
191 break;193 break;
192 default:194 default:
193 ;195 break;
194 }196 }
195 197
196 QScriptString name = _engine->toStringHandle(QString::fromLatin1(szName));198 QScriptString name = _engine->toStringHandle(QString::fromLatin1(szName));
@@ -214,11 +216,11 @@ void ScriptObjectQtProxy::investigate() { · 17 unmodified lines
214 } else {216 } else {
215 int parameterCount = method.parameterCount();217 int parameterCount = method.parameterCount();
216 if(method.returnType() == QMetaType::UnknownType) {218 if(method.returnType() == QMetaType::UnknownType) {
217 qCritical() << "Method " << metaObject->className() << "::" << name << " has QMetaType::UnknownType return value";219 qCritical(scriptengine) << "Method " << metaObject->className() << "::" << name << " has QMetaType::UnknownType return value";
218 }220 }
219 for (int i = 0; i < method.parameterCount(); i++) {221 for (int i = 0; i < method.parameterCount(); i++) {
220 if (method.parameterType(i) == QMetaType::UnknownType) {222 if (method.parameterType(i) == QMetaType::UnknownType) {
221 qCritical() << "Parameter " << i << "in method " << metaObject->className() << "::" << name << " is of type QMetaType::UnknownType";223 qCritical(scriptengine) << "Parameter " << i << "in method " << metaObject->className() << "::" << name << " is of type QMetaType::UnknownType";
222 }224 }
223 }225 }
224 if (nameLookup == methodNames.end()) {226 if (nameLookup == methodNames.end()) {
@@ -331,10 +333,8 @@ QScriptValue ScriptObjectQtProxy::property(const QScriptValue& object, const QSc · 106 unmodified lines
331 if (lookup == _methods.cend()) return QScriptValue();333 if (lookup == _methods.cend()) return QScriptValue();
332 const MethodDef& methodDef = lookup.value();334 const MethodDef& methodDef = lookup.value();
333 for (auto iter = methodDef.methods.begin(); iter != methodDef.methods.end(); iter++ ) {335 for (auto iter = methodDef.methods.begin(); iter != methodDef.methods.end(); iter++ ) {
334 //qDebug() << (*iter).returnType();
335 if((*iter).returnType() == QMetaType::UnknownType) {336 if((*iter).returnType() == QMetaType::UnknownType) {
336 qDebug() << "Method with QMetaType::UnknownType " << metaObject->className() << " " << (*iter).name();337 qDebug(scriptengine) << "Method with QMetaType::UnknownType " << metaObject->className() << " " << (*iter).name();
337 printf("Method with QMetaType::UnknownType");
338 }338 }
339 }339 }
340 return static_cast<QScriptEngine*>(_engine)->newObject(340 return static_cast<QScriptEngine*>(_engine)->newObject(
@@ -466,25 +466,22 @@ QVariant ScriptMethodQtProxy::extension(Extension extension, const QVariant& arg · 125 unmodified lines
466 QVector< QList<ScriptValue> > qScriptArgLists;466 QVector< QList<ScriptValue> > qScriptArgLists;
467 QVector< QVector <QGenericArgument> > qGenArgsVectors;467 QVector< QVector <QGenericArgument> > qGenArgsVectors;
468 QVector< QList<QVariant> > qVarArgLists;468 QVector< QList<QVariant> > qVarArgLists;
469 QVector<int> conversionPenaltyScore;
470 QVector<bool> isMetaRejected;
471 qScriptArgLists.resize(num_metas);469 qScriptArgLists.resize(num_metas);
472 qGenArgsVectors.resize(num_metas);470 qGenArgsVectors.resize(num_metas);
473 qVarArgLists.resize(num_metas);471 qVarArgLists.resize(num_metas);
474 conversionPenaltyScore.resize(num_metas);472 bool isValidMetaSelected = false;
475 isMetaRejected.resize(num_metas);473 int bestMeta = 0;
474 int bestConversionPenaltyScore = 0;
476 475
477 for (int i = 0; i < num_metas; i++) {476 for (int i = 0; i < num_metas; i++) {
478 const QMetaMethod& meta = _metas[i];477 const QMetaMethod& meta = _metas[i];
479 isMetaRejected[i] = false;
480 int methodNumArgs = meta.parameterCount();478 int methodNumArgs = meta.parameterCount();
481 if (methodNumArgs != numArgs) {479 if (methodNumArgs != numArgs) {
482 isMetaRejected[i] = true;
483 continue;480 continue;
484 }481 }
485 482
486 qGenArgsVectors[i].resize(10);483 qGenArgsVectors[i].resize(10);
487 conversionPenaltyScore[i] = 0;484 int conversionPenaltyScore = 0;
488 int conversionFailures = 0;485 int conversionFailures = 0;
489 486
490 for (int arg = 0; arg < numArgs; ++arg) {487 for (int arg = 0; arg < numArgs; ++arg) {
@@ -504,7 +501,7 @@ QVariant ScriptMethodQtProxy::extension(Extension extension, const QVariant& arg · 13 unmodified lines
504 } else {501 } else {
505 qVarArgLists[i].append(varArgVal);502 qVarArgLists[i].append(varArgVal);
506 const QVariant& converted = qVarArgLists[i].back();503 const QVariant& converted = qVarArgLists[i].back();
507 conversionPenaltyScore[i] = _engine->computeCastPenalty(argVal, methodArgTypeId);504 conversionPenaltyScore = _engine->computeCastPenalty(argVal, methodArgTypeId);
508 505
509 // a lot of type conversion assistance thanks to https://stackoverflow.com/questions/28457819/qt-invoke-method-with-qvariant506 // a lot of type conversion assistance thanks to https://stackoverflow.com/questions/28457819/qt-invoke-method-with-qvariant
510 // A const_cast is needed because calling data() would detach the QVariant.507 // A const_cast is needed because calling data() would detach the QVariant.
@@ -518,27 +515,23 @@ QVariant ScriptMethodQtProxy::extension(Extension extension, const QVariant& arg · 7 unmodified lines
518 parameterConversionFailureCount = conversionFailures;515 parameterConversionFailureCount = conversionFailures;
519 parameterConversionFailureId = meta.methodIndex();516 parameterConversionFailureId = meta.methodIndex();
520 }517 }
521 isMetaRejected[i] = true;
522 continue;518 continue;
523 }519 }
524 520
525 ScriptContextQtWrapper ourContext(_engine, context);521 if (!isValidMetaSelected) {
526 ScriptContextGuard guard(&ourContext);
527 }
528
529 bool isValidMetaSelected = false;
530 int bestMeta = 0;
531 for (int i = 0; i < num_metas; i++) {
532 if (!isValidMetaSelected && !isMetaRejected[i]) {
533 isValidMetaSelected = true;522 isValidMetaSelected = true;
534 bestMeta = i;523 bestMeta = i;
524 bestConversionPenaltyScore = conversionPenaltyScore;
535 }525 }
536 if (isValidMetaSelected && !isMetaRejected[i] && conversionPenaltyScore[bestMeta] > conversionPenaltyScore[i]) {526 if (isValidMetaSelected && bestConversionPenaltyScore > conversionPenaltyScore) {
537 bestMeta = i;527 bestMeta = i;
528 bestConversionPenaltyScore = conversionPenaltyScore;
538 }529 }
539 }530 }
540 531
541 if (isValidMetaSelected) {532 if (isValidMetaSelected) {
533 ScriptContextQtWrapper ourContext(_engine, context);
534 ScriptContextGuard guard(&ourContext);
542 const QMetaMethod& meta = _metas[bestMeta];535 const QMetaMethod& meta = _metas[bestMeta];
543 int returnTypeId = meta.returnType();536 int returnTypeId = meta.returnType();
544 QVector <QGenericArgument> &qGenArgs = qGenArgsVectors[bestMeta];537 QVector <QGenericArgument> &qGenArgs = qGenArgsVectors[bestMeta];
@@ -649,7 +642,7 @@ int ScriptSignalQtProxy::qt_metacall(QMetaObject::Call call, int id, void** argu · 104 unmodified lines
649 642
650 for (ConnectionList::iterator iter = connections.begin(); iter != connections.end(); ++iter) {643 for (ConnectionList::iterator iter = connections.begin(); iter != connections.end(); ++iter) {
651 Connection& conn = *iter;644 Connection& conn = *iter;
652 conn.callback.call(conn.thisValue, args);645 conn.callback.call(conn.thisValue, args);
653 }646 }
654 647
655 return -1;648 return -1;
@@ -662,6 +655,15 @@ int ScriptSignalQtProxy::discoverMetaCallIdx() { · 6 unmodified lines
662 655
663ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject, QScriptValue callback) {656ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject, QScriptValue callback) {
664 ConnectionList::iterator iter;657 ConnectionList::iterator iter;
658/* resultWithReadLock<ScriptSignalQtProxy::ConnectionList::iterator>([&]{
659 for (iter = _connections.begin(); iter != _connections.end(); ++iter) {
660 Connection& conn = *iter;
661 if (conn.callback.strictlyEquals(callback) && conn.thisValue.strictlyEquals(thisObject)) {
662 break;
663 }
664 }
665 return iter;
666 });*/
665 withReadLock([&]{667 withReadLock([&]{
666 for (iter = _connections.begin(); iter != _connections.end(); ++iter) {668 for (iter = _connections.begin(); iter != _connections.end(); ++iter) {
667 Connection& conn = *iter;669 Connection& conn = *iter;
@@ -698,9 +700,11 @@ void ScriptSignalQtProxy::connect(QScriptValue arg0, QScriptValue arg1) { · 30 unmodified lines
698 }700 }
699 701
700 // are we already connected?702 // are we already connected?
701 ConnectionList::iterator lookup = findConnection(callbackThis, callback);703 {
702 if (lookup != _connections.end()) {704 ConnectionList::iterator lookup = findConnection(callbackThis, callback);
703 return; // already exists705 if (lookup != _connections.end()) {
706 return; // already exists
707 }
704 }708 }
705 709
706 // add a reference to ourselves to the destination callback710 // add a reference to ourselves to the destination callback
@@ -757,15 +761,17 @@ void ScriptSignalQtProxy::disconnect(QScriptValue arg0, QScriptValue arg1) { · 50 unmodified lines
757 }761 }
758 762
759 // locate this connection in our list of connections763 // locate this connection in our list of connections
760 ConnectionList::iterator lookup = findConnection(callbackThis, callback);764 {
761 if (lookup == _connections.end()) {765 ConnectionList::iterator lookup = findConnection(callbackThis, callback);
762 return; // not here766 if (lookup == _connections.end()) {
763 }767 return; // not here
768 }
764 769
765 // remove it from our internal list of connections770 // remove it from our internal list of connections
766 withWriteLock([&]{771 withWriteLock([&]{
767 _connections.erase(lookup);772 _connections.erase(lookup);
768 });773 });
774 }
769 775
770 // remove a reference to ourselves from the destination callback776 // remove a reference to ourselves from the destination callback
771 QScriptValue destData = callback.data();777 QScriptValue destData = callback.data();