# New Ticket Created by  Leopold Toetsch 
# Please include the string:  [perl #37434]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=37434 >


Simon Vogl wrote:

[ ... ]

Here are some relevant snippets auf Parrot on ARM (see also 
http://use.perl.org/~koobla/journal/ )

> [EMAIL PROTECTED]:/var/tmp/parrot-0.3.0# ./parrot -t  t/pmc/perlint_40.pasm
>      0 new P0, 35       - P0=PMCNULL,
>      3 new P1, 35       - P1=PMCNULL,
>      6 set N0, 4000.04          - N0=0.000000,
>      9 set P0, 123      - P0=PerlInt=PMC(0x348ea0 Num:0 Int:0),
>     12 multiply P1, P0, N0      - P1=PerlInt=PMC(0x348e88 Num:0 Int:0), 
> P0=PerlInt=PMC(0x348ea0 Num:123 Int:123), N0=4000.040000
>     17 print P1         - P1=PerlNum=PMC(0x348e88 Num:492005 Int:492004)
>     19 print "\n"
> -492004.920000

There are 2 problems. The trace dump truncates numbers and more 
importantly PerlNum.get_string() is very likely failing due to our 
'signbit' hack that exists merely for the darn -0.0 negative zero.

I think it's time to rewrite this code once again. Attached is a patch 
that should correct above error type. Unfortunately it causes different 
errors (of course +- 0.0) in t/pmc/complex.t. But it might very well be 
that the expected output of the test is bogus.

The code in src/spf_render.c is also rather weird. At line 663 a STRING 
is created just to be converted back to a cstring in the next statement. 
This is probably not the most efficient way to strdup the format string ;-)

Commenents & testers very welcome,
leo
Index: src/trace.c
===================================================================
--- src/trace.c (revision 9481)
+++ src/trace.c (working copy)
@@ -107,7 +107,7 @@
     else if (pmc->vtable->base_type == enum_class_PerlUndef
             ||  pmc->vtable->base_type == enum_class_PerlInt
             ||  pmc->vtable->base_type == enum_class_PerlNum) {
-        PIO_eprintf(interpreter, "%S=PMC(%#p Num:%Pg Int:%Pd)",
+        PIO_eprintf(interpreter, "%S=PMC(%#p Num:%Pf Int:%Pd)",
                 VTABLE_name(interpreter, pmc), pmc, pmc, pmc);
     }
     else if (pmc->vtable->base_type == enum_class_RetContinuation
Index: src/spf_render.c
===================================================================
--- src/spf_render.c    (revision 9481)
+++ src/spf_render.c    (working copy)
@@ -658,7 +658,7 @@
                             thefloat = obj->getfloat
                                 (interpreter, info.type, obj);
                             /* turn -0.0 into 0.0 */
-                            if( thefloat == 0.0 ) { thefloat = 0.0; }
+                            /* WTF if( thefloat == 0.0 ) { thefloat = 0.0; } */
                             gen_sprintf_call(interpreter, tc, &info, ch);
                             ts = cstr2pstr(tc);
                             /* XXX lost precision if %Hg or whatever
Index: classes/perlnum.pmc
===================================================================
--- classes/perlnum.pmc (revision 9481)
+++ classes/perlnum.pmc (working copy)
@@ -35,12 +35,20 @@
 */
 
     STRING* get_string () {
+#if 0
         double d = (double) PMC_num_val(SELF);
         const char *sign = "-";
        if (!signbit(PMC_num_val(SELF)))
             sign = "";
         d = fabs(d);
         return Parrot_sprintf_c(INTERP, "%s" FLOATVAL_FMT, sign, d);
+#else
+       /* XXX signbit isn't portable and as we are calling Parrot_sprintf_c
+        * anyway, we can use the builtin number formatting too
+        * this might still be a problem with -0.0
+        */
+        return Parrot_sprintf_c(INTERP, "%Pf", SELF);
+#endif
     }
 
 

Reply via email to