On Nov-21, Josh Wilmes wrote:
> 
> This should correct warnings on a few compilers and outright breakage on tcc.
> 
> It uses the D2FPTR/F2DPTR macros to cast between data and function pointers
> where needed.
> 
> --Josh

I don't have time to properly test it right now, but here's an updated
version. It also eliminates one set of unneeded casts.

Index: nci.c
===================================================================
RCS file: /cvs/public/parrot/nci.c,v
retrieving revision 1.5
diff -p -u -r1.5 nci.c
--- nci.c       22 Nov 2002 16:00:53 -0000      1.5
+++ nci.c       22 Nov 2002 20:42:26 -0000
@@ -51,8 +51,8 @@ pcf_i_v(struct Parrot_Interp *interprete
 {
   int (*pointer)(void);
   int return_data;
-  pointer = self->cache.struct_val;
-  return_data = (int)(*pointer)();
+  pointer = (int (*)(void)) D2FPTR(self->cache.struct_val);
+  return_data = (*pointer)();
   interpreter->ctx.int_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
   interpreter->ctx.int_reg.registers[1] = 1;
@@ -68,8 +68,8 @@ pcf_i_i(struct Parrot_Interp *interprete
 {
   int (*pointer)(INTVAL);
   int return_data;
-  pointer = self->cache.struct_val;
-  return_data = (int)(*pointer)(INT_REG(5));
+  pointer = (int (*)(INTVAL)) D2FPTR(self->cache.struct_val);
+  return_data = (*pointer)(INT_REG(5));
   interpreter->ctx.int_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
   interpreter->ctx.int_reg.registers[1] = 1;
@@ -85,8 +85,8 @@ pcf_d_v(struct Parrot_Interp *interprete
 {
   double (*pointer)(void);
   double return_data;
-  pointer = self->cache.struct_val;
-  return_data = (double)(*pointer)();
+  pointer = (double (*)(void)) D2FPTR(self->cache.struct_val);
+  return_data = (*pointer)();
   interpreter->ctx.num_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
   interpreter->ctx.int_reg.registers[1] = 0;
@@ -103,8 +103,8 @@ pcf_d_d(struct Parrot_Interp *interprete
   double (*pointer)(FLOATVAL);
   double return_data;
 
-  pointer = self->cache.struct_val;
-  return_data = (double)(*pointer)(NUM_REG(5));
+  pointer = (double (*)(FLOATVAL)) D2FPTR(self->cache.struct_val);
+  return_data = (*pointer)(NUM_REG(5));
   interpreter->ctx.num_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
   interpreter->ctx.int_reg.registers[1] = 0;
@@ -129,19 +129,19 @@ void *build_call_func(struct Parrot_Inte
 #else
   /* And in here is the platform-independent way. Which is to say
      "here there be hacks" */
-  if (0 == string_length(signature)) return pcf_v_v;
+  if (0 == string_length(signature)) return F2DPTR(pcf_v_v);
   if (!string_compare(interpreter, signature,
-    string_from_c_string(interpreter, "i", 1)))
-        return pcf_i_v;
+                      string_from_c_string(interpreter, "i", 1)))
+      return F2DPTR(pcf_i_v);
   if (!string_compare(interpreter, signature,
-    string_from_c_string(interpreter, "ii", 1)))
-        return pcf_i_i;
+                      string_from_c_string(interpreter, "ii", 1)))
+      return F2DPTR(pcf_i_i);
   if (!string_compare(interpreter, signature,
-    string_from_c_string(interpreter, "d", 1)))
-        return pcf_d_v;
+                      string_from_c_string(interpreter, "d", 1)))
+      return F2DPTR(pcf_d_v);
   if (!string_compare(interpreter, signature,
-    string_from_c_string(interpreter, "dd", 2)))
-        return pcf_d_d;
+                      string_from_c_string(interpreter, "dd", 2)))
+      return F2DPTR(pcf_d_d);
 
   return NULL;
 #endif

Reply via email to