æ°ã»å¾ªç°åç §ã«ãããã
ååã¾ã§ã®ãããã
Sinon.jsã®spyãã±ãã£ãSub::Spyã¨ãããã¢ã¸ã¥ã¼ã«ãä½ã
â
blessããã«ç¹å®ã®coderefã«ã²ãã¥ãããã¼ã¿ãä¿åããã
â
@__gfx__ãããHash::FieldHashã§åºæ¥ããï¼ãï¼åç
§: http://d.hatena.ne.jp/__gfx__/20111015/1318640600)
â
ãã®æç¹ã§ã¯FieldHashã®æå³ãããããããªãã£ãã®ã§ãé©å½ã«InsideOutã£ã½ããã®ãå®è£
â
ãã³ã¡ã§@__gfx__ãããã¡ã¢ãªãªã¼ã¯ãã¦ããï¼ã
â
ä¼ç¤¾ã§@xaicronãSub::Spyã¯ã©ãããããã®ãããããããªãã俺ã俺ãããããããªãã
â
ä¼ç¤¾ã®IRCã§è²ã
èããããã¦ç´ããããªããleakãã¦ãªããã¨ãä¿è¨¼ããããã®ãã¹ããéããªã
â
循ç°åç
§ãã¦ã¾ããã¡ã¼ï¼ï¾ï¾ï½°ï¾
循ç°åç §ã«ãµã¨ãã©
éä¸çµéã¯ããã¨ãã¦ãSub::Spyã®spyã¨ãã颿°ã¯æ¸¡ãããcoderefãããã«ã©ããããcoderefãè¿ã(ã©ããããã®ã¯å¼æ°ãè¿ãå¤ãªã©ã®æ å ±ãä¿åãã¦ãããã)ãããããæ§é ã«ãªã£ã¦ããã
fieldhash our %f_store; sub spy { my $subref = shift; my $spy = sub { my @args = @_; my ($result, @array_result, $e); if ( wantarray ) { @array_result = eval { $subref->(@args); }; } else { $result = eval { $subref->(@args); }; } if ( $@ ) { $e = $@; } push @{$f_store{$spy}->{calls}}, Sub::Spy::Call->new({ args => \@args, exception => $e, return_value => wantarray ? \@array_result : $result, }); return wantarray ? @array_result : $result; }; return $spy; }
fieldhashåãããhashã¯ãhashã®keyã«ãããä½ã(ããã§ã¯$spy)ã®å¯¿å½ãåãã(ããããåç §ã«ã¦ã³ãã0ã«ãªã£ã)æç¹ã§å¯¾å¿ããvalueãè§£æ¾ãã¦ãããã¨ãã話ã ã£ãã®ã§ããããããã¹ããæ¸ããã
subtest("no leak thanks to Hash::FieldHash", sub { { my $subref = sub { return shift; }; my $spy = spy($subref); $spy->(); is ( scalar (keys %Sub::Spy::f_store), 1, "information stored in fieldhash" ); # ããã§$spyã®å¯¿å½ãåãã } is ( scalar (keys %Sub::Spy::f_store), 0, "information removed from fieldhash" ); });
ããä¸è¨ã®ãã¹ãã¯éããªãã£ãããªãã§ãã¨ããã¨ãä¸çªåãã®ã³ã¼ãã®ããã§$spyã循ç°åç §ãã¦ããããã(ããèªåã§ã¯æ°ã¥ããªãã£ã...)
push @{$f_store{$spy}->{calls}}, Sub::Spy::Call->new({ args => \@args, exception => $e, return_value => wantarray ? \@array_result : $result, });
ããããçºãã¦ã¿ãã°$spyã¨ããcoderefã®ä¸ã«ã¾ã$spyã®åç §ãå ¥ãè¾¼ãã§ããã®ã§ã循ç°åç §ãã¦ããã®ã¯å½ããåã¨ããã°å½ããåãªãã ãã©ãèªåã§æ¸ãã¦ãã¨ä¸ã æ°ã¥ããªããã ãªããããã
ã§ã@__gfx__ã«ãã³ãããã£ã¦ãã®ããã«ç´ãããããããã¨ã$spyã®ä¸ã«$spyã®åç §ããªãã®ã§ãfieldhashã«ãã£ã¦$spyã«å¯¾å¿ããhashã®valueãè§£æ¾ãããä¸è¨ãã¹ããéãããã«ãªãã
fieldhash our %f_store; sub spy { my $subref = shift; my $store = +{}; my $spy = sub { my @args = @_; my ($result, @array_result, $e); if ( wantarray ) { @array_result = eval { $subref->(@args); }; } else { $result = eval { $subref->(@args); }; } if ( $@ ) { $e = $@; } push @{$store->{calls}}, Sub::Spy::Call->new({ args => \@args, exception => $e, return_value => wantarray ? \@array_result : $result, }); return wantarray ? @array_result : $result; }; $f_store{$spy} = $store; return $spy; }
ãã§ãããã§ããã
çµè«
ããã¾ã§å½¹ã«ç«ããªãã¢ã¸ã¥ã¼ã«ã§ããæ¸ããã¨èªä½ã¯èªåã®å½¹ã«ç«ã¤