I've just tried building against a 64bitint perl-5.8.4, and there were quite a 
few
places were we were making assumptions that sizeof(int) == sizeof(pointer).

This patches tries to use INT2PTR and PTR2(IV|UV) where appropriate. This patch
passes all tests ok on perl-5.8.4 with and without 64bitint.

--------------------------------------------------------------------------------
Philippe M. Chiasson m/gozer\@(apache|cpan|ectoplasm)\.org/ GPG KeyID : 88C3A5A5
http://gozer.ectoplasm.org/     F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3A5A5
Index: src/modules/perl/modperl_handler.c
===================================================================
--- src/modules/perl/modperl_handler.c	(revision 126447)
+++ src/modules/perl/modperl_handler.c	(working copy)
@@ -320,7 +320,7 @@
             }
           case 'I':
             if (strEQ(classname, "IV")) {
-                sv = ptr ? newSViv((IV)ptr) : &PL_sv_undef;
+                sv = ptr ? newSViv(PTR2IV(ptr)) : &PL_sv_undef;
                 break;
             }
           case 'P':
Index: src/modules/perl/modperl_common_util.c
===================================================================
--- src/modules/perl/modperl_common_util.c	(revision 126447)
+++ src/modules/perl/modperl_common_util.c	(working copy)
@@ -121,7 +121,7 @@
 {
     SV *rv = modperl_hash_tied_object_rv(aTHX_ classname, tsv);
     if (SvROK(rv)) {
-        return (void *)SvIVX(SvRV(rv));
+        return INT2PTR(void *, SvIVX(SvRV(rv)));
     }
     else {
         return NULL;
Index: src/modules/perl/modperl_module.c
===================================================================
--- src/modules/perl/modperl_module.c	(revision 126447)
+++ src/modules/perl/modperl_module.c	(working copy)
@@ -76,7 +76,7 @@
 void modperl_module_config_table_set(pTHX_ PTR_TBL_t *table)
 {
     SV **svp = modperl_module_config_hash_get(aTHX_ TRUE);
-    sv_setiv(*svp, (IV)table);
+    sv_setiv(*svp, PTR2IV(table));
 }
 
 PTR_TBL_t *modperl_module_config_table_get(pTHX_ int create)
@@ -92,10 +92,10 @@
     sv = *svp;
     if (!SvIOK(sv) && create) {
         table = modperl_svptr_table_new(aTHX);
-        sv_setiv(sv, (IV)table);
+        sv_setiv(sv, PTR2IV(table));
     }
     else {
-        table = (PTR_TBL_t *)SvIV(sv);
+        table = INT2PTR(PTR_TBL_t *, SvIV(sv));
     }
 
     return table;
Index: src/modules/perl/modperl_util.c
===================================================================
--- src/modules/perl/modperl_util.c	(revision 126447)
+++ src/modules/perl/modperl_util.c	(working copy)
@@ -98,7 +98,7 @@
 MP_INLINE server_rec *modperl_sv2server_rec(pTHX_ SV *sv)
 {
     if (SvOBJECT(sv) || (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG))) {
-        return (server_rec *)SvObjIV(sv);
+        return INT2PTR(server_rec *, SvObjIV(sv));
     }
 
     /* next see if we have Apache->request available */
@@ -164,7 +164,7 @@
             /* XXX: find something faster than sv_derived_from */
             return NULL;
         }
-        return (request_rec *)SvIV(sv);
+        return INT2PTR(request_rec *, SvIV(sv));
     }
 
     return NULL;
@@ -288,7 +288,7 @@
                        dl_librefs, (int)i);
 	    continue;
 	}
-	handle = (void *)SvIV(handle_sv);
+	handle = INT2PTR(void *, SvIV(handle_sv));
 
 	MP_TRACE_r(MP_FUNC, "%s dl handle == 0x%lx\n",
                    SvPVX(module_sv), (unsigned long)handle);
@@ -349,7 +349,7 @@
     AV *librefs = get_av(dl_librefs, 0);
     SV *libref = *av_fetch(librefs, dl_index, 0);
 
-    modperl_sys_dlclose((void *)SvIV(libref));
+    modperl_sys_dlclose(INT2PTR(void *, SvIV(libref)));
 
     /* remove package from @dl_librefs and @dl_modules */
     modperl_av_remove_entry(aTHX_ get_av(dl_librefs, 0), dl_index);
Index: xs/modperl_xs_util.h
===================================================================
--- xs/modperl_xs_util.h	(revision 126447)
+++ xs/modperl_xs_util.h	(working copy)
@@ -70,8 +70,9 @@
 #define mpxs_sv_is_object(sv)                           \
     (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG))
 
-#define mpxs_sv_object_deref(sv, type)                            \
-    (mpxs_sv_is_object(sv) ? (type *)SvIVX((SV*)SvRV(sv)) : NULL)
+#define mpxs_sv_object_deref(sv, type)                  \
+    (mpxs_sv_is_object(sv) ?                            \
+        INT2PTR(type *, SvIVX((SV*)SvRV(sv))) : NULL) 
 
 #define mpxs_sv2_obj(obj, sv)                   \
     (obj = mp_xs_sv2_##obj(sv))
Index: xs/typemap
===================================================================
--- xs/typemap	(revision 126447)
+++ xs/typemap	(working copy)
@@ -17,6 +17,9 @@
 T_VPTR
 	sv_setiv($arg, PTR2IV($var));
 
+T_UVPTR
+    sv_setuv($arg, PTR2UV($var));
+
 T_APR_TIME
 	sv_setnv($arg, (NV)(apr_time_sec($var)));
 
@@ -53,7 +56,7 @@
 T_UVOBJ
 	if (SvROK($arg) && sv_derived_from($arg, \"${ntype}\")) {
 	    UV tmp = SvUV((SV*)SvRV($arg));
-	    $var = ($type)tmp;
+	    $var = INT2PTR($type, tmp);
 	}
 	else {
 	    Perl_croak(aTHX_ SvROK($arg) ?
@@ -73,6 +76,9 @@
 T_VPTR
 	$var = INT2PTR($type, SvIV(SvROK($arg) ? SvRV($arg) : $arg))
 
+T_UVPTR
+	$var = INT2PTR($type, SvUV(SvROK($arg) ? SvRV($arg) : $arg))
+
 T_APR_TIME
 	$var = (apr_time_t)(apr_time_from_sec(SvNV($arg)))
 
Index: xs/Apache/Log/Apache__Log.h
===================================================================
--- xs/Apache/Log/Apache__Log.h	(revision 126447)
+++ xs/Apache/Log/Apache__Log.h	(working copy)
@@ -37,11 +37,11 @@
     request_rec *r = NULL;
 
     if (SvROK(sv) && sv_isa(sv, "Apache::Log::Request")) {
-        r = (request_rec *)SvObjIV(sv);
+        r = INT2PTR(request_rec *, SvObjIV(sv));
         s = r->server;
     }
     else if (SvROK(sv) && sv_isa(sv, "Apache::Log::Server")) {
-        s = (server_rec *)SvObjIV(sv);
+        s = INT2PTR(server_rec *, SvObjIV(sv));
     }
     else {
         s = modperl_global_get_server_rec();
@@ -288,7 +288,7 @@
 
     if (items > 1) {
         if (sv_isa(ST(0), "Apache::ServerRec")) {
-            s = (server_rec *)SvObjIV(ST(0));
+            s = INT2PTR(server_rec *, SvObjIV(ST(0)));
         }
         else if ((r = modperl_xs_sv2request_rec(aTHX_ ST(0),
                                                 "Apache::RequestRec", cv))) {
Index: xs/Apache/Filter/Apache__Filter.h
===================================================================
--- xs/Apache/Filter/Apache__Filter.h	(revision 126447)
+++ xs/Apache/Filter/Apache__Filter.h	(working copy)
@@ -292,7 +292,7 @@
 
     /* native filter */
     if (!modperl_filter) {
-        f = (ap_filter_t*)SvIV(SvRV(*MARK));
+        f = INT2PTR(ap_filter_t *, SvIV(SvRV(*MARK)));
         MP_TRACE_f(MP_FUNC,
                    "   %s\n\n\t non-modperl filter removes itself\n",
                    f->frec->name);
Index: xs/APR/Table/APR__Table.h
===================================================================
--- xs/APR/Table/APR__Table.h	(revision 126447)
+++ xs/APR/Table/APR__Table.h	(working copy)
@@ -153,7 +153,7 @@
                    "first argument not an APR::Table object");
     }
 
-    t = (apr_table_t *)SvIVX(SvRV(rv)); 
+    t = INT2PTR(apr_table_t *, SvIVX(SvRV(rv))); 
 
     if (apr_is_empty_table(t)) {
         return NULL;
@@ -180,7 +180,7 @@
 {
     SV* rv = modperl_hash_tied_object_rv(aTHX_ "APR::Table", tsv);
     const int i = mpxs_apr_table_iterix(rv);
-    apr_table_t *t = (apr_table_t *)SvIVX(SvRV(rv));
+    apr_table_t *t = INT2PTR(apr_table_t *, SvIVX(SvRV(rv)));
     const apr_array_header_t *arr = apr_table_elts(t);
     apr_table_entry_t *elts = (apr_table_entry_t *)arr->elts;
 
Index: xs/APR/PerlIO/modperl_apr_perlio.c
===================================================================
--- xs/APR/PerlIO/modperl_apr_perlio.c	(revision 126447)
+++ xs/APR/PerlIO/modperl_apr_perlio.c	(working copy)
@@ -110,7 +110,7 @@
     /* XXX: should probably add checks on pool validity in all other callbacks */
     sv = args[narg-1];
     if (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) {
-        st->pool = (apr_pool_t *)SvIV((SV*)SvRV(sv));
+        st->pool = INT2PTR(apr_pool_t *, SvIV((SV*)SvRV(sv)));
     }
     else {
         Perl_croak(aTHX_ "argument is not a blessed reference "
Index: lib/ModPerl/TypeMap.pm
===================================================================
--- lib/ModPerl/TypeMap.pm	(revision 126447)
+++ lib/ModPerl/TypeMap.pm	(working copy)
@@ -487,7 +487,7 @@
 #define $define(sv) \\
 ((SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) \\
 || (Perl_croak(aTHX_ "$croak ($expect)"),0) ? \\
-($ctype *)SvIV((SV*)SvRV(sv)) : ($ctype *)NULL)
+INT2PTR($ctype *, SvIV((SV*)SvRV(sv))) : ($ctype *)NULL)
 
 EOF
 
Index: lib/ModPerl/WrapXS.pm
===================================================================
--- lib/ModPerl/WrapXS.pm	(revision 126447)
+++ lib/ModPerl/WrapXS.pm	(working copy)
@@ -620,6 +620,7 @@
     'apr_time_t'         => 'T_APR_TIME',
     'APR::Table'         => 'T_HASHOBJ',
     'APR::Pool'          => 'T_POOLOBJ',
+    'apr_size_t *'       => 'T_UVPTR',
 );
 
 sub write_typemap {

Attachment: signature.asc
Description: OpenPGP digital signature



Reply via email to