+#ifdef PERL_MAD
+
+TOKEN *
+Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop)
+{
+ TOKEN *tk;
+ Newxz(tk, 1, TOKEN);
+ tk->tk_type = (OPCODE)optype;
+ tk->tk_type = 12345;
+ tk->tk_lval = lval;
+ tk->tk_mad = madprop;
+ return tk;
+}
+
+void
+Perl_token_free(pTHX_ TOKEN* tk)
+{
+ if (tk->tk_type != 12345)
+ return;
+ mad_free(tk->tk_mad);
+ Safefree(tk);
+}
+
+void
+Perl_token_getmad(pTHX_ TOKEN* tk, OP* o, char slot)
+{
+ MADPROP* mp;
+ MADPROP* tm;
+ if (tk->tk_type != 12345) {
+ Perl_warner(aTHX_ packWARN(WARN_MISC),
+ "Invalid TOKEN object ignored");
+ return;
+ }
+ tm = tk->tk_mad;
+ if (!tm)
+ return;
+
+ /* faked up qw list? */
+ if (slot == '(' &&
+ tm->mad_type == MAD_SV &&
+ SvPVX((SV*)tm->mad_val)[0] == 'q')
+ slot = 'x';
+
+ if (o) {
+ mp = o->op_madprop;
+ if (mp) {
+ for (;;) {
+ /* pretend constant fold didn't happen? */
+ if (mp->mad_key == 'f' &&
+ (o->op_type == OP_CONST ||
+ o->op_type == OP_GV) )
+ {
+ token_getmad(tk,(OP*)mp->mad_val,slot);
+ return;
+ }
+ if (!mp->mad_next)
+ break;
+ mp = mp->mad_next;
+ }
+ mp->mad_next = tm;
+ mp = mp->mad_next;
+ }
+ else {
+ o->op_madprop = tm;
+ mp = o->op_madprop;
+ }
+ if (mp->mad_key == 'X')
+ mp->mad_key = slot; /* just change the first one */
+
+ tk->tk_mad = 0;
+ }
+ else
+ mad_free(tm);
+ Safefree(tk);
+}
+
+void
+Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot)
+{
+ MADPROP* mp;
+ if (!from)
+ return;
+ if (o) {
+ mp = o->op_madprop;
+ if (mp) {
+ for (;;) {
+ /* pretend constant fold didn't happen? */
+ if (mp->mad_key == 'f' &&
+ (o->op_type == OP_CONST ||
+ o->op_type == OP_GV) )
+ {
+ op_getmad(from,(OP*)mp->mad_val,slot);
+ return;
+ }
+ if (!mp->mad_next)
+ break;
+ mp = mp->mad_next;
+ }
+ mp->mad_next = newMADPROP(slot,MAD_OP,from,0);
+ }
+ else {
+ o->op_madprop = newMADPROP(slot,MAD_OP,from,0);
+ }
+ }
+}
+
+void
+Perl_op_getmad(pTHX_ OP* from, OP* o, char slot)
+{
+ MADPROP* mp;
+ if (!from)
+ return;
+ if (o) {
+ mp = o->op_madprop;
+ if (mp) {
+ for (;;) {
+ /* pretend constant fold didn't happen? */
+ if (mp->mad_key == 'f' &&
+ (o->op_type == OP_CONST ||
+ o->op_type == OP_GV) )
+ {
+ op_getmad(from,(OP*)mp->mad_val,slot);
+ return;
+ }
+ if (!mp->mad_next)
+ break;
+ mp = mp->mad_next;
+ }
+ mp->mad_next = newMADPROP(slot,MAD_OP,from,1);
+ }
+ else {
+ o->op_madprop = newMADPROP(slot,MAD_OP,from,1);
+ }
+ }
+ else {
+ PerlIO_printf(PerlIO_stderr(),
+ "DESTROYING op = %0"UVxf"\n", PTR2UV(from));
+ op_free(from);
+ }
+}
+
+void
+Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot)
+{
+ MADPROP* tm;
+ if (!mp || !o)
+ return;
+ if (slot)
+ mp->mad_key = slot;
+ tm = o->op_madprop;
+ o->op_madprop = mp;
+ for (;;) {
+ if (!mp->mad_next)
+ break;
+ mp = mp->mad_next;
+ }
+ mp->mad_next = tm;
+}
+
+void
+Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot)
+{
+ if (!o)
+ return;
+ addmad(tm, &(o->op_madprop), slot);
+}
+
+void
+Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot)
+{
+ MADPROP* mp;
+ if (!tm || !root)
+ return;
+ if (slot)
+ tm->mad_key = slot;
+ mp = *root;
+ if (!mp) {
+ *root = tm;
+ return;
+ }
+ for (;;) {
+ if (!mp->mad_next)
+ break;
+ mp = mp->mad_next;
+ }
+ mp->mad_next = tm;
+}
+
+MADPROP *
+Perl_newMADsv(pTHX_ char key, SV* sv)
+{
+ return newMADPROP(key, MAD_SV, sv, 0);
+}
+
+MADPROP *
+Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen)
+{
+ MADPROP *mp;
+ Newxz(mp, 1, MADPROP);
+ mp->mad_next = 0;
+ mp->mad_key = key;
+ mp->mad_vlen = vlen;
+ mp->mad_type = type;
+ mp->mad_val = val;
+/* PerlIO_printf(PerlIO_stderr(), "NEW mp = %0x\n", mp); */
+ return mp;
+}
+
+void
+Perl_mad_free(pTHX_ MADPROP* mp)
+{
+/* PerlIO_printf(PerlIO_stderr(), "FREE mp = %0x\n", mp); */
+ if (!mp)
+ return;
+ if (mp->mad_next)
+ mad_free(mp->mad_next);
+/* if (PL_lex_state != LEX_NOTPARSING && mp->mad_vlen)
+ PerlIO_printf(PerlIO_stderr(), "DESTROYING '%c'=<%s>\n", mp->mad_key & 255, mp->mad_val); */
+ switch (mp->mad_type) {
+ case MAD_NULL:
+ break;
+ case MAD_PV:
+ Safefree((char*)mp->mad_val);
+ break;
+ case MAD_OP:
+ if (mp->mad_vlen) /* vlen holds "strong/weak" boolean */
+ op_free((OP*)mp->mad_val);
+ break;
+ case MAD_SV:
+ sv_free((SV*)mp->mad_val);
+ break;
+ default:
+ PerlIO_printf(PerlIO_stderr(), "Unrecognized mad\n");
+ break;
+ }
+ Safefree(mp);
+}
+
+#endif
+