dougm 2002/10/21 19:42:03 Modified: . Changes src/modules/perl modperl_env.c modperl_env.h modperl_perl_global.c t/response/TestModperl env.pm Log: fix delete $ENV{$key} bug Revision Changes Path 1.56 +2 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- Changes 21 Oct 2002 20:21:33 -0000 1.55 +++ Changes 22 Oct 2002 02:42:03 -0000 1.56 @@ -10,6 +10,8 @@ =item 1.99_08-dev +fix delete $ENV{$key} bug + fix parse_args compat method to support non-ascii characters [Walery Studennikov <[EMAIL PROTECTED]>] 1.26 +4 -1 modperl-2.0/src/modules/perl/modperl_env.c Index: modperl_env.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- modperl_env.c 1 Jun 2002 23:42:07 -0000 1.25 +++ modperl_env.c 22 Oct 2002 02:42:03 -0000 1.26 @@ -15,6 +15,7 @@ else { SV *sv = newSVpv(elt->val, 0); hv_store(hv, elt->key, klen, sv, FALSE); + modperl_envelem_tie(sv, elt->key, klen); svp = &sv; } @@ -143,8 +144,10 @@ modperl_env_untie(mg_flags); while (ent->key) { + SV *sv = newSVpvn(ent->val, ent->vlen); hv_store(hv, ent->key, ent->klen, - newSVpvn(ent->val, ent->vlen), ent->hash); + sv, ent->hash); + modperl_envelem_tie(sv, ent->key, ent->klen); ent++; } 1.13 +3 -0 modperl-2.0/src/modules/perl/modperl_env.h Index: modperl_env.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_env.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- modperl_env.h 30 May 2002 23:35:02 -0000 1.12 +++ modperl_env.h 22 Oct 2002 02:42:03 -0000 1.13 @@ -11,6 +11,9 @@ #define modperl_env_tie(mg_flags) \ MP_magical_tie(ENVHV, mg_flags) +#define modperl_envelem_tie(sv, key, klen) \ + sv_magic(sv, Nullsv, 'e', key, klen) + void modperl_env_hash_keys(void); void modperl_env_clear(pTHX); 1.15 +49 -1 modperl-2.0/src/modules/perl/modperl_perl_global.c Index: modperl_perl_global.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_perl_global.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- modperl_perl_global.c 15 Nov 2001 01:25:00 -0000 1.14 +++ modperl_perl_global.c 22 Oct 2002 02:42:03 -0000 1.15 @@ -170,11 +170,56 @@ *avcv->av = avcv->origav; } +/* + * newHVhv is not good enough since it does not copy magic. + * XXX: 5.8.0+ newHVhv has some code thats faster than hv_iternext + */ +static HV *copyENV(pTHX_ HV *ohv) +{ + HE *entry, *hv_eiter; + I32 hv_riter; + register HV *hv; + STRLEN hv_max = HvMAX(ohv); + STRLEN hv_fill = HvFILL(ohv); + + hv = newHV(); + while (hv_max && hv_max + 1 >= hv_fill * 2) { + hv_max = hv_max / 2; /* Is always 2^n-1 */ + } + + HvMAX(hv) = hv_max; + + if (!hv_fill) { + return hv; + } + + hv_riter = HvRITER(ohv); /* current root of iterator */ + hv_eiter = HvEITER(ohv); /* current entry of iterator */ + + hv_iterinit(ohv); + while ((entry = hv_iternext(ohv))) { + SV *sv = newSVsv(HeVAL(entry)); + modperl_envelem_tie(sv, HeKEY(entry), HeKLEN(entry)); + hv_store(hv, HeKEY(entry), HeKLEN(entry), + sv, HeHASH(entry)); + } + + HvRITER(ohv) = hv_riter; + HvEITER(ohv) = hv_eiter; + + hv_magic(hv, Nullgv, 'E'); + + TAINT_NOT; + + return hv; +} + static void modperl_perl_global_gvhv_save(pTHX_ modperl_perl_global_gvhv_t *gvhv) { - U32 mg_flags; HV *hv = GvHV(gvhv->gv); +#if 0 + U32 mg_flags; MAGIC *mg = SvMAGIC(hv); /* @@ -201,6 +246,9 @@ /* XXX: maybe newHVhv should do this? */ hv_magic(gvhv->tmphv, Nullgv, mg->mg_type); } +#else + gvhv->tmphv = copyENV(aTHX_ hv); +#endif gvhv->orighv = hv; GvHV(gvhv->gv) = gvhv->tmphv; 1.3 +9 -1 modperl-2.0/t/response/TestModperl/env.pm Index: env.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestModperl/env.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- env.pm 11 Apr 2002 11:08:44 -0000 1.2 +++ env.pm 22 Oct 2002 02:42:03 -0000 1.3 @@ -7,13 +7,14 @@ use APR::Table (); use Apache::Test; +use Apache::TestUtil; use Apache::Const -compile => 'OK'; sub handler { my $r = shift; - plan $r, tests => 20; + plan $r, tests => 20 + keys(%ENV); my $env = $r->subprocess_env; @@ -59,6 +60,13 @@ ok $ENV{SERVER_SOFTWARE}; ok $env->get('SERVER_SOFTWARE'); + + #Make sure each key can be deleted + + for my $key (sort keys %ENV) { + eval { delete $ENV{$key}; }; + ok t_cmp('', $@, $key); + } Apache::OK; }