#1965: rational.pmc's get_bool is backwards and not portable
----------------------+-----------------------------------------------------
 Reporter:  doughera  |       Owner:        
     Type:  bug       |      Status:  new   
 Priority:  normal    |   Milestone:        
Component:  none      |     Version:  2.11.0
 Severity:  medium    |    Keywords:        
     Lang:            |       Patch:  new   
 Platform:            |  
----------------------+-----------------------------------------------------
 I am seeing the following failure in t/dynpmc/rational.t:
 {{{
 ./parrot t/dynpmc/rational.t
 1..78
 Floating point exception
 }}}

 The problem is that the Rational get_bool vtable does this:
 {{{
     if (mpq_cmp_si(RT(SELF), 0, 0))
         return 0;
     else
         return 1;
 }}}
 That is, it compares a value with 0/0, which, naturally, raises a
 divide-by-zero exception.  (I haven't traced it carefully, but I think if
 gmp is compiled by gcc, a different set of macros kick in, which handle
 this case differently.)  The sense of the comparison is strange too:  Why
 is 0/0 considered "true", but everything else "false"? I think it's
 backwards by accident.

 The failure is first triggered by the test_init function, which does

 {{{
 .sub test_init
     new $P1, 'Rational'
     ok($P1,'initialization')
 .end
 }}}

 The {{{ ok }}} function is the one that ends up calling get_bool.

 The basic question is this:  Why not compare with 0/1?  This is at least
 reasonably analagous to what the get_bool vtable does for integers, and
 avoids any corner cases with 0/0.

 The attached patch does that.  It also fixes two tests: First,
 test_init was backwards.  The initial default value is 0/1 (which
 was previously testing as "ok", since the cmp test was backwards).
 The test now explicitly tests for the expected default value.  Second,
 test_bool now works, and tests both true and false.

-- 
Ticket URL: <https://trac.parrot.org/parrot/ticket/1965>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets

Reply via email to