     1			/*    deb.c
     2			 *
     3			 *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
     4			 *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
     5			 *
     6			 *    You may distribute under the terms of either the GNU General Public
     7			 *    License or the Artistic License, as specified in the README file.
     8			 *
     9			 */
    10			
    11			/*
    12			 * "Didst thou think that the eyes of the White Tower were blind?  Nay, I
    13			 * have seen more than thou knowest, Gray Fool."  --Denethor
    14			 */
    15			
    16			/*
    17			 * This file contains various utilities for producing debugging output
    18			 * (mainly related to displaying the stack)
    19			 */
    20			
    21			#include "EXTERN.h"
    22			#define PERL_IN_DEB_C
    23			#include "perl.h"
    24			
    25			#if defined(PERL_IMPLICIT_CONTEXT)
    26			void
    27			Perl_deb_nocontext(const char *pat, ...)
    28			{
    29			#ifdef DEBUGGING
    30			    dTHX;
    31			    va_list args;
    32			    va_start(args, pat);
    33			    vdeb(pat, &args);
    34			    va_end(args);
    35			#endif /* DEBUGGING */
    36			}
    37			#endif
    38			
    39			void
    40			Perl_deb(pTHX_ const char *pat, ...)
    41	          12    {
    42			#ifdef DEBUGGING
    43	          12        va_list args;
    44	          12        va_start(args, pat);
    45	          12        vdeb(pat, &args);
    46			    va_end(args);
    47			#endif /* DEBUGGING */
    48			}
    49			
    50			void
    51			Perl_vdeb(pTHX_ const char *pat, va_list *args)
    52	          12    {
    53			#ifdef DEBUGGING
    54	          12        char* file = OutCopFILE(PL_curcop);
    55			
    56	          12        PerlIO_printf(Perl_debug_log, "(%s:%ld)\t", (file ? file : "<free>"),
    57					  (long)CopLINE(PL_curcop));
    58	          12        (void) PerlIO_vprintf(Perl_debug_log, pat, *args);
    59			#endif /* DEBUGGING */
    60			}
    61			
    62			I32
    63			Perl_debstackptrs(pTHX)
    64	      ######    {
    65			#ifdef DEBUGGING
    66	      ######        PerlIO_printf(Perl_debug_log,
    67					  "%8"UVxf" %8"UVxf" %8"IVdf" %8"IVdf" %8"IVdf"\n",
    68					  PTR2UV(PL_curstack), PTR2UV(PL_stack_base),
    69					  (IV)*PL_markstack_ptr, (IV)(PL_stack_sp-PL_stack_base),
    70					  (IV)(PL_stack_max-PL_stack_base));
    71	      ######        PerlIO_printf(Perl_debug_log,
    72					  "%8"UVxf" %8"UVxf" %8"UVuf" %8"UVuf" %8"UVuf"\n",
    73					  PTR2UV(PL_mainstack), PTR2UV(AvARRAY(PL_curstack)),
    74					  PTR2UV(PL_mainstack), PTR2UV(AvFILLp(PL_curstack)),
    75					  PTR2UV(AvMAX(PL_curstack)));
    76			#endif /* DEBUGGING */
    77	      ######        return 0;
    78			}
    79			
    80			
    81			/* dump the contents of a particular stack
    82			 * Display stack_base[stack_min+1 .. stack_max],
    83			 * and display the marks whose offsets are contained in addresses
    84			 * PL_markstack[mark_min+1 .. mark_max] and whose values are in the range
    85			 * of the stack values being displayed
    86			 *
    87			 * Only displays top 30 max
    88			 */
    89			
    90			STATIC void
    91			S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max,
    92				I32 mark_min, I32 mark_max)
    93	      ######    {
    94			#ifdef DEBUGGING
    95	      ######        register I32 i = stack_max - 30;
    96	      ######        I32 *markscan = PL_markstack + mark_min;
    97	      ######        if (i < stack_min)
    98	      ######    	i = stack_min;
    99			    
   100	      ######        while (++markscan <= PL_markstack + mark_max)
   101	      ######    	if (*markscan >= i)
   102	      ######    	    break;
   103			
   104	      ######        if (i > stack_min)
   105	      ######    	PerlIO_printf(Perl_debug_log, "... ");
   106			
   107	      ######        if (stack_base[0] != &PL_sv_undef || stack_max < 0)
   108	      ######    	PerlIO_printf(Perl_debug_log, " [STACK UNDERFLOW!!!]\n");
   109	      ######        do {
   110	      ######    	++i;
   111	      ######    	if (markscan <= PL_markstack + mark_max && *markscan < i) {
   112	      ######    	    do {
   113	      ######    		++markscan;
   114	      ######    		PerlIO_putc(Perl_debug_log, '*');
   115	      ######    	    }
   116				    while (markscan <= PL_markstack + mark_max && *markscan < i);
   117	      ######    	    PerlIO_printf(Perl_debug_log, "  ");
   118				}
   119	      ######    	if (i > stack_max)
   120	      ######    	    break;
   121	      ######    	PerlIO_printf(Perl_debug_log, "%-4s  ", SvPEEK(stack_base[i]));
   122	      ######        }
   123			    while (1);
   124	      ######        PerlIO_printf(Perl_debug_log, "\n");
   125			#endif /* DEBUGGING */
   126			}
   127			
   128			
   129			/* dump the current stack */
   130			
   131			I32
   132			Perl_debstack(pTHX)
   133	      ######    {
   134			#ifndef SKIP_DEBUGGING
   135	      ######        if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
   136	      ######    	return 0;
   137			
   138	      ######        PerlIO_printf(Perl_debug_log, "    =>  ");
   139	      ######        deb_stack_n(PL_stack_base,
   140					0,
   141					PL_stack_sp - PL_stack_base,
   142					PL_curstackinfo->si_markoff,
   143					PL_markstack_ptr - PL_markstack);
   144			
   145			
   146			#endif /* SKIP_DEBUGGING */
   147	      ######        return 0;
   148			}
   149			
   150			
   151			#ifdef DEBUGGING
   152			static const char * si_names[] = {
   153			    "UNKNOWN",
   154			    "UNDEF",
   155			    "MAIN",
   156			    "MAGIC",
   157			    "SORT",
   158			    "SIGNAL",
   159			    "OVERLOAD",
   160			    "DESTROY",
   161			    "WARNHOOK",
   162			    "DIEHOOK",
   163			    "REQUIRE"
   164			};
   165			#endif
   166			
   167			/* display all stacks */
   168			
   169			
   170			void
   171			Perl_deb_stack_all(pTHX)
   172	      ######    {
   173			#ifdef DEBUGGING
   174	      ######        I32		 ix, si_ix;
   175	      ######        PERL_SI	 *si;
   176			
   177			    /* rewind to start of chain */
   178	      ######        si = PL_curstackinfo;
   179	      ######        while (si->si_prev)
   180	      ######    	si = si->si_prev;
   181			
   182	      ######        si_ix=0;
   183	      ######        for (;;)
   184			    {
   185	      ######            const int si_name_ix = si->si_type+1; /* -1 is a valid index */
   186	      ######            const char *si_name = (si_name_ix>= sizeof(si_names)) ? "????" : si_names[si_name_ix];
   187	      ######    	PerlIO_printf(Perl_debug_log, "STACK %"IVdf": %s\n",
   188									(IV)si_ix, si_name);
   189			
   190	      ######    	for (ix=0; ix<=si->si_cxix; ix++) {
   191			
   192	      ######    	    const PERL_CONTEXT *cx = &(si->si_cxstack[ix]);
   193	      ######    	    PerlIO_printf(Perl_debug_log,
   194					    "  CX %"IVdf": %-6s => ",
   195					    (IV)ix, PL_block_type[CxTYPE(cx)]
   196				    );
   197				    /* substitution contexts don't save stack pointers etc) */
   198	      ######    	    if (CxTYPE(cx) == CXt_SUBST)
   199	      ######    		PerlIO_printf(Perl_debug_log, "\n");
   200				    else {
   201			
   202					/* Find the the current context's stack range by searching
   203					 * forward for any higher contexts using this stack; failing
   204					 * that, it will be equal to the size of the stack for old
   205					 * stacks, or PL_stack_sp for the current stack
   206					 */
   207			
   208	      ######    		I32 i, stack_min, stack_max, mark_min, mark_max;
   209	      ######    		PERL_CONTEXT *cx_n;
   210	      ######    		PERL_SI      *si_n;
   211	      ######    		OP	     *retop;
   212			
   213	      ######    		cx_n = Null(PERL_CONTEXT*);
   214			
   215					/* there's a separate stack per SI, so only search
   216					 * this one */
   217			
   218	      ######    		for (i=ix+1; i<=si->si_cxix; i++) {
   219	      ######    		    if (CxTYPE(cx) == CXt_SUBST)
   220	      ######    			continue;
   221	      ######    		    cx_n = &(si->si_cxstack[i]);
   222	      ######    		    break;
   223					}
   224			
   225	      ######    		stack_min = cx->blk_oldsp;
   226			
   227	      ######    		if (cx_n) {
   228	      ######    		    stack_max = cx_n->blk_oldsp;
   229					}
   230	      ######    		else if (si == PL_curstackinfo) {
   231	      ######    		    stack_max = PL_stack_sp - AvARRAY(si->si_stack);
   232					}
   233					else {
   234	      ######    		    stack_max = AvFILLp(si->si_stack);
   235					}
   236			
   237					/* for the other stack types, there's only one stack
   238					 * shared between all SIs */
   239			
   240	      ######    		si_n = si;
   241	      ######    		i = ix;
   242	      ######    		cx_n = Null(PERL_CONTEXT*);
   243	      ######    		for (;;) {
   244	      ######    		    i++;
   245	      ######    		    if (i > si_n->si_cxix) {
   246	      ######    			if (si_n == PL_curstackinfo)
   247	      ######    			    break;
   248						else {
   249	      ######    			    si_n = si_n->si_next;
   250	      ######    			    i = 0;
   251						}
   252					    }
   253	      ######    		    if (CxTYPE(&(si_n->si_cxstack[i])) == CXt_SUBST)
   254	      ######    			continue;
   255	      ######    		    cx_n = &(si_n->si_cxstack[i]);
   256					    break;
   257					}
   258			
   259	      ######    		mark_min  = cx->blk_oldmarksp;
   260	      ######    		if (cx_n) {
   261	      ######    		    mark_max  = cx_n->blk_oldmarksp;
   262					}
   263					else {
   264	      ######    		    mark_max = PL_markstack_ptr - PL_markstack;
   265					}
   266			
   267	      ######    		deb_stack_n(AvARRAY(si->si_stack),
   268						stack_min, stack_max, mark_min, mark_max);
   269			
   270	      ######    		if (CxTYPE(cx) == CXt_EVAL || CxTYPE(cx) == CXt_SUB
   271						|| CxTYPE(cx) == CXt_FORMAT)
   272					{
   273	      ######    		    retop = (CxTYPE(cx) == CXt_EVAL)
   274						    ? cx->blk_eval.retop : cx->blk_sub.retop;
   275			
   276	      ######    		    PerlIO_printf(Perl_debug_log, "  retop=%s\n",
   277						    retop ? OP_NAME(retop) : "(null)"
   278					    );
   279					}
   280				    }
   281				} /* next context */
   282			
   283			
   284	      ######    	if (si == PL_curstackinfo)
   285	      ######    	    break;
   286	      ######    	si = si->si_next;
   287	      ######    	si_ix++;
   288	      ######    	if (!si)
   289	      ######    	    break; /* shouldn't happen, but just in case.. */
   290			    } /* next stackinfo */
   291			
   292	      ######        PerlIO_printf(Perl_debug_log, "\n");
   293			#endif /* DEBUGGING */
   294			}
   295			
   296			/*
   297			 * Local variables:
   298			 * c-indentation-style: bsd
   299			 * c-basic-offset: 4
   300			 * indent-tabs-mode: t
   301			 * End:
   302			 *
   303			 * ex: set ts=8 sts=4 sw=4 noet:
   304			 */
