[gobject-introspection] Add support for function typedefs without pointer
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gobject-introspection] Add support for function typedefs without pointer
- Date: Mon, 19 Oct 2015 22:18:47 +0000 (UTC)
commit d9a6824b2dd373f7bd3d3b3f434d2fe7069eaa51
Author: Ben Iofel <iofelben gmail com>
Date: Fri Sep 25 15:11:17 2015 -0400
Add support for function typedefs without pointer
g-ir-scanner now supports something like this:
typedef void my_callback(int);
Notice how my_callback is not a pointer.
https://bugzilla.gnome.org/show_bug.cgi?id=755645
giscanner/transformer.py | 12 +++++-
.../Regress.TestNoPtrCallback.page | 24 ++++++++++++
.../Regress.test_noptr_callback.page | 38 ++++++++++++++++++++
.../Regress.TestNoPtrCallback.page | 19 ++++++++++
.../Regress.test_noptr_callback.page | 36 ++++++++++++++++++
.../Regress.TestNoPtrCallback.page | 21 +++++++++++
.../Regress.test_noptr_callback.page | 37 +++++++++++++++++++
tests/scanner/Regress-1.0-expected.gir | 20 ++++++++++
tests/scanner/Regress-1.0-sections-expected.txt | 1 +
tests/scanner/regress.c | 14 +++++++
tests/scanner/regress.h | 4 ++
11 files changed, 224 insertions(+), 2 deletions(-)
---
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index fdb87f9..3183d62 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -596,6 +596,8 @@ raise ValueError."""
ctype = symbol.base_type.type
if (ctype == CTYPE_POINTER and symbol.base_type.base_type.type == CTYPE_FUNCTION):
node = self._create_typedef_callback(symbol)
+ elif (ctype == CTYPE_FUNCTION):
+ node = self._create_typedef_callback(symbol)
elif (ctype == CTYPE_POINTER and symbol.base_type.base_type.type == CTYPE_STRUCT):
node = self._create_typedef_compound(ast.Record, symbol, disguised=True)
elif ctype == CTYPE_STRUCT:
@@ -871,8 +873,14 @@ raise ValueError."""
compound.fields.append(field)
def _create_callback(self, symbol, member=False):
- parameters = list(self._create_parameters(symbol, symbol.base_type.base_type))
- retval = self._create_return(symbol.base_type.base_type.base_type)
+ if (symbol.base_type.type == CTYPE_FUNCTION): # function
+ paramtype = symbol.base_type
+ retvaltype = symbol.base_type.base_type
+ elif (symbol.base_type.type == CTYPE_POINTER): # function pointer
+ paramtype = symbol.base_type.base_type
+ retvaltype = symbol.base_type.base_type.base_type
+ parameters = list(self._create_parameters(symbol, paramtype))
+ retval = self._create_return(retvaltype)
# Mark the 'user_data' arguments
for i, param in enumerate(parameters):
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page
b/tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page
new file mode 100644
index 0000000..02140c2
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<page id="Regress.TestNoPtrCallback"
+ type="topic"
+ style="callback"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/1.0/ui/">
+ <info>
+ <link xref="index" group="callback" type="guide"/>
+ </info>
+ <title>Regress.TestNoPtrCallback</title>
+ <synopsis><code mime="text/x-csrc">
+void TestNoPtrCallback (void);
+ </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>Returns</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page
b/tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page
new file mode 100644
index 0000000..c760265
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<page id="Regress.test_noptr_callback"
+ type="topic"
+ style="function"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/1.0/ui/">
+ <info>
+ <link xref="index" group="function" type="guide"/>
+ <api:function>
+ <api:returns>
+ <api:type>void</api:type>
+ </api:returns>
+ <api:name>regress_test_noptr_callback</api:name>
+ <api:arg>
+ <api:type>RegressTestNoPtrCallback</api:type>
+ <api:name>callback</api:name>
+ </api:arg>
+ </api:function>
+ </info>
+ <title>regress_test_noptr_callback</title>
+ <synopsis><code mime="text/x-csrc">
+void regress_test_noptr_callback (RegressTestNoPtrCallback callback);
+ </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>callback</code></title>
+
+</item>
+<item>
+<title><code>Returns</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page
new file mode 100644
index 0000000..7dd66f4
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<page id="Regress.TestNoPtrCallback"
+ type="topic"
+ style="callback"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/1.0/ui/">
+ <info>
+ <link xref="index" group="callback" type="guide"/>
+ </info>
+ <title>Regress.TestNoPtrCallback</title>
+ <synopsis><code mime="text/x-gjs">
+function onTestNoPtrCallback(): void {
+}
+ </code></synopsis>
+
+
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page
new file mode 100644
index 0000000..a7cec65
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<page id="Regress.test_noptr_callback"
+ type="topic"
+ style="function"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/1.0/ui/">
+ <info>
+ <link xref="index" group="function" type="guide"/>
+ <api:function>
+ <api:returns>
+ <api:type>void</api:type>
+ </api:returns>
+ <api:name>regress_test_noptr_callback</api:name>
+ <api:arg>
+ <api:type>Regress.TestNoPtrCallback</api:type>
+ <api:name>callback</api:name>
+ </api:arg>
+ </api:function>
+ </info>
+ <title>Regress.test_noptr_callback</title>
+ <synopsis><code mime="text/x-gjs">
+function test_noptr_callback(callback: <link
xref="Regress.TestNoPtrCallback">Regress.TestNoPtrCallback</link>): void {
+ // Gjs wrapper for regress_test_noptr_callback()
+}
+ </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>callback</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page
b/tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page
new file mode 100644
index 0000000..b7f04f5
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<page id="Regress.TestNoPtrCallback"
+ type="topic"
+ style="callback"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/1.0/ui/">
+ <info>
+ <link xref="index" group="callback" type="guide"/>
+ </info>
+ <title>Regress.TestNoPtrCallback</title>
+ <synopsis><code mime="text/x-python">
+ returns(none)
+def on_TestNoPtrCallback():
+ </code></synopsis>
+
+
+<terms>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page
b/tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page
new file mode 100644
index 0000000..e376446
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<page id="Regress.test_noptr_callback"
+ type="topic"
+ style="function"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/1.0/ui/">
+ <info>
+ <link xref="index" group="function" type="guide"/>
+ <api:function>
+ <api:returns>
+ <api:type>none</api:type>
+ </api:returns>
+ <api:name>regress_test_noptr_callback</api:name>
+ <api:arg>
+ <api:type>Regress.TestNoPtrCallback</api:type>
+ <api:name>callback</api:name>
+ </api:arg>
+ </api:function>
+ </info>
+ <title>Regress.test_noptr_callback</title>
+ <synopsis><code mime="text/x-python">
+ accepts(Regress.TestNoPtrCallback)
+ returns(none)
+def test_noptr_callback(callback):
+ # Python wrapper for regress_test_noptr_callback()
+ </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>callback</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 620a290..6f991b7 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -2883,6 +2883,11 @@ use it should be.</doc>
<type name="GObject.TypeInterface" c:type="GTypeInterface"/>
</field>
</record>
+ <callback name="TestNoPtrCallback" c:type="RegressTestNoPtrCallback">
+ <return-value transfer-ownership="none">
+ <type name="none" c:type="void"/>
+ </return-value>
+ </callback>
<class name="TestObj"
c:symbol-prefix="test_obj"
c:type="RegressTestObj"
@@ -6224,6 +6229,21 @@ What we're testing here is that the scanner ignores the @a nested inside XML.</d
</parameter>
</parameters>
</function>
+ <function name="test_noptr_callback"
+ c:identifier="regress_test_noptr_callback">
+ <return-value transfer-ownership="none">
+ <type name="none" c:type="void"/>
+ </return-value>
+ <parameters>
+ <parameter name="callback"
+ transfer-ownership="none"
+ nullable="1"
+ allow-none="1"
+ scope="call">
+ <type name="TestNoPtrCallback" c:type="RegressTestNoPtrCallback"/>
+ </parameter>
+ </parameters>
+ </function>
<function name="test_null_gerror_callback"
c:identifier="regress_test_null_gerror_callback">
<return-value transfer-ownership="none">
diff --git a/tests/scanner/Regress-1.0-sections-expected.txt b/tests/scanner/Regress-1.0-sections-expected.txt
index 335bfec..e0f9a1b 100644
--- a/tests/scanner/Regress-1.0-sections-expected.txt
+++ b/tests/scanner/Regress-1.0-sections-expected.txt
@@ -155,6 +155,7 @@ regress_test_multi_callback
regress_test_multi_double_args
regress_test_multiline_doc_comments
regress_test_nested_parameter
+regress_test_noptr_callback
regress_test_null_gerror_callback
regress_test_owned_gerror_callback
regress_test_return_allow_none
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index 3644f4c..83175b0 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -3476,6 +3476,20 @@ regress_test_simple_callback (RegressTestSimpleCallback callback)
}
/**
+ * regress_test_noptr_callback:
+ * @callback: (scope call) (allow-none):
+ *
+ **/
+void
+regress_test_noptr_callback (RegressTestNoPtrCallback callback)
+{
+ if (callback != NULL)
+ callback();
+
+ return;
+}
+
+/**
* regress_test_callback_user_data:
* @callback: (scope call):
* @user_data: (not nullable):
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index ba0b562..d77a7a9 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -1033,6 +1033,7 @@ regress_test_fundamental_sub_object_new (const char *data);
/* callback */
typedef void (*RegressTestSimpleCallback) (void);
+typedef void RegressTestNoPtrCallback (void);
typedef int (*RegressTestCallback) (void);
typedef int (*RegressTestCallbackUserData) (gpointer user_data);
/**
@@ -1077,6 +1078,9 @@ _GI_TEST_EXTERN
void regress_test_simple_callback (RegressTestSimpleCallback callback);
_GI_TEST_EXTERN
+void regress_test_noptr_callback (RegressTestNoPtrCallback callback);
+
+_GI_TEST_EXTERN
int regress_test_callback (RegressTestCallback callback);
_GI_TEST_EXTERN
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]