roundtripping.
* get.h (stringify_double): Add new function.
(get_constant): Use stringify_double.
* dis-cil.c (disassemble_cil): Likewise.
svn path=/trunk/mono/; revision=56045
+2006-01-25 Ankit Jain <jankit@novell.com>
+
+ * get.c (stringify_double): New. Fix printing of float/doubles to enable
+ roundtripping.
+ * get.h (stringify_double): Add new function.
+ (get_constant): Use stringify_double.
+ * dis-cil.c (disassemble_cil): Likewise.
+
2006-01-25 Ankit Jain <jankit@novell.com>
Raja R Harinath <rharinath@novell.com>
fprintf (output, "(00 00 00 00 00 00 f0 7f)"); /* positive infinity */
else if (isnan (r))
fprintf (output, "(00 00 00 00 00 00 f8 ff)"); /* NaN */
- else
- fprintf (output, "%.20g", r);
+ else {
+ char *str = stringify_double (r);
+ fprintf (output, str);
+ g_free (str);
+ }
ptr += 8;
break;
}
fprintf (output, "(00 00 80 7f)"); /* positive infinity */
else if (isnan (f))
fprintf (output, "(00 00 c0 ff)"); /* NaN */
- else
- fprintf (output, "%.20g", (double) f);
+ else {
+ char *str = stringify_double ((double) f);
+ fprintf (output, str);
+ g_free (str);
+ }
ptr += 4;
break;
}
return result;
}
+char *
+stringify_double (double r)
+{
+ char *ret, *ptr;
+
+ ret = g_strdup_printf ("%.17g.", r);
+ ptr = ret + strlen (ret) - 1;
+ if (strchr (ret, '.') != ptr)
+ *ptr = '\0';
+
+ return ret;
+}
+
/**
* get_constant:
* @m: metadata context
#else
normal = isnormal (r);
#endif
- if (!normal)
+ if (!normal) {
return g_strdup_printf ("float32(0x%08x)", read32 (ptr));
- else
- return g_strdup_printf ("float32(%.20g)", r);
+ } else {
+ char *str = stringify_double ((double) r);
+ char *ret = g_strdup_printf ("float32(%s)", str);
+ g_free (str);
+ return ret;
+ }
}
case MONO_TYPE_R8: {
gboolean normal;
high = read32 (ptr + 4);
return g_strdup_printf ("float64(0x%08x%08x)", high, low);
} else {
- return g_strdup_printf ("float64(%.20g)", r);
+ char *str = stringify_double (r);
+ char *ret = g_strdup_printf ("float64(%s)", str);
+ g_free (str);
+ return ret;
}
}
case MONO_TYPE_STRING:
MonoTypeEnum get_field_literal_type (MonoImage *m, guint32 blob_signature);
+char *stringify_double (double r);
+
/**
* This is called to initialize the table containing keyword names
*/