2004-12-13 Miguel de Icaza <miguel@ximian.com>
authorMiguel de Icaza <miguel@gnome.org>
Mon, 13 Dec 2004 22:51:58 +0000 (22:51 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Mon, 13 Dec 2004 22:51:58 +0000 (22:51 -0000)
* dis-cil.c, dump.c: Encode special constant +Inf, -Inf and NaN
using hex constants instead of letting libc print the values.

svn path=/trunk/mono/; revision=37704

mono/dis/ChangeLog
mono/dis/dis-cil.c
mono/dis/dump.c

index a9c87120b5644c43b2a70144ddc3a749b82e6bcd..f0a5f200405501777c7ad0bc23027835b58e6709 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-13  Miguel de Icaza  <miguel@ximian.com>
+
+       * dis-cil.c, dump.c: Encode special constant +Inf, -Inf and NaN
+       using hex constants instead of letting libc print the values.
+
 2004-12-11  Martin Baulig  <martin@ximian.com>
 
        * get.c (get_typespec): Added `gboolean is_def' argument; removed
index dfc250e96f5f157cbdd87a8312d3ba777dfb9330..ea3746ef76a50ebd19002c9de5c7a01caa6c1725 100644 (file)
@@ -9,6 +9,7 @@
 #include <config.h>
 #include <glib.h>
 #include <stdio.h>
+#include <math.h>
 #ifdef HAVE_WCHAR_H
 #include <wchar.h>
 #endif
@@ -183,8 +184,17 @@ dissasemble_cil (MonoImage *m, MonoMethodHeader *mh, MonoGenericContext *context
                        
                case MonoInlineR: {
                        double r;
+                       int inf;
                        readr8 (ptr, &r);
-                       fprintf (output, "%g", r);
+                       inf = isinf (r);
+                       if (inf == -1) 
+                               fprintf (output, "(00 00 00 00 00 00 f0 ff)"); /* negative infinity */
+                       else if (inf == 1)
+                               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, "%g", r);
                        ptr += 8;
                        break;
                }
@@ -277,9 +287,19 @@ dissasemble_cil (MonoImage *m, MonoMethodHeader *mh, MonoGenericContext *context
 
                case MonoShortInlineR: {
                        float f;
+                       int inf;
+                       
                        readr4 (ptr, &f);
 
-                       fprintf (output, "%g", (double) f);
+                       inf = isinf (f);
+                       if (inf == -1) 
+                               fprintf (output, "(00 00 80 ff)"); /* negative infinity */
+                       else if (inf == 1)
+                               fprintf (output, "(00 00 80 7f)"); /* positive infinity */
+                       else if (isnan (f))
+                               fprintf (output, "(00 00 c0 ff)"); /* NaN */
+                       else
+                               fprintf (output, "%g", (double) f);
                        ptr += 4;
                        break;
                }
index dce77a41adac41c67c29091b34421a5d67e7e94f..8256092d33f06bce3830c6e2384a7f1d4957cbbd 100644 (file)
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <glib.h>
+#include <math.h>
 #include "meta.h"
 #include "util.h"
 #include "dump.h"
@@ -819,15 +820,34 @@ handle_enum:
                        break;
                case MONO_TYPE_R4: {
                        float val;
+                       int inf;
                        readr4 (p, &val);
-                       g_string_sprintfa (res, "%g", val);
+                       inf = isinf (val);
+                       if (inf == -1) 
+                               g_string_sprintfa (res, "(00 00 80 ff)"); /* negative infinity */
+                       else if (inf == 1)
+                               g_string_sprintfa (res, "(00 00 80 7f)"); /* positive infinity */
+                       else if (isnan (val))
+                               g_string_sprintfa (res, "(00 00 c0 ff)"); /* NaN */
+                       else
+                               g_string_sprintfa (res, "%g", val);
                        p += 4;
                        break;
                }
                case MONO_TYPE_R8: {
                        double val;
+                       int inf;
+                       
                        readr8 (p, &val);
-                       g_string_sprintfa (res, "%g", val);
+                       inf = isinf (val);
+                       if (inf == -1) 
+                               g_string_sprintfa (res, "(00 00 00 00 00 00 f0 ff)"); /* negative infinity */
+                       else if (inf == 1)
+                               g_string_sprintfa (res, "(00 00 00 00 00 00 f0 7f)"); /* positive infinity */
+                       else if (isnan (val))
+                               g_string_sprintfa (res, "(00 00 00 00 00 00 f8 ff)"); /* NaN */
+                       else
+                               g_string_sprintfa (res, "%g", val);
                        p += 8;
                        break;
                }