Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-35386

Cannot modify object stored in QSharedPointer in QtScript

    XMLWordPrintable

Details

    • Suggestion
    • Resolution: Out of scope
    • P3: Somewhat important
    • None
    • 5.2.0 Beta1
    • Qt Script
    • None

    Description

      See the following unit test:

      #include <QtCore>
      #include <QtTest>
      #include <QtScript/QScriptEngine>
      
      class SandboxTest : public QObject
      {
          Q_OBJECT
          
      public:
          SandboxTest();
          
      private Q_SLOTS:
          void testCase1();
      };
      
      SandboxTest::SandboxTest()
      {
      }
      
      inline bool evaluateScript(QScriptEngine *scriptEngine, const QScriptProgram &script) {
          scriptEngine->evaluate(script);
          if (scriptEngine->hasUncaughtException()) {
              qWarning() << scriptEngine->uncaughtException().toString() << ":"
                         << scriptEngine->uncaughtExceptionLineNumber() << scriptEngine->uncaughtExceptionBacktrace();
              return false;
          }
          return true;
      }
      
      inline bool handleScriptErrors(QScriptEngine *scriptEngine) {
          if (scriptEngine->hasUncaughtException()) {
              qWarning() << scriptEngine->uncaughtException().toString() << ":"
                         << scriptEngine->uncaughtExceptionLineNumber() << scriptEngine->uncaughtExceptionBacktrace();
              return false;
          }
          return true;
      }
      
      class Object : public QObject
      {
          Q_OBJECT
      public:
          Q_PROPERTY(int x READ x WRITE setX)
      
          Object(int x) : mX(x) {}
      
          int x() const { return mX; }
          void setX(int x) { mX = x; }
      private:
          int mX;
      };
      
      Q_DECLARE_METATYPE(QSharedPointer<Object>)
      
      void SandboxTest::testCase1()
      {
          qRegisterMetaType<QSharedPointer<Object> >("QSharedPointer<Object>");
      
          QScriptEngine scriptEngine;
      
          QScriptProgram script("function blah(object) { print(\"in blah()\"); object.x = 6; }");
          Q_ASSERT(evaluateScript(&scriptEngine, script));
      
          QSharedPointer<Object> object(new Object(5));
          QVariant objectVariant(QVariant::fromValue(object));
          QVERIFY(objectVariant.isValid());
      
          QVERIFY(objectVariant.canConvert<QSharedPointer<Object> >());
          QSharedPointer<Object> fromObjectVariant(objectVariant.value<QSharedPointer<Object> >());
          QCOMPARE(fromObjectVariant->x(), 5);
      
          QScriptValueList args;
          args << scriptEngine.newVariant(objectVariant);
      
          scriptEngine.globalObject().property("blah").call(scriptEngine.globalObject(), args);
      
          QVERIFY(handleScriptErrors(&scriptEngine));
          QCOMPARE(object->x(), 6);
      }
      
      QTEST_MAIN(SandboxTest)
      
      #include "tst_SandboxTest.moc"
      

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            laknoll Lars Knoll
            mitch_curtis Mitch Curtis
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes