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


Index: nci.c
===================================================================
RCS file: /cvs/public/parrot/nci.c,v
retrieving revision 1.3
diff -u -r1.3 nci.c
--- nci.c       21 Nov 2002 02:00:23 -0000      1.3
+++ nci.c       21 Nov 2002 05:39:52 -0000
@@ -20,7 +20,7 @@
 /* Return void, take nothing */
 static void pcf_v_v(struct Parrot_Interp *interpreter, PMC *self) {
   void (*pointer)();
-  pointer = self->cache.struct_val;
+  pointer = (void (*)())D2FPTR(self->cache.struct_val);
   (void)(*pointer)();
   interpreter->ctx.int_reg.registers[0] = 0;
   interpreter->ctx.int_reg.registers[1] = 0;
@@ -34,7 +34,7 @@
 static void pcf_i_v(struct Parrot_Interp *interpreter, PMC *self) {
   int (*pointer)();
   int return_data;
-  pointer = self->cache.struct_val;
+  pointer = (int (*)())D2FPTR(self->cache.struct_val);
   return_data = (int)(*pointer)();
   interpreter->ctx.int_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
@@ -49,7 +49,7 @@
 static void pcf_d_v(struct Parrot_Interp *interpreter, PMC *self) {
   double (*pointer)();
   double return_data;
-  pointer = self->cache.struct_val;
+  pointer = (double (*)())D2FPTR(self->cache.struct_val);
   return_data = (double)(*pointer)();
   interpreter->ctx.num_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
@@ -65,7 +65,7 @@
   double (*pointer)();
   double return_data;
 
-  pointer = self->cache.struct_val;
+  pointer = (double (*)())D2FPTR(self->cache.struct_val);
   return_data = (double)(*pointer)(interpreter->ctx.num_reg.registers[5]);
   interpreter->ctx.num_reg.registers[5] = return_data;
   interpreter->ctx.int_reg.registers[0] = 0;
@@ -91,13 +91,13 @@
 #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;
+    return F2DPTR(pcf_i_v);
   if (!string_compare(interpreter, signature, string_from_c_string(interpreter, "d", 
1)))
-    return pcf_d_v;
+    return F2DPTR(pcf_d_v);
   if (!string_compare(interpreter, signature, string_from_c_string(interpreter, "dd", 
2)))
-    return pcf_d_d;
+    return F2DPTR(pcf_d_d);
 
   return NULL;
 #endif

Reply via email to