# New Ticket Created by Tony Payne # Please include the string: [perl #822] # in the subject line of all future correspondence about this issue. # <URL: http://bugs6.perl.org/rt2/Ticket/Display.html?id=822 >
I set off to try to increase the coverage of parrot_coverage and right away tripped into a segfault in intqueue if you try to dequeue an empty queue. This patch fixes the segfault and adds a test for it. ++t -- attachment 1 ------------------------------------------------------ url: http://bugs6.perl.org/rt2/attach/3866/3577/55bba3/intq.diff
Index: t/pmc/pmc.t =================================================================== RCS file: /cvs/public/parrot/t/pmc/pmc.t,v retrieving revision 1.32 diff -u -u -r1.32 pmc.t --- t/pmc/pmc.t 4 Jul 2002 00:49:04 -0000 1.32 +++ t/pmc/pmc.t 16 Jul 2002 01:42:42 -0000 @@ -1,6 +1,6 @@ #! perl -w -use Parrot::Test tests => 59; +use Parrot::Test tests => 60; use Test::More; my $fp_equality_macro = <<'ENDOFMACRO'; @@ -1258,6 +1258,15 @@ ok 3 ok 4 OUTPUT + +output_is(<<CODE, <<OUTPUT, "IntQueue test"); + new P0,.IntQueue + set I0, P0 + end +CODE +*** dequeue tried to dequeue empty bucket +OUTPUT + output_is(<<CODE, <<OUTPUT, "mul_p_p, PerlInt"); @{[ $fp_equality_macro ]} Index: classes/intqueue.pmc =================================================================== RCS file: /cvs/public/parrot/classes/intqueue.pmc,v retrieving revision 1.10 diff -u -u -r1.10 intqueue.pmc --- classes/intqueue.pmc 11 Jun 2002 21:04:58 -0000 1.10 +++ classes/intqueue.pmc 16 Jul 2002 01:42:42 -0000 @@ -49,20 +49,24 @@ } static INTVAL dequeue ( CONTAINER* container ) { - INTVAL value = container->tail->value; + INTVAL value; if(container->head != container->tail) { BUCKET* cur = container->tail; + value = container->tail->value; container->tail = container->tail->prev; container->tail->next = NULL; free(cur); } else if(container->head != NULL) { + value = container->tail->value; free(container->head); container->head = NULL; container->tail = NULL; } else { fprintf(stderr,"*** dequeue tried to dequeue empty bucket\n"); + /* XXX: Should raise an exception */ + return 0; } return value; }