#include <xs.h>
#include <stdlib.h>

using namespace xs;

static peep_t prev_rpeepp;

static int post = 0;

OP* intercepted_entersub(pTHX) {
    auto ret = PL_ppaddr[OP_ENTERSUB](aTHX);
    ++post;
    return ret;
}

static void my_rpeep(pTHX_ OP *first)
{
    auto mark = [] (OP* it) {
        if (it->op_type == OP_ENTERSUB) {
            it->op_ppaddr = &intercepted_entersub;
        }
    };
    OP *o, *t;
    for(t = o = first; o; o = o->op_next, t = t->op_next) {
        mark(o);
        o = o->op_next;
        if(!o || o == t) break;
        mark(o);
    }
    prev_rpeepp(aTHX_ first);
}

MODULE = MyTest                PACKAGE = MyTest
PROTOTYPES: DISABLE


BOOT {
    prev_rpeepp = PL_rpeepp;
    PL_rpeepp = my_rpeep;
}

int marker() {
    RETVAL = post;
}

void test() {
    // no-op
}