3 #define PERL_NO_GET_CONTEXT
8 #include "stolen_chunk_of_toke.c"
13 #define LEX_INTERPNORMAL 9
15 /* placeholders for PL_check entries we wrap */
17 STATIC OP *(*dd_old_ck_rv2cv)(pTHX_ OP *op);
18 STATIC OP *(*dd_old_ck_nextstate)(pTHX_ OP *op);
20 /* flag to trigger removal of temporary declaree sub */
22 static int in_declare = 0;
24 /* replacement PL_check rv2cv entry */
26 STATIC OP *dd_ck_rv2cv(pTHX_ OP *o) {
29 char tmpbuf[sizeof PL_tokenbuf];
33 SV** is_declarator_pack_ref;
34 HV* is_declarator_pack_hash;
35 SV** is_declarator_flag_ref;
38 o = dd_old_ck_rv2cv(aTHX_ o); /* let the original do its job */
42 call_argv("Devel::Declare::done_declare", G_VOID|G_DISCARD, cb_args);
47 kid = cUNOPo->op_first;
49 if (kid->op_type != OP_GV) /* not a GV so ignore */
52 if (PL_lex_state != LEX_NORMAL && PL_lex_state != LEX_INTERPNORMAL)
53 return o; /* not lexing? */
55 stash = GvSTASH(kGVOP_gv);
57 /* printf("Checking GV %s -> %s\n", HvNAME(stash), GvNAME(kGVOP_gv)); */
59 is_declarator = get_hv("Devel::Declare::declarators", FALSE);
64 is_declarator_pack_ref = hv_fetch(is_declarator, HvNAME(stash),
65 strlen(HvNAME(stash)), FALSE);
67 if (!is_declarator_pack_ref || !SvROK(*is_declarator_pack_ref))
68 return o; /* not a hashref */
70 is_declarator_pack_hash = (HV*) SvRV(*is_declarator_pack_ref);
72 is_declarator_flag_ref = hv_fetch(is_declarator_pack_hash, GvNAME(kGVOP_gv),
73 strlen(GvNAME(kGVOP_gv)), FALSE);
75 if (!is_declarator_flag_ref || !SvTRUE(*is_declarator_flag_ref))
78 s = PL_bufptr; /* copy the current buffer pointer */
80 while (s < PL_bufend && isSPACE(*s)) s++;
81 if (memEQ(s, PL_tokenbuf, strlen(PL_tokenbuf)))
82 s += strlen(PL_tokenbuf);
90 /* 0 in arg 4 is allow_package - not trying that yet :) */
92 s = scan_word(s, tmpbuf, sizeof tmpbuf, 0, &len);
95 cb_args[0] = HvNAME(stash);
96 cb_args[1] = GvNAME(kGVOP_gv);
99 call_argv("Devel::Declare::init_declare", G_VOID|G_DISCARD, cb_args);
106 static int initialized = 0;
108 MODULE = Devel::Declare PACKAGE = Devel::Declare
115 if (!initialized++) {
116 dd_old_ck_rv2cv = PL_check[OP_RV2CV];
117 PL_check[OP_RV2CV] = dd_ck_rv2cv;
123 /* ensure we only uninit when number of teardown calls matches
124 number of setup calls */
125 if (initialized && !--initialized) {
126 PL_check[OP_RV2CV] = dd_old_ck_rv2cv;