cvs commit: modperl-2.0/src/modules/perl modperl_mgv.c modperl_util.c modperl_util.h

2001-10-12 Thread dougm

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

2001-03-25 Thread dougm

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

2001-03-14 Thread dougm

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

2001-03-09 Thread dougm

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;