From ebf9aed32e291bb832fa59fa8dd6f17fe004e4e2 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Mon, 8 Feb 2010 13:25:59 -0300 Subject: Reactivated 'reference-count' tag. The type system tag '' used on argument modification was uncommented, documentation was written and a unit test was created for it. Reviewed by Hugo Parente --- doc/typesystem_arguments.rst | 32 +++++++++++++++++++++++- tests/CMakeLists.txt | 15 +++++------ tests/testrefcounttag.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++ tests/testrefcounttag.h | 36 +++++++++++++++++++++++++++ typesystem.cpp | 16 +++--------- 5 files changed, 138 insertions(+), 20 deletions(-) create mode 100644 tests/testrefcounttag.cpp create mode 100644 tests/testrefcounttag.h diff --git a/doc/typesystem_arguments.rst b/doc/typesystem_arguments.rst index eb0355092..eef455d9c 100644 --- a/doc/typesystem_arguments.rst +++ b/doc/typesystem_arguments.rst @@ -112,7 +112,37 @@ define-ownership - + + + +reference-count +^^^^^^^^^^^^^^^ + + The reference-count tag dictates how an argument should be handled by the + target language reference counting system (if there is any), it also indicates + the kind of relationship the class owning the function being modified has with + the argument. For instance, in a model/view relation a view receiving a model + as argument for a **setModel** method should increment the model's reference + counting, since the model should be kept alive as much as the view lives. + Remember that out hypothetical view could not become parent of the model, + since the said model could be used by other views as well. + The ``action`` attribute specifies what should be done to the argument + reference counting when the modified method is called. It accepts the + following values: + + * add: increments the argument reference counter. + * remove: decrements the argument reference counter. + * ignore: does nothing with the argument reference counter + (sounds worthless, but could be used in situations + where the reference counter increase is mandatory + by default). + + .. code-block:: xml + + + + + replace-value ^^^^^^^^^^^^^ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 995e40d49..961f80d3f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -9,14 +9,15 @@ endmacro(declare_test testname) declare_test(testabstractmetaclass) declare_test(testabstractmetatype) -declare_test(testenum) -declare_test(testmodifydocumentation) declare_test(testaddfunction) +declare_test(testcodeinjection) declare_test(testconversionruletag) -declare_test(testreverseoperators) declare_test(testdtorinformation) -declare_test(testremoveimplconv) -declare_test(testmultipleinheritance) -declare_test(testmodifyfunction) -declare_test(testcodeinjection) +declare_test(testenum) declare_test(testimplicitconversions) +declare_test(testmodifydocumentation) +declare_test(testmodifyfunction) +declare_test(testmultipleinheritance) +declare_test(testrefcounttag) +declare_test(testremoveimplconv) +declare_test(testreverseoperators) diff --git a/tests/testrefcounttag.cpp b/tests/testrefcounttag.cpp new file mode 100644 index 000000000..5d3a45c77 --- /dev/null +++ b/tests/testrefcounttag.cpp @@ -0,0 +1,59 @@ +/* +* This file is part of the API Extractor project. +* +* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +* +* Contact: PySide team +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +* 02110-1301 USA +* +*/ + +#include "testrefcounttag.h" +#include +#include "testutil.h" + +void TestRefCountTag::testReferenceCountTag() +{ + const char* cppCode ="\ + struct A {};\ + struct B {\ + void keepObject(B* b);\ + };\ + "; + const char* xmlCode = "\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + "; + TestUtil t(cppCode, xmlCode, false); + AbstractMetaClassList classes = t.builder()->classes(); + AbstractMetaClass* classB = classes.findClass("B"); + const AbstractMetaFunction* func = classB->findFunction("keepObject"); + + ReferenceCount refCount = func->modifications().first().argument_mods.first().referenceCounts.first(); + QCOMPARE(refCount.action, ReferenceCount::Add); +} + +QTEST_APPLESS_MAIN(TestRefCountTag) + +#include "testrefcounttag.moc" + diff --git a/tests/testrefcounttag.h b/tests/testrefcounttag.h new file mode 100644 index 000000000..665266238 --- /dev/null +++ b/tests/testrefcounttag.h @@ -0,0 +1,36 @@ +/* +* This file is part of the API Extractor project. +* +* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +* +* Contact: PySide team +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +* 02110-1301 USA +* +*/ + +#ifndef TESTREFCOUNTTAG_H +#define TESTREFCOUNTTAG_H + +#include + +class TestRefCountTag : public QObject +{ + Q_OBJECT + private slots: + void testReferenceCountTag(); +}; + +#endif diff --git a/typesystem.cpp b/typesystem.cpp index 89dfd4768..69bc8455a 100644 --- a/typesystem.cpp +++ b/typesystem.cpp @@ -97,10 +97,8 @@ public: DefineOwnership = 0x10000000, RemoveDefaultExpression = 0x20000000, NoNullPointers = 0x40000000, -#if 0 ReferenceCount = 0x80000000, -#endif - ParentOwner = 0x80000000, + ParentOwner = 0x90000000, ArgumentModifiers = 0xff000000 }; @@ -160,9 +158,7 @@ public: tagNames["insert-template"] = StackElement::TemplateInstanceEnum; tagNames["replace"] = StackElement::Replace; tagNames["no-null-pointer"] = StackElement::NoNullPointers; -#if 0 tagNames["reference-count"] = StackElement::ReferenceCount; -#endif tagNames["parent"] = StackElement::ParentOwner; tagNames["inject-documentation"] = StackElement::InjectDocumentation; tagNames["modify-documentation"] = StackElement::ModifyDocumentation; @@ -925,11 +921,9 @@ bool Handler::startElement(const QString &, const QString &n, attributes["from"] = QString(); attributes["to"] = QString(); break; -#if 0 case StackElement::ReferenceCount: attributes["action"] = QString(); break; -#endif case StackElement::ParentOwner: attributes["index"] = QString(); attributes["action"] = QString(); @@ -1417,7 +1411,6 @@ bool Handler::startElement(const QString &, const QString &n, element->value.customFunction = func; } break; -#if 0 case StackElement::ReferenceCount: { if (topElement.type != StackElement::ModifyArgument) { m_error = "reference-count must be child of modify-argument"; @@ -1429,9 +1422,9 @@ bool Handler::startElement(const QString &, const QString &n, static QHash actions; if (actions.isEmpty()) { actions["add"] = ReferenceCount::Add; - actions["add-all"] = ReferenceCount::AddAll; + //actions["add-all"] = ReferenceCount::AddAll; actions["remove"] = ReferenceCount::Remove; - actions["set"] = ReferenceCount::Set; + //actions["set"] = ReferenceCount::Set; actions["ignore"] = ReferenceCount::Ignore; } rc.action = actions.value(attributes["action"].toLower(), ReferenceCount::Invalid); @@ -1439,13 +1432,12 @@ bool Handler::startElement(const QString &, const QString &n, if (rc.action == ReferenceCount::Invalid) { m_error = "unrecognized value for action attribute. supported actions:"; foreach (QString action, actions.keys()) - m_error += " " + action; + m_error += " " + action; } m_functionMods.last().argument_mods.last().referenceCounts.append(rc); } break; -#endif case StackElement::ParentOwner: { if (topElement.type != StackElement::ModifyArgument) { -- cgit v1.2.3