aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2010-02-08 13:25:59 -0300
committerHugo Lima <hugo.lima@openbossa.org>2010-02-09 18:59:24 -0200
commitebf9aed32e291bb832fa59fa8dd6f17fe004e4e2 (patch)
tree86224bc76b352634f60ff9aeb27e376fd3587b78
parent8d037108eb0216e178855bb2ba22a09154454ea9 (diff)
Reactivated 'reference-count' tag.
The type system tag '<reference-count action="Add|Remove|..."/>' used on argument modification was uncommented, documentation was written and a unit test was created for it. Reviewed by Hugo Parente <hugo.lima@openbossa.org>
-rw-r--r--doc/typesystem_arguments.rst32
-rw-r--r--tests/CMakeLists.txt15
-rw-r--r--tests/testrefcounttag.cpp59
-rw-r--r--tests/testrefcounttag.h36
-rw-r--r--typesystem.cpp16
5 files changed, 138 insertions, 20 deletions
diff --git a/doc/typesystem_arguments.rst b/doc/typesystem_arguments.rst
index eb035509..eef455d9 100644
--- a/doc/typesystem_arguments.rst
+++ b/doc/typesystem_arguments.rst
@@ -112,7 +112,37 @@ define-ownership
<modify-argument>
<define-ownership class="target | shell"
owner="target | c++ | default" />
- </modify-argument>
+ </modify-argument>
+
+
+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
+
+ <modify-argument>
+ <reference-count action="add|remove|ignore" />
+ </modify-argument>
+
replace-value
^^^^^^^^^^^^^
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 995e40d4..961f80d3 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 00000000..5d3a45c7
--- /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 <contact@pyside.org>
+*
+* 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 <QtTest/QTest>
+#include "testutil.h"
+
+void TestRefCountTag::testReferenceCountTag()
+{
+ const char* cppCode ="\
+ struct A {};\
+ struct B {\
+ void keepObject(B* b);\
+ };\
+ ";
+ const char* xmlCode = "\
+ <typesystem package=\"Foo\"> \
+ <object-type name='A' /> \
+ <object-type name='B'> \
+ <modify-function signature='keepObject(B*)'>\
+ <modify-argument index='1'>\
+ <reference-count action='add' /> \
+ </modify-argument>\
+ </modify-function>\
+ </object-type>\
+ </typesystem>";
+ 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 00000000..66526623
--- /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 <contact@pyside.org>
+*
+* 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 <QObject>
+
+class TestRefCountTag : public QObject
+{
+ Q_OBJECT
+ private slots:
+ void testReferenceCountTag();
+};
+
+#endif
diff --git a/typesystem.cpp b/typesystem.cpp
index 89dfd476..69bc8455 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<QString, ReferenceCount::Action> 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) {