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