0

我正在玩弄libpeas,我偶然发现了 gobject-introspection 工作方式的问题。

其中libpeas有一种类型称为PluginLoader(请参见此处)。

有一个称为create_extension返回的方法,PeasExtension *它是指向 a 的点GObject。当我将此类型添加到 gobject-introspection 并检查生成的 GIR 文件以了解此方法时,我可以看到它被标记为introspectable="0"

<field name="create_extension" introspectable="0">
<callback name="create_extension" introspectable="0">
  <source-position filename="../libpeas/peas-plugin-loader.h"
                   line="60"/>
  <return-value>
    <type name="Extension" c:type="PeasExtension*"/>
  </return-value>
  <parameters>
    <parameter name="loader" transfer-ownership="none">
      <type name="PluginLoader" c:type="PeasPluginLoader*"/>
    </parameter>
    <parameter name="info" transfer-ownership="none">
      <type name="PluginInfo" c:type="PeasPluginInfo*"/>
    </parameter>
    <parameter name="ext_type" transfer-ownership="none">
      <type name="GType" c:type="GType"/>
    </parameter>
    <parameter name="n_parameters" transfer-ownership="none">
      <type name="guint" c:type="guint"/>
    </parameter>
    <parameter name="parameters" transfer-ownership="none">
      <type name="GObject.Parameter" c:type="GParameter*"/>
    </parameter>
  </parameters>
</callback>
</field>

当我将返回值更改为void *并重新编译时,该introspectable="0"属性从 GIR 文件中消失了。如果我将其更改为,GObject *则该introspectable="0"属性仍然存在。

当它返回 GObject 的实例(指针)时,它看起来变得不可自省。但我不明白为什么?

通过阅读 gobject introspection 文档,看起来返回 GObject 实例是一个有效的用例。也许它与那种PluginLoader类型是抽象的并且这是一个虚拟方法有关?

在不更改方法签名的情况下,任何注释都可以帮助使该对象可自省吗?

4

1 回答 1

0

在 Philip 在评论中的帮助下,我设法解决了这个问题。

输出中实际上有一条消息g-ir-scanner说:

../../source/libpeas/libpeas/peas-plugin-loader.h:91: Warning: Peas: peas_plugin_loader_create_extension: return value: Missing (transfer) annotation

通过这条消息,我了解到要使虚拟函数可create_extension自省,我必须添加注释,但不是在PeasPluginLoaderClass定义中的函数指针处,而是在访问器函数旁边peas_plugin_loader_create_extension

于 2021-03-27T13:23:32.967 回答