X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Op.xs;h=44c283e99c25c43e10edf4d4c237c54eb082d1c3;hb=fa4378c8262b5f0d476bb0af2d52551dc3fe0cc0;hp=fe67d0838e80e459cefcb49c9bcee3d9af81d18a;hpb=61188a20996808b5a4ad19cc35d272ff7d83b8f1;p=perl%2Fmodules%2FSub-Op.git diff --git a/Op.xs b/Op.xs index fe67d08..44c283e 100644 --- a/Op.xs +++ b/Op.xs @@ -55,8 +55,6 @@ typedef struct { HV *map; - AV *next_pkg; - AV *next_name; CV *placeholder; #if SO_THREADSAFE tTHX owner; @@ -100,16 +98,16 @@ STATIC SV *so_clone(pTHX_ SV *sv, tTHX owner) { /* PerlMemShared_free() needs the [ap]PTBLMS_? default values */ #define ptable_store(T, K, V) ptable_store(aPTBLMS_ (T), (K), (V)) -STATIC ptable *sub_op_name = NULL; +STATIC ptable *so_op_name = NULL; #ifdef USE_ITHREADS -STATIC perl_mutex sub_op_name_mutex; +STATIC perl_mutex so_op_name_mutex; #endif typedef struct { STRLEN len; char buf; -} sub_op_name_t; +} so_op_name_t; /* --- Public API ---------------------------------------------------------- */ @@ -140,39 +138,8 @@ void sub_op_register(pTHX_ const sub_op_keyword *k) { /* --- Private helpers ----------------------------------------------------- */ -#define SO_LINKLIST(O) ((O)->op_next ? (O)->op_next : sub_op_linklist(O)) - -STATIC OP *sub_op_linklist(pTHX_ OP *o) { -#define sub_op_linklist(O) sub_op_linklist(aTHX_ (O)) - OP *first; - - if (o->op_next) - return o->op_next; - - /* establish postfix order */ - first = cUNOPo->op_first; - if (first) { - register OP *kid; - o->op_next = SO_LINKLIST(first); - kid = first; - for (;;) { - if (kid->op_sibling) { - kid->op_next = SO_LINKLIST(kid->op_sibling); - kid = kid->op_sibling; - } else { - kid->op_next = o; - break; - } - } - } - else - o->op_next = o; - - return o->op_next; -} - -STATIC IV sub_op_hint(pTHX) { -#define sub_op_hint() sub_op_hint(aTHX) +STATIC IV so_hint(pTHX) { +#define so_hint() so_hint(aTHX) SV *hint; #if SO_HAS_PERL(5, 9, 5) @@ -193,12 +160,12 @@ STATIC IV sub_op_hint(pTHX) { return (SvOK(hint) && SvIOK(hint)) ? SvIVX(hint) : 0; } -STATIC OP *(*sub_op_old_ck_entersub)(pTHX_ OP *) = 0; +STATIC OP *(*so_old_ck_entersub)(pTHX_ OP *) = 0; -STATIC OP *sub_op_ck_entersub(pTHX_ OP *o) { - o = CALL_FPTR(sub_op_old_ck_entersub)(aTHX_ o); +STATIC OP *so_ck_entersub(pTHX_ OP *o) { + o = CALL_FPTR(so_old_ck_entersub)(aTHX_ o); - if (sub_op_hint()) { + if (so_hint()) { OP *ex_list, *rv2cv, *gvop, *last_arg = NULL; GV *gv; @@ -273,19 +240,17 @@ STATIC OP *sub_op_ck_entersub(pTHX_ OP *o) { } } - sub_op_linklist(o); - { - sub_op_name_t *on = PerlMemShared_malloc(sizeof(*on) + len); + so_op_name_t *on = PerlMemShared_malloc(sizeof(*on) + len); Copy(name, &on->buf, len, char); (&on->buf)[len] = '\0'; on->len = len; #ifdef USE_ITHREADS - MUTEX_LOCK(&sub_op_name_mutex); + MUTEX_LOCK(&so_op_name_mutex); #endif /* USE_ITHREADS */ - ptable_store(sub_op_name, o, on); + ptable_store(so_op_name, o, on); #ifdef USE_ITHREADS - MUTEX_UNLOCK(&sub_op_name_mutex); + MUTEX_UNLOCK(&so_op_name_mutex); #endif /* USE_ITHREADS */ } } @@ -295,12 +260,12 @@ skip: return o; } -STATIC OP *(*sub_op_old_ck_gelem)(pTHX_ OP *) = 0; +STATIC OP *(*so_old_ck_gelem)(pTHX_ OP *) = 0; -STATIC OP *sub_op_ck_gelem(pTHX_ OP *o) { - o = CALL_FPTR(sub_op_old_ck_entersub)(aTHX_ o); +STATIC OP *so_ck_gelem(pTHX_ OP *o) { + o = CALL_FPTR(so_old_ck_entersub)(aTHX_ o); - if (sub_op_hint()) { + if (so_hint()) { OP *rv2gv, *gvop; GV *gv; @@ -342,24 +307,22 @@ PROTOTYPES: ENABLE BOOT: { - sub_op_name = ptable_new(); + so_op_name = ptable_new(); #ifdef USE_ITHREADS - MUTEX_INIT(&sub_op_name_mutex); + MUTEX_INIT(&so_op_name_mutex); #endif MY_CXT_INIT; MY_CXT.map = newHV(); - MY_CXT.next_pkg = newAV(); - MY_CXT.next_name = newAV(); MY_CXT.placeholder = NULL; #if SO_THREADSAFE MY_CXT.owner = aTHX; #endif /* SO_THREADSAFE */ - sub_op_old_ck_entersub = PL_check[OP_ENTERSUB]; - PL_check[OP_ENTERSUB] = sub_op_ck_entersub; - sub_op_old_ck_gelem = PL_check[OP_GELEM]; - PL_check[OP_GELEM] = sub_op_ck_gelem; + so_old_ck_entersub = PL_check[OP_ENTERSUB]; + PL_check[OP_ENTERSUB] = so_ck_entersub; + so_old_ck_gelem = PL_check[OP_GELEM]; + PL_check[OP_GELEM] = so_ck_gelem; } #if SO_THREADSAFE @@ -381,8 +344,6 @@ CODE: { MY_CXT_CLONE; MY_CXT.map = map; - MY_CXT.next_pkg = newAV(); - MY_CXT.next_name = newAV(); MY_CXT.placeholder = placeholder; MY_CXT.owner = aTHX; } @@ -408,7 +369,7 @@ _custom_name(SV *op) PROTOTYPE: $ PREINIT: OP *o; - sub_op_name_t *on; + so_op_name_t *on; PPCODE: if (!SvROK(op)) XSRETURN_UNDEF; @@ -416,11 +377,11 @@ PPCODE: if (!o || o->op_type != OP_CUSTOM) XSRETURN_UNDEF; #ifdef USE_ITHREADS - MUTEX_LOCK(&sub_op_name_mutex); + MUTEX_LOCK(&so_op_name_mutex); #endif /* USE_ITHREADS */ - on = ptable_fetch(sub_op_name, o); + on = ptable_fetch(so_op_name, o); #ifdef USE_ITHREADS - MUTEX_UNLOCK(&sub_op_name_mutex); + MUTEX_UNLOCK(&so_op_name_mutex); #endif /* USE_ITHREADS */ if (!on) XSRETURN_UNDEF;