X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=49bdd205288bf20f2d37735e02a13da9f01ec401;hp=9a2b6c06ca9d3305d0c579b29f4e1315ab2d62f5;hb=7f2abe70c4334df1462a163d36bd809dd21d915e;hpb=cd3bb52166ed9f6b823c9218ea73edc027dfe1c8 diff --git a/indirect.xs b/indirect.xs index 9a2b6c0..49bdd20 100644 --- a/indirect.xs +++ b/indirect.xs @@ -200,6 +200,7 @@ typedef struct { #include "ptable.h" #define ptable_store(T, K, V) ptable_store(aTHX_ (T), (K), (V)) +#define ptable_delete(T, K) ptable_delete(aTHX_ (T), (K)) #define ptable_clear(T) ptable_clear(aTHX_ (T)) #define ptable_free(T) ptable_free(aTHX_ (T)) @@ -442,7 +443,7 @@ STATIC void indirect_map_delete(pTHX_ const OP *o) { #define indirect_map_delete(O) indirect_map_delete(aTHX_ (O)) dMY_CXT; - ptable_store(MY_CXT.map, o, NULL); + ptable_delete(MY_CXT.map, o); } /* --- Check functions ----------------------------------------------------- */ @@ -483,7 +484,7 @@ STATIC int indirect_find(pTHX_ SV *sv, const char *s, STRLEN *pos) { STATIC OP *(*indirect_old_ck_const)(pTHX_ OP *) = 0; STATIC OP *indirect_ck_const(pTHX_ OP *o) { - o = CALL_FPTR(indirect_old_ck_const)(aTHX_ o); + o = indirect_old_ck_const(aTHX_ o); if (indirect_hint()) { SV *sv = cSVOPo_sv; @@ -556,14 +557,14 @@ STATIC OP *indirect_ck_rv2sv(pTHX_ OP *o) { goto done; } - o = CALL_FPTR(indirect_old_ck_rv2sv)(aTHX_ o); + o = indirect_old_ck_rv2sv(aTHX_ o); indirect_map_store(o, pos, sv, CopLINE(&PL_compiling)); return o; } done: - o = CALL_FPTR(indirect_old_ck_rv2sv)(aTHX_ o); + o = indirect_old_ck_rv2sv(aTHX_ o); indirect_map_delete(o); return o; @@ -574,7 +575,7 @@ done: STATIC OP *(*indirect_old_ck_padany)(pTHX_ OP *) = 0; STATIC OP *indirect_ck_padany(pTHX_ OP *o) { - o = CALL_FPTR(indirect_old_ck_padany)(aTHX_ o); + o = indirect_old_ck_padany(aTHX_ o); if (indirect_hint()) { SV *sv; @@ -608,7 +609,7 @@ STATIC OP *indirect_ck_scope(pTHX_ OP *o) { case OP_SCOPE: old_ck = indirect_old_ck_scope; break; case OP_LINESEQ: old_ck = indirect_old_ck_lineseq; break; } - o = CALL_FPTR(old_ck)(aTHX_ o); + o = old_ck(aTHX_ o); if (indirect_hint()) { indirect_map_store(o, PL_oldbufptr - SvPVX_const(PL_linestr), @@ -648,7 +649,7 @@ STATIC OP *indirect_ck_method(pTHX_ OP *o) { * expression. */ line = oi->line; - o = CALL_FPTR(indirect_old_ck_method)(aTHX_ o); + o = indirect_old_ck_method(aTHX_ o); /* o may now be a method_named */ indirect_map_store(o, pos, sv, line); @@ -657,7 +658,7 @@ STATIC OP *indirect_ck_method(pTHX_ OP *o) { } done: - o = CALL_FPTR(indirect_old_ck_method)(aTHX_ o); + o = indirect_old_ck_method(aTHX_ o); indirect_map_delete(o); return o; @@ -685,14 +686,14 @@ STATIC OP *indirect_ck_method_named(pTHX_ OP *o) { goto done; line = CopLINE(&PL_compiling); - o = CALL_FPTR(indirect_old_ck_method_named)(aTHX_ o); + o = indirect_old_ck_method_named(aTHX_ o); indirect_map_store(o, pos, sv, line); return o; } done: - o = CALL_FPTR(indirect_old_ck_method_named)(aTHX_ o); + o = indirect_old_ck_method_named(aTHX_ o); indirect_map_delete(o); return o; @@ -700,22 +701,12 @@ done: /* ... ck_entersub ......................................................... */ -STATIC int indirect_is_indirect(const indirect_op_info_t *moi, const indirect_op_info_t *ooi) { - if (moi->pos > ooi->pos) - return 0; - - if (moi->pos == ooi->pos) - return moi->len == ooi->len && !memcmp(moi->buf, ooi->buf, moi->len); - - return 1; -} - STATIC OP *(*indirect_old_ck_entersub)(pTHX_ OP *) = 0; STATIC OP *indirect_ck_entersub(pTHX_ OP *o) { SV *code = indirect_hint(); - o = CALL_FPTR(indirect_old_ck_entersub)(aTHX_ o); + o = indirect_old_ck_entersub(aTHX_ o); if (code) { const indirect_op_info_t *moi, *ooi; @@ -759,7 +750,10 @@ STATIC OP *indirect_ck_entersub(pTHX_ OP *o) { if (!ooi) goto done; - if (indirect_is_indirect(moi, ooi)) { + /* When positions are identical, the method and the object must have the + * same name. But it also means that it is an indirect call, as "foo->foo" + * results in different positions. */ + if (moi->pos <= ooi->pos) { SV *file; dSP;