joes 2004/07/13 12:15:29
Modified: glue/perl/xsbuilder apreq_xs_tables.h
Log:
Need to ensure key argument to apr_table_setn and apr_table_addn is
apr_pool-allocated, not a perl-allocated string.
Revision Changes Path
1.19 +15 -14 httpd-apreq-2/glue/perl/xsbuilder/apreq_xs_tables.h
Index: apreq_xs_tables.h
===================================================================
RCS file: /home/cvs/httpd-apreq-2/glue/perl/xsbuilder/apreq_xs_tables.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- apreq_xs_tables.h 13 Jul 2004 17:00:09 -0000 1.18
+++ apreq_xs_tables.h 13 Jul 2004 19:15:29 -0000 1.19
@@ -21,9 +21,8 @@
#include "ppport.h"
-#define APREQ_XS_TABLE_CAN_PREFETCH_VALUES (PERL_VERSION >= 8)
-#if APREQ_XS_TABLE_CAN_PREFETCH_VALUES
+#if (PERL_VERSION >= 8)
/* Requires perl 5.8 or better.
* A custom MGVTBL with its "copy" slot filled allows
@@ -134,34 +133,34 @@
void *env; \
apr_table_t *t; \
const char *key, *val; \
- SV *sv; \
+ SV *sv, *obj; \
STRLEN klen, vlen; \
- apreq_##attr##_t *obj; \
+ apreq_##attr##_t *RETVAL; \
\
if (items != 3 || !SvROK(ST(0)) || !SvPOK(ST(1))) \
Perl_croak(aTHX_ "Usage: $table->" #method "($key, $val)"); \
\
- sv = apreq_xs_find_obj(aTHX_ ST(0), #attr); \
- if (sv == NULL) \
- Perl_croak(aTHX_ "Cannot find object"); \
- env = apreq_xs_sv2env(sv); \
- t = (apr_table_t *) SvIVX(sv); \
+ sv = ST(0); \
+ obj = apreq_xs_find_obj(aTHX_ sv, #attr); \
+ if (obj == NULL) \
+ Perl_croak(aTHX_ "$table->" #method ": cannot find object"); \
+ env = apreq_xs_sv2env(obj); \
+ t = apreq_xs_##attr##_sv2table(obj); \
key = SvPV(ST(1), klen); \
\
if (SvROK(ST(2))) { \
- obj = (apreq_##attr##_t *) SvIVX(SvRV(ST(2))); \
+ RETVAL = (apreq_##attr##_t *) SvIVX(SvRV(ST(2))); \
} \
else if (SvPOK(ST(2))) { \
val = SvPV(ST(2), vlen); \
- obj = apreq_make_##attr(apreq_env_pool(env), key, klen, \
+ RETVAL = apreq_make_##attr(apreq_env_pool(env), key, klen, \
val, vlen); \
} \
else \
Perl_croak(aTHX_ "Usage: $table->" #method "($key, $val): " \
"unrecognized SV type for $val"); \
- val = obj->v.data; \
\
- apr_table_##method##n(t, key, val); \
+ apr_table_##method##n(t, RETVAL->v.name, RETVAL->v.data); \
XSRETURN_EMPTY; \
}
@@ -378,13 +377,15 @@
dXSARGS; \
SV *sv, *obj; \
IV idx; \
+ apr_table_t *t; \
const apr_array_header_t *arr; \
apr_table_entry_t *te; \
\
if (!SvROK(ST(0))) \
Perl_croak(aTHX_ "Usage: $table->NEXTKEY($prev)"); \
obj = apreq_xs_find_obj(aTHX_ ST(0), #attr); \
- arr = apr_table_elts(apreq_xs_##attr##_sv2table(obj)); \
+ t = apreq_xs_##attr##_sv2table(obj); \
+ arr = apr_table_elts(t); \
te = (apr_table_entry_t *)arr->elts; \
\
if (items == 1) \
