I ran into a problem. I made another improvement to Win32::API, in ::Struct, to 
fix this div by zero, http://perlmonks.org/?node_id=978667 . No changes to 
recognize(), since recognize already has a way
to signal failure, its just typedef() didn't check for failure before. 
recognize() indicated failure by returning a list with 1 undef, rather than the 
non-error list with 3 elements. The undefs/missing array elements later become 
0s which after that become div by 0s.
_____________________________________________
sub typedef {
    my $class  = shift;
    my $struct = shift;
    my ($type, $name, @recog_arr);
    my $self = {
        align   => undef,
        typedef => [],
    };
    while (defined($type = shift)) {
        $name = shift;
        $name =~ s/;$//;
        @recog_arr = recognize($type, $name);
#http://perlmonks.org/?node_id=978468, not catching the type not found here,
#will lead to a div 0 later
        if(@recog_arr != 3){ 
            warn "Win32::API::Struct::typedef: unknown member type=\"$type\", 
name=\"$name\"";
            return undef;
        }
        push(@{$self->{typedef}}, [@recog_arr]);
    }

    $Known{$struct} = $self;
    return 1;
}
_____________________________________________
the problem is 05_more_struct.t now fails its tests, specifically, 
_____________________________________________
C:\Documents and Settings\Owner\Desktop\cpan libs\Win32API\wrkinprog>perl ./t/05
_more_struct.t
1..28
ok 1 - "all_longs" struct defined
ok 2 - Size of struct "all_longs" is calculated correctly (20)
ok 3 - "array_of_chars" struct defined
ok 4 - Size of struct "array_of_chars" is calculated correctly (100)
ok 5 - "compound_1" struct defined
ok 6 - Size of struct "compound_1" is calculated correctly (212)
ok 7 - "compound_2" struct defined
not ok 8 - Size of struct "compound_2" is calculated correctly (14) # TODO Break
s atm
#   Failed (TODO) test 'Size of struct "compound_2" is calculated correctly (14)
'
#   at ./t/05_more_struct.t line 131.
#          got: '14'
#     expected: '11'
ok 9 - "empty" struct defined
ok 10 - Size of struct "empty" is calculated correctly (0)
Win32::API::Struct::typedef: unknown member type="\n", name="\n" at C:/perl512/s
ite/lib/Win32/API/Struct.pm line 46.
Unknown Win32::API::Struct 'empty_with_spaces' at ./t/05_more_struct.t line 125
not ok 11 - "empty_with_spaces" struct defined
#   Failed test '"empty_with_spaces" struct defined'
#   at ./t/05_more_struct.t line 126.
Can't call method "sizeof" on an undefined value at ./t/05_more_struct.t line 13
5.
# Looks like you planned 28 tests but ran 11.
# Looks like you failed 1 test of 11 run.
# Looks like your test exited with 2 just after 11.

C:\Documents and Settings\Owner\Desktop\cpan libs\Win32API\wrkinprog>
________________________________________________
if I comment out
_________________________________________________
    empty_with_spaces => {
        typedef => [qw(  \n   \n  )],
        sizeof  => 0,
    },
_________________________________________________
in 05_more_struct.t, 05_more_struct.t passes all its tests.

Since you (Cosimo) originally wrote 05_more_struct.t (I assume, per 
https://github.com/cosimo/perl5-win32-api/commit/99a1506e8a941f9625ead648c207f4639f9cbf07#t/05_more_struct.t
 ), I ask, what should I do?

Some ideas,
-make empty_with_spaces pass its tests (a 0 length struct is created 
successfully) at any cost (no idea how to implement, some kind of whitespace 
stripper/normalizer regex before passing off the string to defined/while?)
-remove empty_with_spaces test, note "empty" works fine with the new ::Struct
-or you (Cosimo) have your own idea how to fix this?

This email is going to Cosimo and libwin32 mailing list, anyone can give their 
opinion.
                                          

Reply via email to