私は遊んでいてlibpeas
、gobject-introspection の動作に関する問題に遭遇しました。
には(こちらlibpeas
を参照)というタイプがあります。PluginLoader
へのポイントであるcreate_extension
を返すと呼ばれるメソッドがあります。このタイプを gobject-introspection に追加し、このメソッドの結果の GIR ファイルを確認すると、次のようにマークされていることがわかります。PeasExtension *
GObject
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 イントロスペクション ドキュメントを読むと、GObject インスタンスを返すことが有効なユース ケースのように見えます。多分それはそのPluginLoader
型が抽象的で、これが仮想メソッドであることと関係がありますか?
メソッドの署名を変更せずに、このオブジェクトを内省可能にするのに役立つ注釈はありますか?