2017-09-04 5 views
0

これは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番目のバージョンが動作するのはなぜですか?

答えて

1

(注)この行:

sti = NULL; 

stiは(_tmp1_はなくchange_stateに渡されている間)NULLに設定されているので、今UNREFの呼び出しがNOOPです:

_g_object_unref0 (sti); 
+0

天才!答えはとてもシンプルでしたが、私は実際には自動生成されたコードでこれほどのことは期待していませんでした。迅速なサポートに感謝します。 – MMar

関連する問題