# 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
}