Skip to content

Instantly share code, notes, and snippets.

@gfx
Created May 3, 2010 04:08
Show Gist options
  • Select an option

  • Save gfx/387743 to your computer and use it in GitHub Desktop.

Select an option

Save gfx/387743 to your computer and use it in GitHub Desktop.
#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