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 {
signature.asc
Description: OpenPGP digital signature
