これはValaコードの例です。Vala関数呼び出しで使用される所有属性は "黒い魔法のCコード"を作成します
いくつかのポインタを格納するグローバルGlib.Llist vstackがあります。
List<void*> vstack;
グローバルvstackリストの2番目のパラメータを格納しchange_state機能があります。それが戻ったときに、ポインタは、それがリスト
// Vala source
void goto_info()
{
StInfo sti = new StInfo();
change_state(SUPS.INFO_PAGE, sti, StackDir.FORW);
}
// C output
void goto_info (void) {
StInfo* sti = NULL;
StInfo* _tmp0_ = NULL;
_tmp0_ = st_info_new();
sti = _tmp0_;
change_state (SUPS_INFO_PAGE, sti, STACK_DIR_FORW);
_g_object_unref0 (sti);
}
に格納されていても解放され、ので(change_stateを呼び出す)
void change_state(enum..., void*, enum...);
この goto_infoテスト機能は動作しません。しかし、 の属性をに追加しただけでは、コードは機能します(ポインタはのgoto_info関数の最後に割り当て解除されません)。しかし、私は本当にCの変更が理解できませんutput。
// Vala source
void goto_info()
{
StInfo sti = new StInfo();
change_state(SUPS.INFO_PAGE, (owned)sti, StackDir.FORW);
}
// C output
void goto_info (void) {
StInfo* sti = NULL;
StInfo* _tmp0_ = NULL;
StInfo* _tmp1_ = NULL;
_tmp0_ = st_info_new();
sti = _tmp0_;
_tmp1_ = sti;
sti = NULL;
change_state (SUPS_INFO_PAGE, _tmp1_, STACK_DIR_FORW);
_g_object_unref0 (sti);
}
重要: goto_infoは、私は他には何もValaのコンパイラで触れていない、が所有追加する場合、変更のみの関数です。誰かがこのCの出力コードに隠されている黒い魔法はどこにあるのか説明できますか?ポインタのref/unref呼び出しが同じ場合、2番目のバージョンが動作するのはなぜですか?
天才!答えはとてもシンプルでしたが、私は実際には自動生成されたコードでこれほどのことは期待していませんでした。迅速なサポートに感謝します。 – MMar