Showing the changes to libraries/script-engine/src/qtscript/ScriptObjectQtProxy.cpp (1 of 16 files). Show all
Unified · Split
| @@ -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-qvariant | 506 | // 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 | ||
| 663 | ScriptSignalQtProxy::ConnectionList::iterator ScriptSignalQtProxy::findConnection(QScriptValue thisObject, QScriptValue callback) { | 656 | ScriptSignalQtProxy::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 exists | 705 | if (lookup != _connections.end()) { |
| 706 | return; // already exists | ||
| 707 | } | ||
| 704 | } | 708 | } |
| 705 | 709 | ||
| 706 | // add a reference to ourselves to the destination callback | 710 | // 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 connections | 763 | // 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 here | 766 | if (lookup == _connections.end()) { |
| 763 | } | 767 | return; // not here |
| 768 | } | ||
| 764 | 769 | ||
| 765 | // remove it from our internal list of connections | 770 | // 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 callback | 776 | // remove a reference to ourselves from the destination callback |
| 771 | QScriptValue destData = callback.data(); | 777 | QScriptValue destData = callback.data(); |