]> git.vpit.fr Git - perl/modules/Sub-Op.git/blobdiff - t/Sub-Op-LexicalSub/LexicalSub.xs
Split the "custom op" part away
[perl/modules/Sub-Op.git] / t / Sub-Op-LexicalSub / LexicalSub.xs
index 62e83f833b485b36adcf21c1ab2266bbe4517d1d..9e4a2a79143fef770be5af779cd6af791f4f07e1 100644 (file)
 
 #include "sub_op.h"
 
-STATIC HV *sols_map = NULL;
+STATIC PADOFFSET sols_find_sv_in_curpad(pTHX_ SV *sv) {
+#define sols_find_sv_in_curpad(S) sols_find_sv_in_curpad(aTHX_ (S))
+ I32 ix;
+ AV  *padlist = CvPADLIST(PL_compcv);
+ AV  *comppad = (AV *) AvARRAY(padlist)[1];
+ SV **curpad  = AvARRAY(comppad);
+
+ for (ix = AvFILLp(comppad); ix > 0; --ix) {
+  if (curpad[ix] == sv)
+   return ix;
+ }
+
+ return NOT_IN_PAD;
+}
 
 STATIC OP *sols_check(pTHX_ OP *o, void *ud_) {
- char buf[sizeof(void*)*2+1];
- SV *cb = ud_;
+ OP *gvop, *last_arg, *rv2cv;
+ SV *cv = ud_;
+ GV *gv;
 
(void) hv_store(sols_map, buf, sprintf(buf, "%"UVxf, PTR2UV(o)), cb, 0);
gvop = sub_op_study(o, &last_arg, &rv2cv);
 
- return o;
-}
+ if (CvANON(cv)) {
+  OP *anon;
 
-STATIC OP *sols_ref(pTHX_ OP *o, void *ud_) {
- SV *cb = ud_;
+  CvDEPTH(CvOUTSIDE(cv))++;
+  anon = newSVOP(OP_ANONCODE, 0, (SV *) Perl_cv_clone(aTHX_ (CV *) cv));
+  CvDEPTH(CvOUTSIDE(cv))--;
 
- return newSVOP(OP_ANONCODE, o->op_flags & ~OPf_KIDS, cb);
-}
+  last_arg->op_sibling = newUNOP(OP_REFGEN, 0, anon);
 
-STATIC OP *sols_pp(pTHX) {
- dSP;
- SV *cb;
- int i, items;
-
- {
-  char buf[sizeof(void*)*2+1];
-  SV **svp;
-  svp = hv_fetch(sols_map, buf, sprintf(buf, "%"UVxf, PTR2UV(PL_op)), 0);
-  if (!svp)
-   RETURN;
-  cb = *svp;
- }
+  op_free(rv2cv);
+ } else {
+  SV *gv = (SV *) CvGV(cv);
 
- XPUSHs(cb);
- PUTBACK;
+#ifdef USE_ITHREADS
+  PAD_SVl(cPADOPx(gvop)->op_padix) = gv;
+#else
+  cSVOPx(gvop)->op_sv              = gv;
+#endif
+  SvREFCNT_inc(gv);
+ }
 
- return CALL_FPTR(PL_ppaddr[OP_ENTERSUB])(aTHX);
+ return o;
 }
 
 /* --- XS ------------------------------------------------------------------ */
@@ -54,11 +63,6 @@ MODULE = Sub::Op::LexicalSub      PACKAGE = Sub::Op::LexicalSub
 
 PROTOTYPES: ENABLE
 
-BOOT:
-{
- sols_map = newHV();
-}
-
 void
 _init(SV *name, SV *cb)
 PROTOTYPE: $$
@@ -74,9 +78,7 @@ PPCODE:
     c.proto = SvPV_const(cb, c.protolen);
    }
    c.check  = sols_check;
-   c.ref    = sols_ref;
    c.ud     = SvREFCNT_inc(cb);
-   c.pp     = sols_pp;
    sub_op_register(aTHX_ &c, 0);
   }
  }