cvs commit: modperl-2.0/src/modules/perl modperl_mgv.c modperl_util.c modperl_util.h
dougm 01/10/12 20:22:15 Modified:src/modules/perl modperl_mgv.c modperl_util.c modperl_util.h Log: making modperl_perl_hv_fetch_he a public function Revision ChangesPath 1.15 +0 -33 modperl-2.0/src/modules/perl/modperl_mgv.c Index: modperl_mgv.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- modperl_mgv.c 2001/04/25 03:13:58 1.14 +++ modperl_mgv.c 2001/10/13 03:22:15 1.15 @@ -17,39 +17,6 @@ #define modperl_mgv_new_namen(mgv, p, n) \ modperl_mgv_new_w_name(mgv, p, n, 0) -/* - * similar to hv_fetch_ent, but takes string key and key len rather than SV - * also skips magic and utf8 fu, since we are only dealing with symbol tables - */ -static HE *S_hv_fetch_he(pTHX_ HV *hv, - register char *key, - register I32 klen, - register U32 hash) -{ -register XPVHV *xhv; -register HE *entry; - -xhv = (XPVHV *)SvANY(hv); -if (!xhv-xhv_array) { -return 0; -} -entry = ((HE**)xhv-xhv_array)[hash (I32) xhv-xhv_max]; - -for (; entry; entry = HeNEXT(entry)) { -if (HeHASH(entry) != hash) -continue; -if (HeKLEN(entry) != klen) -continue; -if (HeKEY(entry) != key memNE(HeKEY(entry),key,klen)) -continue; -return entry; -} - -return 0; -} - -#define hv_fetch_he(hv,k,l,h) S_hv_fetch_he(aTHX_ hv,k,l,h) - int modperl_mgv_equal(modperl_mgv_t *mgv1, modperl_mgv_t *mgv2) { 1.26 +35 -0 modperl-2.0/src/modules/perl/modperl_util.c Index: modperl_util.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- modperl_util.c2001/10/08 23:34:07 1.25 +++ modperl_util.c2001/10/13 03:22:15 1.26 @@ -399,6 +399,41 @@ } } +/* + * similar to hv_fetch_ent, but takes string key and key len rather than SV + * also skips magic and utf8 fu, since we are only dealing with internal tables + */ +HE *modperl_perl_hv_fetch_he(pTHX_ HV *hv, + register char *key, + register I32 klen, + register U32 hash) +{ +register XPVHV *xhv; +register HE *entry; + +xhv = (XPVHV *)SvANY(hv); +if (!xhv-xhv_array) { +return 0; +} + +entry = ((HE**)xhv-xhv_array)[hash (I32)xhv-xhv_max]; + +for (; entry; entry = HeNEXT(entry)) { +if (HeHASH(entry) != hash) { +continue; +} +if (HeKLEN(entry) != klen) { +continue; +} +if (HeKEY(entry) != key memNE(HeKEY(entry), key, klen)) { +continue; +} +return entry; +} + +return 0; +} + void modperl_perl_call_list(pTHX_ AV *subs, const char *name) { I32 i, oldscope = PL_scopestack_ix; 1.25 +8 -0 modperl-2.0/src/modules/perl/modperl_util.h Index: modperl_util.h === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.h,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- modperl_util.h2001/10/08 23:34:07 1.24 +++ modperl_util.h2001/10/13 03:22:15 1.25 @@ -68,6 +68,14 @@ MP_INLINE void modperl_perl_av_push_elts_ref(pTHX_ AV *dst, AV *src); +HE *modperl_perl_hv_fetch_he(pTHX_ HV *hv, + register char *key, + register I32 klen, + register U32 hash); + +#define hv_fetch_he(hv,k,l,h) \ +modperl_perl_hv_fetch_he(aTHX_ hv, k, l, h) + void modperl_perl_call_list(pTHX_ AV *subs, const char *name); void modperl_perl_exit(pTHX_ int status);
cvs commit: modperl-2.0/src/modules/perl modperl_mgv.c
dougm 01/03/25 11:04:56 Modified:src/modules/perl modperl_mgv.c Log: prevent core dump if HvARRAY is NULL Revision ChangesPath 1.9 +3 -0 modperl-2.0/src/modules/perl/modperl_mgv.c Index: modperl_mgv.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- modperl_mgv.c 2001/03/17 06:03:37 1.8 +++ modperl_mgv.c 2001/03/25 19:04:56 1.9 @@ -30,6 +30,9 @@ register HE *entry; xhv = (XPVHV *)SvANY(hv); +if (!xhv-xhv_array) { +return 0; +} entry = ((HE**)xhv-xhv_array)[hash (I32) xhv-xhv_max]; for (; entry; entry = HeNEXT(entry)) {
cvs commit: modperl-2.0/src/modules/perl modperl_mgv.c modperl_perl_includes.h
dougm 01/03/14 17:26:18 Modified:src/modules/perl modperl_mgv.c modperl_perl_includes.h Log: fixes to compile with non-ithreads 5.6.0 Perl Revision ChangesPath 1.2 +3 -1 modperl-2.0/src/modules/perl/modperl_mgv.c Index: modperl_mgv.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- modperl_mgv.c 2001/03/09 23:42:04 1.1 +++ modperl_mgv.c 2001/03/15 01:26:18 1.2 @@ -205,7 +205,7 @@ else { if ((cv = get_cv(name, FALSE))) { handler-mgv_cv = -modperl_mgv_compile(aTHX, p, HvNAME(GvSTASH(CvGV(cv; +modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(CvGV(cv; modperl_mgv_append(aTHX_ p, handler-mgv_cv, GvNAME(CvGV(cv))); MpHandlerPARSED_On(handler); return 1; @@ -312,8 +312,10 @@ static int modperl_dw_hash_handlers(apr_pool_t *p, server_rec *s, void *cfg, char *d, void *data) { +#ifdef USE_ITHREADS MP_dSCFG(s); MP_dSCFG_dTHX; +#endif int i; modperl_dir_config_t *dir_cfg = (modperl_dir_config_t *)cfg; 1.4 +4 -0 modperl-2.0/src/modules/perl/modperl_perl_includes.h Index: modperl_perl_includes.h === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_perl_includes.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- modperl_perl_includes.h 2001/01/21 18:19:56 1.3 +++ modperl_perl_includes.h 2001/03/15 01:26:18 1.4 @@ -39,4 +39,8 @@ #undef dNOOP #define dNOOP extern int __attribute__ ((unused)) Perl___notused +#ifndef G_METHOD +# define G_METHOD 64 +#endif + #endif /* MODPERL_PERL_INCLUDES_H */
cvs commit: modperl-2.0/src/modules/perl modperl_mgv.c modperl_mgv.h
dougm 01/03/09 15:42:05 Added: src/modules/perl modperl_mgv.c modperl_mgv.h Log: module for pre-computing gv_fetchpv lookups of handlers Revision ChangesPath 1.1 modperl-2.0/src/modules/perl/modperl_mgv.c Index: modperl_mgv.c === #include "mod_perl.h" /* * mgv = ModPerl Glob Value || Mostly Glob Value * as close to GV as we can get without actually using a GV * need config structures to be free of Perl structures */ #define modperl_mgv_new_w_name(mgv, p, n, copy) \ mgv = modperl_mgv_new(p); \ mgv-len = strlen(n); \ mgv-name = (copy ? apr_pstrndup(p, n, mgv-len) : n) #define modperl_mgv_new_name(mgv, p, n) \ modperl_mgv_new_w_name(mgv, p, n, 1) #define modperl_mgv_new_namen(mgv, p, n) \ modperl_mgv_new_w_name(mgv, p, n, 0) /* * similar to hv_fetch_ent, but takes string key and key len rather than SV * also skips magic and utf8 fu, since we are only dealing with symbol tables */ static HE *S_hv_fetch_he(pTHX_ HV *hv, register char *key, register I32 klen, register U32 hash) { register XPVHV *xhv; register HE *entry; xhv = (XPVHV *)SvANY(hv); entry = ((HE**)xhv-xhv_array)[hash (I32) xhv-xhv_max]; for (; entry; entry = HeNEXT(entry)) { if (HeHASH(entry) != hash) continue; if (HeKLEN(entry) != klen) continue; if (HeKEY(entry) != key memNE(HeKEY(entry),key,klen)) continue; return entry; } return 0; } #define hv_fetch_he(hv,k,l,h) S_hv_fetch_he(aTHX_ hv,k,l,h) modperl_mgv_t *modperl_mgv_new(apr_pool_t *p) { return (modperl_mgv_t *)apr_pcalloc(p, sizeof(modperl_mgv_t)); } #define modperl_mgv_get_next(mgv) \ if (mgv-name) { \ mgv-next = modperl_mgv_new(p); \ mgv = mgv-next; \ } #define modperl_mgv_hash(mgv) \ PERL_HASH(mgv-hash, mgv-name, mgv-len) /* MP_TRACE_h(MP_FUNC, "%s...hash=%ld\n", mgv-name, mgv-hash) */ modperl_mgv_t *modperl_mgv_compile(pTHX_ apr_pool_t *p, register const char *name) { register const char *namend; I32 len; modperl_mgv_t *symbol = modperl_mgv_new(p); modperl_mgv_t *mgv = symbol; /* @mgv = split '::', $name */ for (namend = name; *namend; namend++) { if (*namend == ':' namend[1] == ':') { if ((len = (namend - name)) 0) { modperl_mgv_get_next(mgv); mgv-name = apr_palloc(p, len+3); Copy(name, mgv-name, len, char); mgv-name[len++] = ':'; mgv-name[len++] = ':'; mgv-name[len] = '\0'; mgv-len = len; modperl_mgv_hash(mgv); } name = namend + 2; } } modperl_mgv_get_next(mgv); mgv-len = namend - name; mgv-name = apr_pstrndup(p, name, mgv-len); modperl_mgv_hash(mgv); return symbol; } void modperl_mgv_append(pTHX_ apr_pool_t *p, modperl_mgv_t *symbol, const char *name) { modperl_mgv_t *mgv = symbol; while (mgv-next) { mgv = mgv-next; } mgv-name = apr_pstrcat(p, mgv-name, "::", NULL); mgv-len += 2; modperl_mgv_hash(mgv); mgv-next = modperl_mgv_compile(aTHX_ p, name); } /* faster replacement for gv_fetchpv() */ GV *modperl_mgv_lookup(pTHX_ modperl_mgv_t *symbol) { HV *stash = PL_defstash; modperl_mgv_t *mgv; if (!symbol-hash) { /* special case for MyClass-handler */ return (GV*)sv_2mortal(newSVpvn(symbol-name, symbol-len)); } for (mgv = symbol; mgv; mgv = mgv-next) { HE *he = hv_fetch_he(stash, mgv-name, mgv-len, mgv-hash); if (he) { if (mgv-next) { stash = GvHV((GV *)HeVAL(he)); } else { return (GV *)HeVAL(he); } } else { return Nullgv; } } return Nullgv; } int modperl_mgv_resolve(pTHX_ modperl_handler_t *handler, apr_pool_t *p, const char *name) { CV *cv; GV *gv; HV *stash=Nullhv; char *handler_name = "handler"; char *tmp; if (strnEQ(name, "sub ", 4)) { MP_TRACE_h(MP_FUNC, "handler is anonymous\n"); MpHandlerANON_On(handler); MpHandlerPARSED_On(handler); return 1; } if ((tmp = strstr((char *)name, "-"))) { int package_len = strlen(name) - strlen(tmp); char *package = apr_pstrndup(p, name, package_len); name = package;