From 6a80df4eb372d85a342d6af9c94a70bf2e457f38 Mon Sep 17 00:00:00 2001 From: Reini Urban Date: Wed, 12 Sep 2012 16:13:23 -0500 Subject: [PATCH] promote float to double va va_arg()... intel and pcc does not support va_arg float arguments. Sounds weird but so it is. float still has problems --- src/call/args.c | 12 +++++++++++- src/string/spf_vtable.c | 6 +++++- t/native_pbc/number_8_8_le.pbc | Bin 4016 -> 4016 bytes 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/call/args.c b/src/call/args.c index 8f458e4409..ffc889d494 100644 --- a/src/call/args.c +++ b/src/call/args.c @@ -1,5 +1,5 @@ /* -Copyright (C) 2001-2011, Parrot Foundation. +Copyright (C) 2001-2012, Parrot Foundation. =head1 NAME @@ -622,7 +622,12 @@ set_call_from_varargs(PARROT_INTERP, VTABLE_push_integer(interp, signature, va_arg(*args, INTVAL)); break; case 'N': +#if FLOATTYPE == FLOATTYPE_4 + /* Cannot pass float through va_arg */ + VTABLE_push_float(interp, signature, va_arg(*args, double)); +#else VTABLE_push_float(interp, signature, va_arg(*args, FLOATVAL)); +#endif break; case '-': return; @@ -744,7 +749,12 @@ Parrot_pcc_build_sig_object_from_varargs(PARROT_INTERP, ARGIN_NULLOK(PMC *obj), VTABLE_push_integer(interp, call_object, va_arg(args, INTVAL)); break; case 'N': +#if FLOATTYPE == FLOATTYPE_4 + /* Cannot pass float through va_arg */ + VTABLE_push_float(interp, call_object, va_arg(args, double)); +#else VTABLE_push_float(interp, call_object, va_arg(args, FLOATVAL)); +#endif break; case 'S': VTABLE_push_string(interp, call_object, va_arg(args, STRING *)); diff --git a/src/string/spf_vtable.c b/src/string/spf_vtable.c index 72ffa6f128..dbf3c3c769 100644 --- a/src/string/spf_vtable.c +++ b/src/string/spf_vtable.c @@ -1,5 +1,5 @@ /* -Copyright (C) 2001-2009, Parrot Foundation. +Copyright (C) 2001-2012, Parrot Foundation. =head1 NAME @@ -322,7 +322,11 @@ getfloat_va(PARROT_INTERP, INTVAL size, ARGIN(SPRINTF_OBJ *obj)) return (HUGEFLOATVAL)(HUGEFLOATVAL) va_arg(*arg, HUGEFLOATVAL); case SIZE_XVAL: +#if FLOATTYPE == FLOATTYPE_4 + return (HUGEFLOATVAL)(FLOATVAL) va_arg(*arg, double); +#else return (HUGEFLOATVAL)(FLOATVAL) va_arg(*arg, FLOATVAL); +#endif case SIZE_PMC: { diff --git a/t/native_pbc/number_8_8_le.pbc b/t/native_pbc/number_8_8_le.pbc index 807d5448e65e3f3f35aacea34b787996ccaf3672..a39955cbd08ce96b65ac0b8257efc052364e7937 100644 GIT binary patch delta 60 zcmV-C0K@;VAFv;gKmp#7LC*n5lMw+=0l>3i0bc?ENVCBMhXIpd2_Tbb1sIcP0}zv# S1#q(v21o&sFc7m?2UrMh%M#)M delta 80 zcmdlWzd?S21LK2