>こんにちは、@rednaxelafxことKrisと申します。
中国からありがとうございます。
(中国語版がもう出版されているということを私も今知りました)
>このたびはcrowbarについてちょっと聞きたいことがあります。
…
>その中のcrowbar_book_0_4ですが、interface.cでのrelease_global_strings()が
>こうなっています:
>static void
>release_global_strings(CRB_Interpreter *interpreter) {
> while (interpreter->variable) {
> Variable *temp = interpreter->variable;
> interpreter->variable = temp->next;
> }
>}
確認しました。確かに無駄なことをしているように見えます。
そもそも関数名がrelease_global_stringsなのに、文字列に対して
何かしているように見えません。
どうしてこうなったのかと思い、調べたのですが、どうも
ver.0.1のこのコードが原因なのかと思います。
http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/15.html#76
static void
release_global_strings(CRB_Interpreter *interpreter) {
while (interpreter->variable) {
Variable *temp = interpreter->variable;
interpreter->variable = temp->next;
if (temp->value.type == CRB_STRING_VALUE) {
crb_release_string(temp->value.u.string_value);
}
}
}
ver.0.1時点では、参照カウンタのGCしかなかったので、インタプリタを
破棄するときには文字列の領域はfreeする必要がありました。その処理が
上記のコードです。
ver.0.2でGCを組み込んだので、interpreter->variableをNULLにしておけば、
文字列の領域もcrb_garbage_collect()の呼び出しで解放されます。
ただ、ver.0.2を作ったとき、ヘッダファイルを直してコンパイルエラーを取って、
という作業をしているときに、コンパイルエラーの原因のところだけ削って
関数そのものが不要であることに気付かなかったのではないかと思います。
すみませんでした。再確認のうえ、正誤表に載せる等対応します。
細かいところまでソースを読み込んでいただき、作者冥利に尽きます。
ありがとうございました。