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