3 #define PERL_NO_GET_CONTEXT
8 #include "stolen_chunk_of_toke.c"
15 #define DD_DEBUG_S printf("Buffer: %s\n", s);
21 #define LEX_INTERPNORMAL 9
23 /* placeholders for PL_check entries we wrap */
25 STATIC OP *(*dd_old_ck_rv2cv)(pTHX_ OP *op);
26 STATIC OP *(*dd_old_ck_nextstate)(pTHX_ OP *op);
28 /* flag to trigger removal of temporary declaree sub */
30 static int in_declare = 0;
32 /* replacement PL_check rv2cv entry */
34 STATIC OP *dd_ck_rv2cv(pTHX_ OP *o) {
37 char tmpbuf[sizeof PL_tokenbuf];
41 SV** is_declarator_pack_ref;
42 HV* is_declarator_pack_hash;
43 SV** is_declarator_flag_ref;
46 o = dd_old_ck_rv2cv(aTHX_ o); /* let the original do its job */
50 call_argv("Devel::Declare::done_declare", G_VOID|G_DISCARD, cb_args);
55 kid = cUNOPo->op_first;
57 if (kid->op_type != OP_GV) /* not a GV so ignore */
60 if (PL_lex_state != LEX_NORMAL && PL_lex_state != LEX_INTERPNORMAL)
61 return o; /* not lexing? */
63 stash = GvSTASH(kGVOP_gv);
66 printf("Checking GV %s -> %s\n", HvNAME(stash), GvNAME(kGVOP_gv));
69 is_declarator = get_hv("Devel::Declare::declarators", FALSE);
74 is_declarator_pack_ref = hv_fetch(is_declarator, HvNAME(stash),
75 strlen(HvNAME(stash)), FALSE);
77 if (!is_declarator_pack_ref || !SvROK(*is_declarator_pack_ref))
78 return o; /* not a hashref */
80 is_declarator_pack_hash = (HV*) SvRV(*is_declarator_pack_ref);
82 is_declarator_flag_ref = hv_fetch(is_declarator_pack_hash, GvNAME(kGVOP_gv),
83 strlen(GvNAME(kGVOP_gv)), FALSE);
85 if (!is_declarator_flag_ref || !SvTRUE(*is_declarator_flag_ref))
88 s = PL_bufptr; /* copy the current buffer pointer */
93 printf("PL_tokenbuf: %s", PL_tokenbuf);
97 * buffer will be at the beginning of the declarator, -unless- the
98 * declarator is at EOL in which case it'll be the next useful line
99 * so we don't short-circuit out if we don't find the declarator
102 while (s < PL_bufend && isSPACE(*s)) s++;
103 if (memEQ(s, PL_tokenbuf, strlen(PL_tokenbuf)))
104 s += strlen(PL_tokenbuf);
114 /* 0 in arg 4 is allow_package - not trying that yet :) */
116 s = scan_word(s, tmpbuf, sizeof tmpbuf, 0, &len);
121 cb_args[0] = HvNAME(stash);
122 cb_args[1] = GvNAME(kGVOP_gv);
125 call_argv("Devel::Declare::init_declare", G_VOID|G_DISCARD, cb_args);
132 static int initialized = 0;
134 MODULE = Devel::Declare PACKAGE = Devel::Declare
141 if (!initialized++) {
142 dd_old_ck_rv2cv = PL_check[OP_RV2CV];
143 PL_check[OP_RV2CV] = dd_ck_rv2cv;
149 /* ensure we only uninit when number of teardown calls matches
150 number of setup calls */
151 if (initialized && !--initialized) {
152 PL_check[OP_RV2CV] = dd_old_ck_rv2cv;