This is 0.79_53 - update META.yml, and META.json
[p5sagit/Devel-Size.git] / t / code.t
index f2e1e26..f57a3fe 100644 (file)
--- a/t/code.t
+++ b/t/code.t
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
-use Test::More tests => 12;
+use Test::More tests => 18;
 use Devel::Size ':all';
 
 sub zwapp;
@@ -15,8 +15,13 @@ my $swoosh_size = total_size(\&swoosh);
 my $crunch_size = total_size(\&crunch);
 
 cmp_ok($whack_size, '>', 0, 'CV generated at runtime has a size');
-cmp_ok($zwapp_size, '>', $whack_size,
-       'CV stubbed at compiletime is larger (CvOUTSIDE is set and followed)');
+if("$]" >= 5.017) {
+    cmp_ok($zwapp_size, '==', $whack_size,
+          'CV stubbed at compiletime is the same size');
+} else {
+    cmp_ok($zwapp_size, '>', $whack_size,
+          'CV stubbed at compiletime is larger (CvOUTSIDE is set and followed)');
+}
 cmp_ok(length prototype \&swoosh, '>', 0, 'prototype has a length');
 cmp_ok($swoosh_size, '>', $zwapp_size + length prototype \&swoosh,
        'prototypes add to the size');
@@ -48,3 +53,72 @@ my $short_pvop = total_size(sub {goto GLIT});
 my $long_pvop = total_size(sub {goto KREEK_KREEK_CLANK_CLANK});
 cmp_ok($short_pvop, '>', $anon_size, 'OPc_PVOP can be measured');
 is($long_pvop, $short_pvop + 19, 'the only size difference is the label length');
+
+sub bloop {
+    my $clunk = shift;
+    if (--$clunk > 0) {
+       bloop($clunk);
+    }
+}
+
+my $before_size = total_size(\&bloop);
+bloop(42);
+my $after_size = total_size(\&bloop);
+
+cmp_ok($after_size, '>', $before_size, 'Recursion increases the PADLIST');
+
+sub closure_with_eval {
+    my $a;
+    return sub { eval ""; $a };
+}
+
+sub closure_without_eval {
+    my $a;
+    return sub { require ""; $a };
+}
+
+if ($] > 5.017001) {
+    # Again relying too much on the core's implementation, but while that holds,
+    # this does test that CvOUTSIDE() is being followed.
+    cmp_ok(total_size(closure_with_eval()), '>',
+          total_size(closure_without_eval()) + 256,
+          'CvOUTSIDE is now NULL on cloned closures, unless they have eval');
+} else {
+    # Seems that they differ by a few bytes on 5.8.x
+    cmp_ok(total_size(closure_with_eval()), '<=',
+          total_size(closure_without_eval()) + 256,
+          "CvOUTSIDE is set on all cloned closures, so these won't differ by much");
+}
+
+sub two_lex {
+    my $a;
+    my $b;
+}
+
+sub ode {
+    my $We_are_the_music_makers_And_we_are_the_dreamers_of_dreams_Wandering_by_lone_sea_breakers_And_sitting_by_desolate_streams_World_losers_and_world_forsakers_On_whom_the_pale_moon_gleams_Yet_we_are_the_movers_and_shakers_Of_the_world_for_ever_it_seems;
+    my $With_wonderful_deathless_ditties_We_build_up_the_world_s_great_cities_And_out_of_a_fabulous_story_We_fashion_an_empire_s_glory_One_man_with_a_dream_at_pleasure_Shall_go_forth_and_conquer_a_crown_And_three_with_a_new_song_s_measure;
+    # /Ode/, Arthur O'Shaughnessy, published in 1873.
+    # Sadly all but one of the remaining versus are too long for an identifier.
+}
+
+my $two_lex_size = total_size(\&two_lex);
+cmp_ok($two_lex_size, '>', $crunch_size,
+       '&two_lex is bigger than an empty sub');
+cmp_ok($two_lex_size, '<', $crunch_size + 2048,
+       '&two_lex is bigger than an empty sub by less than 2048 bytes');
+
+my $ode_size = total_size(\&ode);
+{
+    # Fixing this for pre-v5.18 involves solving the more general problem of
+    # when to "recurse" into nested structures, currently bodged with
+    # "SOME_RECURSION" and friends. :-(
+    local $::TODO =
+        'Devel::Size has never handled the size of names in the pad correctly'
+        if $] < 5.017004;
+    cmp_ok($ode_size, '>', $two_lex_size + 384,
+           '&ode is bigger than a sub with two lexicals by least 384 bytes');
+}
+
+cmp_ok($ode_size, '<', $two_lex_size + 768,
+       '&ode is bigger than a sub with two lexicals by less than 768 bytes');