Created
May 3, 2010 04:08
-
-
Save gfx/387743 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #define PERL_NO_GET_CONTEXTはデフォ | |
| unpack.c: | |
| 可能性のあるIVSIZEは4 or 8なので、 | |
| static INLINE int template_callback_int64(unpack_user* u, int64_t d, SV** o) | |
| { *o = sv_2mortal(newSViv(d)); return 0; } | |
| はまずい。#ifdef IVSIZE == 4のときはnvにするか、stringifyする。 | |
| nilのunpackは&PL_sv_undefだとまずいかも。sv_newmortal()じゃないと。 | |
| というのも、unpack itemでそのSVをREFCNT_incしつつそのまま入れているため、 | |
| その要素には代入できない(と思う)。 | |
| static INLINE int template_callback_nil(unpack_user* u, SV** o) | |
| { *o = &PL_sv_undef; return 0; } | |
| 同じ理由で、get_bool はSVのコピーをしたほうがいいかも。このときは、SvREADONLY_on()はしてはいけない。 | |
| とにかく、unpackした結果のハッシュ/配列要素に代入可能かどうかテストしたほうがよい。 | |
| sv_2mortal((l == 0) ? newSVpv("", 0) : newSVpv(p, l));は冗長。 | |
| newSVpvn_flags(p, l, SVs_TEMP)で十分。l == 0だとpがNULLでもいい。 | |
| グローバル変数はマルチスレッドのとき困るのでMY_CXT機能を使うといいけど、 | |
| これだけではSEGVするわけじゃないからまあいいか? | |
| ただ、MPオブジェクト生成→スレッド生成→スレッド破棄 でメモリの二重解放が起きる気がする。 | |
| Text::ClearSilverも同じ問題抱えてるかも…。解決法は、オブジェクトをMAGICに保存して | |
| mg_dup/mg_freeでリソース管理をすればよい。Xslateではそうしてる。 | |
| 他、SEGV/メモリリークは特に見当たらない。 | |
| pack.c: | |
| try_intのかわりにPerl_grok_number (numeric.c)が使えるんじゃないかな? | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment