まずは舌足らずをお詫び。
YappoLogs: Internals::SvREADONLYdanさんのただし、これではscalarしかflagをいじれません。というわけで、同様のことをXSでやるようにするモジュールを書いたというわけです。これは間違いでARRAYもHASHも弄れます。
これは、s/scalar/PV一つ/gですね。
どういうことかというと、PVAVとしてのarray, PVHVとしてのhashはread-onlyに出来ても、その中身は違うということ。
% perl -MDevel::Peek -le '@a=(1,2);Internals::SvREADONLY(@a,1);Dump \@a'
SV = RV(0x1804cdc) at 0x1804cd0
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x1812670
SV = PVAV(0x1805ca8) at 0x1812670
REFCNT = 2
FLAGS = (READONLY)
ARRAY = 0x1101c50
FILL = 1
MAX = 3
ARYLEN = 0x0
FLAGS = (REAL)
Elt No. 0
SV = IV(0x1804dec) at 0x1804df0
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 1
Elt No. 1
SV = IV(0x1804f3c) at 0x1804f40
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2
ただし、指摘のようにInternals::SvREADONLY()は$array[1]や$hash{one}も引数に取れるので、これを使うだけでXSを使わずにConst.pmのようなことは出来ます。というか、最初の実装はそうでした。
ただし、Internals::SvREADONLY($_) for (@array)のような、単純なPerlのループでも以外と時間がかかるもの。というわけで、List::Utilの各種関数と同じく、iterationもXS化した次第です。
それはまあいいのだけど、問題は
YappoLogs: Internals::SvREADONLYなにが言いたいかというとConstがUNAUTHORIZEDだという事
だよなあ。ImmutableとかにすればOKになる?
というわけで、何が言いたいかというと、名前募集中ということ。
Dan the Perl Monger
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。