/* Generated from "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod" by precompile.pike running Pike v8.1 release 13
 *
 * Do NOT edit this file.
 */

#undef PRECOMPILE_API_VERSION
#define PRECOMPILE_API_VERSION 6



#undef cmod___CMOD__
#define cmod___CMOD__ 1
#line 1 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#line 1 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#line 1 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#line 3488 "/Users/hww3/devel/pike/lib/modules/Tools.pmod/Standalone.pmod/precompile.pike"







#line 3495 "/Users/hww3/devel/pike/lib/modules/Tools.pmod/Standalone.pmod/precompile.pike"
#line 1 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#line 1 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
/* -*- c -*-
|| This file is part of Pike. For copyright information see COPYRIGHT.
|| Pike is distributed under GPL, LGPL and MPL. See the file COPYING
|| for more information.
*/

#include "module.h"
#include "pike_error.h"
#include "interpret.h"
#include "pike_embed.h"
#include "module_support.h"
#include "builtin_functions.h"
#include "gc.h"
#include "opcodes.h"
#include "bignum.h"



#ifndef PIKE_UNUSED_ATTRIBUTE
#define PIKE_UNUSED_ATTRIBUTE
#endif
#define CMOD_MAP_PROGRAM_IDS_DEFINED 1
static int ___cmod_map_program_ids(int id) PIKE_UNUSED_ATTRIBUTE;
#ifndef TYPEOF
/* Compat with older Pikes. */
#define TYPEOF(SVAL)	((SVAL).type)
#define SUBTYPEOF(SVAL)	((SVAL).subtype)
#define SET_SVAL_TYPE(SVAL, TYPE)	(TYPEOF(SVAL) = TYPE)
#define SET_SVAL_SUBTYPE(SVAL, TYPE)	(SUBTYPEOF(SVAL) = TYPE)
#define SET_SVAL(SVAL, TYPE, SUBTYPE, FIELD, EXPR) do {	\
    /* Set the type afterwards to avoid a clobbered	\
     * svalue in case EXPR throws. */			\
    (SVAL).u.FIELD = (EXPR);				\
    SET_SVAL_TYPE((SVAL), (TYPE));			\
    SET_SVAL_SUBTYPE((SVAL), (SUBTYPE));		\
  } while(0)
#endif /* !TYPEOF */
#ifndef PIKE_UNUSED
/* Compat with Pike 7.8 and earlier. */
/* NB: Not strictly correct; PIKE_UNUSED was added the
 *     day after set_program_id_to_id(), but good enough.
 */
#ifndef UNUSED
#define UNUSED(X)	X
#endif
#ifndef set_program_id_to_id
/* NB: Recent Pike 7.8 has a #define that conflicts with
 *     the following declaration.
 */
static void set_program_id_to_id(void*UNUSED(id)){}
#endif
#else /* */
PMOD_EXPORT void set_program_id_to_id( int (*to)(int) );
#endif /* !PIKE_UNUSED */
#if !defined(string_has_null) && !defined(STRING_CONTENT_CHECKED)
/* This symbol was added as a macro in Pike 7.7.20, and is an
 * inline function in Pike 7.9.4 and later, at which time the
 * flag STRING_CONTENT_CHECKED was added.
 */
#define string_has_null(X) (strlen((X)->str)!=(size_t)(X)->len)
#endif


#ifndef DEFAULT_CMOD_STORAGE
#define CMOD_COND_USED
#define DEFAULT_CMOD_STORAGE static
#endif
#ifndef CMOD_COND_USED
# define f_assembler_debug_fun_num_used 1
# define f_compiler_trace_fun_num_used 1
# define f_debug_fun_num_used 1
# define f_describe_fun_num_used 1
# define f_disassemble_fun_num_used 1
# define f_dmalloc_set_name_1_fun_num_used 1
# define f_dmalloc_set_name_2_fun_num_used 1
# define f_dmalloc_set_name_fun_num_used 1
# define f_dump_backlog_fun_num_used 1
# define f_dump_dmalloc_locations_fun_num_used 1
# define f_dump_program_tables_fun_num_used 1
# define f_find_all_clones_fun_num_used 1
# define f_gc_set_watch_fun_num_used 1
# define f_get_program_layout_fun_num_used 1
# define f_leak_fun_num_used 1
# define f_list_open_fds_fun_num_used 1
# define f_locate_references_fun_num_used 1
# define f_map_all_objects_fun_num_used 1
# define f_map_all_programs_fun_num_used 1
# define f_next_fun_num_used 1
# define f_next_object_fun_num_used 1
# define f_optimizer_debug_fun_num_used 1
# define f_prev_fun_num_used 1
# define f_refs_fun_num_used 1
# define f_reset_dmalloc_fun_num_used 1
#else /* !CMOD_COND_USED */
# undef f_assembler_debug_fun_num_used
# undef f_compiler_trace_fun_num_used
# undef f_debug_fun_num_used
# undef f_describe_fun_num_used
# undef f_disassemble_fun_num_used
# undef f_dmalloc_set_name_1_fun_num_used
# undef f_dmalloc_set_name_2_fun_num_used
# undef f_dmalloc_set_name_fun_num_used
# undef f_dump_backlog_fun_num_used
# undef f_dump_dmalloc_locations_fun_num_used
# undef f_dump_program_tables_fun_num_used
# undef f_find_all_clones_fun_num_used
# undef f_gc_set_watch_fun_num_used
# undef f_get_program_layout_fun_num_used
# undef f_leak_fun_num_used
# undef f_list_open_fds_fun_num_used
# undef f_locate_references_fun_num_used
# undef f_map_all_objects_fun_num_used
# undef f_map_all_programs_fun_num_used
# undef f_next_fun_num_used
# undef f_next_object_fun_num_used
# undef f_optimizer_debug_fun_num_used
# undef f_prev_fun_num_used
# undef f_refs_fun_num_used
# undef f_reset_dmalloc_fun_num_used
#endif /* !CMOD_COND_USED */

#ifdef f_map_all_objects_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_map_all_objects_fun_num = -1;

#endif /* f_map_all_objects_fun_num_used */

#ifdef f_find_all_clones_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_find_all_clones_fun_num = -1;

#endif /* f_find_all_clones_fun_num_used */

#ifdef f_refs_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_refs_fun_num = -1;

#endif /* f_refs_fun_num_used */

#ifdef f_next_object_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_next_object_fun_num = -1;

#endif /* f_next_object_fun_num_used */

#ifdef f_next_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_next_fun_num = -1;

#endif /* f_next_fun_num_used */

#ifdef f_prev_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_prev_fun_num = -1;

#endif /* f_prev_fun_num_used */

#ifdef f_leak_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_leak_fun_num = -1;

#endif /* f_leak_fun_num_used */

#ifdef f_debug_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_debug_fun_num = -1;

#endif /* f_debug_fun_num_used */

#ifdef f_optimizer_debug_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_optimizer_debug_fun_num = -1;

#endif /* f_optimizer_debug_fun_num_used */

#ifdef f_assembler_debug_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_assembler_debug_fun_num = -1;

#endif /* f_assembler_debug_fun_num_used */

#ifdef f_dump_program_tables_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_dump_program_tables_fun_num = -1;

#endif /* f_dump_program_tables_fun_num_used */

#ifdef f_locate_references_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_locate_references_fun_num = -1;

#endif /* f_locate_references_fun_num_used */

#ifdef f_describe_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_describe_fun_num = -1;

#endif /* f_describe_fun_num_used */

#ifdef f_gc_set_watch_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_gc_set_watch_fun_num = -1;

#endif /* f_gc_set_watch_fun_num_used */

#ifdef f_dump_backlog_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_dump_backlog_fun_num = -1;

#endif /* f_dump_backlog_fun_num_used */

#ifdef f_compiler_trace_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_compiler_trace_fun_num = -1;

#endif /* f_compiler_trace_fun_num_used */

#ifdef f_disassemble_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_disassemble_fun_num = -1;

#endif /* f_disassemble_fun_num_used */

#ifdef f_reset_dmalloc_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_reset_dmalloc_fun_num = -1;

#endif /* f_reset_dmalloc_fun_num_used */

#ifdef f_dmalloc_set_name_1_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_dmalloc_set_name_1_fun_num = -1;

#endif /* f_dmalloc_set_name_1_fun_num_used */

#ifdef f_dmalloc_set_name_2_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_dmalloc_set_name_2_fun_num = -1;

#endif /* f_dmalloc_set_name_2_fun_num_used */

#ifdef f_dmalloc_set_name_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_dmalloc_set_name_fun_num = -1;

#endif /* f_dmalloc_set_name_fun_num_used */

#ifdef f_list_open_fds_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_list_open_fds_fun_num = -1;

#endif /* f_list_open_fds_fun_num_used */

#ifdef f_dump_dmalloc_locations_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_dump_dmalloc_locations_fun_num = -1;

#endif /* f_dump_dmalloc_locations_fun_num_used */

#ifdef f_get_program_layout_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_get_program_layout_fun_num = -1;

#endif /* f_get_program_layout_fun_num_used */

#ifdef f_map_all_programs_fun_num_used
DEFAULT_CMOD_STORAGE ptrdiff_t f_map_all_programs_fun_num = -1;

#endif /* f_map_all_programs_fun_num_used */
/*! @module Debug
 */

/*! @decl int(0..) map_all_objects(function(object:void) cb)
 *!
 *! Call cb for all objects that currently exist. The callback will
 *! not be called with destructed objects as it's argument.
 *!
 *! Objects might be missed if @[cb] creates new objects or destroys
 *! old ones.
 *!
 *! This function is only intended to be used for debug purposes.
 *!
 *! @returns
 *!   The total number of objects
 *!
 *! @seealso
 *!   @[next_object()], @[find_all_clones()]
 */
#define f_map_all_objects_defined
DEFAULT_CMOD_STORAGE void f_map_all_objects(INT32 args) {
#line 38 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * cb;
#line 38 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("map_all_objects",args,1);
#line 38 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(TYPEOF(Pike_sp[0-1]) != PIKE_T_FUNCTION) SIMPLE_ARG_TYPE_ERROR("map_all_objects",1,"function(object:void)");
#line 38 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
cb=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
{
    struct object *o = first_object;
    INT32 total = 0;

    while( o )
    {
        struct object *next = o->next;
        if( o->prog )
        {
            ref_push_object( o );
            safe_apply_svalue( Pike_sp-2, 1, 1 );
            pop_stack();
        }
        total++;
        o = next;
    }
    do { INT_TYPE ret_=(total); pop_stack(); push_int(ret_); return; }while(0);
#line 56 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
}

}
/*! @decl array(object) find_all_clones(program p, @
 *!                                     int(0..1)|void include_subclasses)
 *!
 *!   Return an array with all objects that are clones of @[p].
 *!
 *! @param p
 *!   Program that the objects should be a clone of.
 *!
 *! @param include_subclasses
 *!   If true, include also objects that are clones of programs
 *!   that have inherited @[p]. Note that this adds significant
 *!   overhead.
 *!
 *! This function is only intended to be used for debug purposes.
 *!
 *! @seealso
 *!   @[map_all_objects()]
 */
#define f_find_all_clones_defined
DEFAULT_CMOD_STORAGE void f_find_all_clones(INT32 args) {
#line 76 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * prog;
struct svalue * include_subclasses;
#line 76 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args < 1) wrong_number_of_args_error("find_all_clones",args,1);
#line 76 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args > 2) wrong_number_of_args_error("find_all_clones",args,2);
#line 76 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
prog=Pike_sp+0-args; dmalloc_touch_svalue(Pike_sp+0-args);
if ((args > 1) &&
    ((TYPEOF(Pike_sp[1-args]) != PIKE_T_INT) ||
     (SUBTYPEOF(Pike_sp[1-args]) != NUMBER_UNDEFINED))) {
#line 77 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[1-args]) != PIKE_T_INT) || (Pike_sp[1-args].u.integer & ~0x1) ) SIMPLE_ARG_TYPE_ERROR("find_all_clones",2,"int(1bit)|void");
#line 77 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
include_subclasses=Pike_sp+1-args; dmalloc_touch_svalue(Pike_sp+1-args);
#line 77 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
} else include_subclasses = NULL;
{
  struct object *o = first_object;
  struct program *p = program_from_svalue(prog);

  if (!p) {
    SIMPLE_ARG_TYPE_ERROR("Debug.find_all_clones", 1, "program");
  }

  if (include_subclasses && !include_subclasses->u.integer) {
    include_subclasses = NULL;
  }

  BEGIN_AGGREGATE_ARRAY(10) {

    for (o = first_object; o; o = o->next) {
      if (o->prog == p) {
	ref_push_object(o);
	DO_AGGREGATE_ARRAY(120);
	continue;
      }
      if (include_subclasses && o->prog &&
	  (o->prog->num_inherits > p->num_inherits)) {
	int e;
	/* Check if o->prog has inherited p. */
	if (o->prog->storage_needed < p->storage_needed) continue;
	for (e = o->prog->num_inherits + 1 - p->num_inherits; e-- > 1;) {
	  if (o->prog->inherits[e].prog == p) {
	    /* Found. */
	    ref_push_object(o);
	    DO_AGGREGATE_ARRAY(120);
	    break;
	  }
	}
      }
    }

  } END_AGGREGATE_ARRAY;
}

}
/*! @decl int refs(string|array|mapping|multiset|function|object|program o)
 *!
 *!   Return the number of references @[o] has.
 *!
 *!   It is mainly meant for debugging the Pike runtime, but can also be
 *!   used to control memory usage.
 *!
 *! @note
 *!   Note that the number of references will always be at least one since
 *!   the value is located on the stack when this function is executed.
 *!
 *! @seealso
 *!   @[next()], @[prev()]
 */
#define f_refs_defined
DEFAULT_CMOD_STORAGE void f_refs(INT32 args) {
#line 131 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * o;
#line 131 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("refs",args,1);
#line 131 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
o=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
{
  if(!REFCOUNTED_TYPE(TYPEOF(*o)))
    SIMPLE_ARG_TYPE_ERROR("refs", 1,
                          "array|mapping|multiset|object|"
                          "function|program|string|type");
  do { INT_TYPE ret_=(o->u.refs[0]); pop_stack(); push_int(ret_); return; }while(0);
#line 138 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
}

}
/*! @decl object next_object(object o)
 *! @decl object next_object()
 *!
 *!   Returns the next object from the list of all objects.
 *!
 *!   All objects are stored in a linked list.
 *!
 *! @returns
 *!   If no arguments have been given @[next_object()] will return the first
 *!   object from the list.
 *!
 *!   If @[o] has been specified the object after @[o] on the list will be
 *!   returned.
 *!
 *! @note
 *!   This function is not recomended to use.
 *!
 *! @seealso
 *!   @[destruct()]
 */
#define f_next_object_defined
DEFAULT_CMOD_STORAGE void f_next_object(INT32 args) {
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct object * o;
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
int o_inh_num;
#ifdef PIKE_DEBUG
if(args < 0) Pike_fatal("CMOD function argument negative.\n");
#else
STATIC_ASSUME(args >= 0);
#endif
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args > 1) wrong_number_of_args_error("next_object",args,1);
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if (args > 0 &&
    (TYPEOF(Pike_sp[0-args]) != PIKE_T_INT ||
     Pike_sp[0-args].u.integer)) {
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(TYPEOF(Pike_sp[0-args]) != PIKE_T_OBJECT) SIMPLE_ARG_TYPE_ERROR("next_object",1,"void|object");
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
debug_malloc_pass(o=Pike_sp[0-args].u.object);
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
o_inh_num = SUBTYPEOF(Pike_sp[0-args]);
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
} else o = NULL;
{
  if (!o)
    o = first_object;
  else
    o = Pike_sp[-args].u.object->next;

  while(o && !o->prog) o=o->next;

  pop_n_elems(args);
  if(o)
    ref_push_object(o);
  else
    push_int(0);
}

}
/*! @decl mixed next(mixed x)
 *!
 *!   Find the next object/array/mapping/multiset/program or string.
 *!
 *!   All objects, arrays, mappings, multisets, programs and strings are
 *!   stored in linked lists inside Pike. This function returns the next
 *!   item on the corresponding list. It is mainly meant for debugging
 *!   the Pike runtime, but can also be used to control memory usage.
 *!
 *! @seealso
 *!   @[next_object()], @[prev()]
 */
#define f_next_defined
DEFAULT_CMOD_STORAGE void f_next(INT32 args) {
#line 188 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * x;
#line 188 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("next",args,1);
#line 188 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
x=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
#line 195 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  struct svalue tmp = *x;
  switch(TYPEOF(tmp))
  {
  case T_OBJECT:
    tmp.u.object=tmp.u.object->next;
    while(tmp.u.object && !tmp.u.object->prog)
      tmp.u.object=tmp.u.object->next;
    break;
  case T_ARRAY:   tmp.u.array=tmp.u.array->next; break;
  case T_MAPPING: tmp.u.mapping=tmp.u.mapping->next; break;
  case T_MULTISET:tmp.u.multiset=tmp.u.multiset->next; break;
  case T_PROGRAM: tmp.u.program=tmp.u.program->next; break;
  case T_STRING:  tmp.u.string=next_pike_string(tmp.u.string); break;
  default:
    SIMPLE_ARG_TYPE_ERROR("next", 1,
                          "object|array|mapping|multiset|program|string");
  }

  if(tmp.u.refs)
    assign_svalue(Pike_sp-1, &tmp);
  else
  {
    pop_stack();
    push_int(0);
  }
}

}
/*! @decl mixed prev(mixed x)
 *!
 *!   Find the previous object/array/mapping/multiset or program.
 *!
 *!   All objects, arrays, mappings, multisets and programs are
 *!   stored in linked lists inside Pike. This function returns the previous
 *!   item on the corresponding list. It is mainly meant for debugging
 *!   the Pike runtime, but can also be used to control memory usage.
 *!
 *! @note
 *!   Unlike @[next()] this function does not work on strings.
 *!
 *! @seealso
 *!   @[next_object()], @[next()]
 */
#define f_prev_defined
DEFAULT_CMOD_STORAGE void f_prev(INT32 args) {
#line 238 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * x;
#line 238 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("prev",args,1);
#line 238 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
x=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
#line 244 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  struct svalue tmp = *x;
  switch(TYPEOF(tmp))
  {
  case T_OBJECT:
    tmp.u.object=tmp.u.object->prev;
    while(tmp.u.object && !tmp.u.object->prog)
      tmp.u.object=tmp.u.object->prev;
    break;
  case T_ARRAY:   tmp.u.array=tmp.u.array->prev; break;
  case T_MAPPING: tmp.u.mapping=tmp.u.mapping->prev; break;
  case T_MULTISET:tmp.u.multiset=tmp.u.multiset->prev; break;
  case T_PROGRAM: tmp.u.program=tmp.u.program->prev; break;
  default:
    SIMPLE_ARG_TYPE_ERROR("prev", 1, "object|array|mapping|multiset|program");
  }
  if(tmp.u.refs)
    assign_svalue(Pike_sp-1, &tmp);
  else
  {
    pop_stack();
    push_int(0);
  }
}

}
#line 269 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#ifdef PIKE_DEBUG
/* This function is for debugging *ONLY*
 * do not document please. /Hubbe
 */
#define f_leak_defined
PMOD_EXPORT void f_leak(INT32 args) {
#line 273 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * val;
#line 273 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("leak",args,1);
#line 273 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
val=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
#line 275 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  INT32 i;

  if(!REFCOUNTED_TYPE(TYPEOF(*val)))
    SIMPLE_ARG_TYPE_ERROR("leak", 1,
                          "array|mapping|multiset|object|"
                          "function|program|string|type");

  add_ref(val->u.dummy);
  i = val->u.refs[0];
  do { INT_TYPE ret_=(i); pop_stack(); push_int(ret_); return; }while(0);
#line 286 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
}

}
/*! @decl int(0..) debug(int(0..) level)
 *!
 *!   Set the run-time debug level.
 *!
 *! @returns
 *!   The old debug level will be returned.
 *!
 *! @note
 *!   This function is only available if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_debug_defined
PMOD_EXPORT void f_debug(INT32 args) {
#line 299 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
INT_TYPE d;
#line 299 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("debug",args,1);
#line 299 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[0-1]) != PIKE_T_INT) || (Pike_sp[0-1].u.integer < 0)) SIMPLE_ARG_TYPE_ERROR("debug",1,"int(31bit)");
#line 299 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
d=Pike_sp[0-1].u.integer;
#line 301 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  pop_n_elems(args);
  push_int(d_flag);
  d_flag = d;
}

}
/*! @decl int(0..) optimizer_debug(int(0..) level)
 *!
 *!   Set the optimizer debug level.
 *!
 *! @returns
 *!   The old optimizer debug level will be returned.
 *!
 *! @note
 *!   This function is only available if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_optimizer_debug_defined
PMOD_EXPORT void f_optimizer_debug(INT32 args) {
#line 318 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
INT_TYPE l;
#line 318 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("optimizer_debug",args,1);
#line 318 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[0-1]) != PIKE_T_INT) || (Pike_sp[0-1].u.integer < 0)) SIMPLE_ARG_TYPE_ERROR("optimizer_debug",1,"int(31bit)");
#line 318 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
l=Pike_sp[0-1].u.integer;
#line 320 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  pop_n_elems(args);
  push_int(l_flag);
  l_flag = l;
}

}
/*! @decl int(0..) assembler_debug(int(0..) level)
 *!
 *!   Set the assembler debug level.
 *!
 *! @returns
 *!   The old assembler debug level will be returned.
 *!
 *! @note
 *!   This function is only available if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_assembler_debug_defined
PMOD_EXPORT void f_assembler_debug(INT32 args) {
#line 337 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
INT_TYPE l;
#line 337 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("assembler_debug",args,1);
#line 337 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[0-1]) != PIKE_T_INT) || (Pike_sp[0-1].u.integer < 0)) SIMPLE_ARG_TYPE_ERROR("assembler_debug",1,"int(31bit)");
#line 337 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
l=Pike_sp[0-1].u.integer;
#line 339 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  pop_n_elems(args);
  push_int(a_flag);
  a_flag = l;
}

}
/*! @decl void dump_program_tables(program p, int(0..)|void indent)
 *!
 *! Dumps the internal tables for the program @[p] on stderr.
 *!
 *! @param p
 *!   Program to dump.
 *!
 *! @param indent
 *!   Number of spaces to indent the output.
 */
#define f_dump_program_tables_defined
DEFAULT_CMOD_STORAGE void f_dump_program_tables(INT32 args) {
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct program * p;
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * indent;
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args < 1) wrong_number_of_args_error("dump_program_tables",args,1);
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args > 2) wrong_number_of_args_error("dump_program_tables",args,2);
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(!(p=program_from_svalue(Pike_sp+0-args))) SIMPLE_ARG_TYPE_ERROR("dump_program_tables",1,"program");
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if ((args > 1) &&
    ((TYPEOF(Pike_sp[1-args]) != PIKE_T_INT) ||
     (SUBTYPEOF(Pike_sp[1-args]) != NUMBER_UNDEFINED))) {
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[1-args]) != PIKE_T_INT) || (Pike_sp[1-args].u.integer < 0)) SIMPLE_ARG_TYPE_ERROR("dump_program_tables",2,"int(31bit)|void");
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
indent=Pike_sp+1-args; dmalloc_touch_svalue(Pike_sp+1-args);
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
} else indent = NULL;
{
  dump_program_tables(p, indent?indent->u.integer:0);
}

}
/*! @decl mixed locate_references(string|array|mapping| @
 *!                              multiset|function|object| @
 *!                              program|type o)
 *! @belongs Debug
 *!
 *!   This function is mostly intended for debugging. It will search through
 *!   all data structures in Pike looking for @[o] and print the
 *!   locations on stderr. @[o] can be anything but @expr{int@} or
 *!   @expr{float@}.
 *!
 *! @note
 *!   This function only exists if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_locate_references_defined
DEFAULT_CMOD_STORAGE void f_locate_references(INT32 args) {
#line 374 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * o;
#line 374 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("locate_references",args,1);
#line 374 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
o=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
#line 376 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  locate_references(o);
}

}
/*! @decl mixed describe(mixed x)
 *! @belongs Debug
 *!
 *!   Prints out a description of the thing @[x] to standard error.
 *!   The description contains various internal info associated with
 *!   @[x].
 *!
 *! @note
 *!   This function only exists if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_describe_defined
DEFAULT_CMOD_STORAGE void f_describe(INT32 args) {
#line 391 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * x;
#line 391 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("describe",args,1);
#line 391 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
x=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
#line 393 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  debug_describe_svalue(debug_malloc_pass(&Pike_sp[-1]));
}

}
/*! @decl void gc_set_watch(array|multiset|mapping|object|function|program|string x)
 *! @belongs Debug
 *!
 *!   Sets a watch on the given thing, so that the gc will print a
 *!   message whenever it's encountered. Intended to be used together
 *!   with breakpoints to debug the garbage collector.
 *!
 *! @note
 *!   This function only exists if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_gc_set_watch_defined
DEFAULT_CMOD_STORAGE void f_gc_set_watch(INT32 args) {
#line 408 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * x;
#line 408 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("gc_set_watch",args,1);
#line 408 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
x=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
{
  gc_watch(&Pike_sp[-1]);
}

}
/*! @decl void dump_backlog()
 *! @belongs Debug
 *!
 *!   Dumps the 1024 latest executed opcodes, along with the source
 *!   code lines, to standard error. The backlog is only collected on
 *!   debug level 1 or higher, set with @[_debug] or with the @tt{-d@}
 *!   argument on the command line.
 *!
 *! @note
 *!   This function only exists if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_dump_backlog_defined
DEFAULT_CMOD_STORAGE void f_dump_backlog(INT32 args) {
#line 425 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 0) wrong_number_of_args_error("dump_backlog",args,0);
{
  dump_backlog();
}

}
#line 430 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#ifdef YYDEBUG

/*! @decl int(0..) compiler_trace(int(0..) level)
 *!
 *!   Set the compiler trace level.
 *!
 *! @returns
 *!   The old compiler trace level will be returned.
 *!
 *! @note
 *!   This function is only available if the Pike runtime has been compiled
 *!   with RTL debug.
 */
#define f_compiler_trace_defined
PMOD_EXPORT void f_compiler_trace(INT32 args) {
#line 443 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
INT_TYPE yyd;
#line 443 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("compiler_trace",args,1);
#line 443 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[0-1]) != PIKE_T_INT) || (Pike_sp[0-1].u.integer < 0)) SIMPLE_ARG_TYPE_ERROR("compiler_trace",1,"int(31bit)");
#line 443 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
yyd=Pike_sp[0-1].u.integer;
#line 445 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  extern int yydebug;
  pop_n_elems(args);
  push_int(yydebug);
  yydebug = yyd;
}

}
#line 452 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#endif /* YYDEBUG */

/*! @decl void disassemble(function fun)
 *!
 *!   Disassemble a Pike function to @[Stdio.stderr].
 *!
 *! @note
 *!   This function is only available if the Pike runtime
 *!   has been compiled with debug enabled.
 */
#define f_disassemble_defined
DEFAULT_CMOD_STORAGE void f_disassemble(INT32 args) {
#line 462 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * fun;
#line 462 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("disassemble",args,1);
#line 462 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(TYPEOF(Pike_sp[0-1]) != PIKE_T_FUNCTION) SIMPLE_ARG_TYPE_ERROR("disassemble",1,"function");
#line 462 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
fun=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
{
  if ((TYPEOF(*fun) != T_FUNCTION) ||
      (SUBTYPEOF(*fun) == FUNCTION_BUILTIN)) {
    WERR("Disassembly only supported for functions implemented in Pike.\n");
  } else if (!fun->u.object->prog) {
    WERR("Function in destructed object.\n");
  } else {
    int f = SUBTYPEOF(*fun);
    struct reference *ptr = PTR_FROM_INT(fun->u.object->prog, f);
    struct program *p = PROG_FROM_PTR(fun->u.object->prog, ptr);
    struct identifier *id = p->identifiers + ptr->identifier_offset;
    if (id->func.offset >= 0) {
      struct pike_string *tripples =
	p->strings[read_program_data(p->program + id->func.offset, -1)];
      switch(tripples->size_shift) {
#define CASE(SHIFT)					\
	case SHIFT:					\
	  {						\
	    PIKE_CONCAT(p_wchar, SHIFT) *str =		\
	      PIKE_CONCAT(STR, SHIFT)(tripples);	\
	    int i=0;					\
	    while(i < tripples->len) {			\
              WERR("@@@ %d: %s, %d, %d\n",              \
		      i/3,				\
		      instrs[*str - F_OFFSET].		\
		      name,				\
		      str[1], str[2]);			\
	      str += 3;					\
	      i += 3;					\
	    }						\
	  }						\
	  break
	CASE(0);
	CASE(1);
	CASE(2);
#undef CASE
      }
    } else {
      WERR("Prototype.\n");
    }
  }
}

}
#line 506 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#endif /* PIKE_DEBUG */

#ifdef DEBUG_MALLOC

/*! @decl void reset_dmalloc()
 *!
 *! @note
 *!   Only available when compiled with dmalloc.
 */
#define f_reset_dmalloc_defined
DEFAULT_CMOD_STORAGE void f_reset_dmalloc(INT32 args) {
#line 515 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 0) wrong_number_of_args_error("reset_dmalloc",args,0);
{
  reset_debug_malloc();
}

}
#line 520 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
extern char * dynamic_location(const char *file, INT_TYPE line);
extern char * dmalloc_default_location;

/*! @decl void dmalloc_set_name()
 *!
 *! @note
 *!   Only available when compiled with dmalloc.
 */
#define f_dmalloc_set_name_1_defined
DEFAULT_CMOD_STORAGE void f_dmalloc_set_name_1(INT32 args) {
#line 528 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 0) wrong_number_of_args_error("dmalloc_set_name",args,0);
{
  dmalloc_default_location=0;
}

}
/*! @decl void dmalloc_set_name(string filename, int(1..) linenumber)
 *!
 *! @note
 *!   Only available when compiled with dmalloc.
 */
#define f_dmalloc_set_name_2_defined
DEFAULT_CMOD_STORAGE void f_dmalloc_set_name_2(INT32 args) {
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct pike_string * filename;
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
INT_TYPE linenumber;
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 2) wrong_number_of_args_error("dmalloc_set_name",args,2);
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(TYPEOF(Pike_sp[0-2]) != PIKE_T_STRING) SIMPLE_ARG_TYPE_ERROR("dmalloc_set_name",1,"string");
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
debug_malloc_pass(filename=Pike_sp[0-2].u.string);
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if((TYPEOF(Pike_sp[1-2]) != PIKE_T_INT) || (Pike_sp[1-2].u.integer < 1)) SIMPLE_ARG_TYPE_ERROR("dmalloc_set_name",2,"int(1..)");
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
linenumber=Pike_sp[1-2].u.integer;
{
  dmalloc_default_location = dynamic_location(filename->str, linenumber);
}

}

#if defined(f_dmalloc_set_name_1_defined) || defined(f_dmalloc_set_name_2_defined)
#define f_dmalloc_set_name_defined
DEFAULT_CMOD_STORAGE void f_dmalloc_set_name(INT32 args) {
  switch(args) {
   case 0:

#ifdef f_dmalloc_set_name_1_defined
    f_dmalloc_set_name_1(args);
    return;

#endif /* f_dmalloc_set_name_1_defined */
    break;
   case 2:

#ifdef f_dmalloc_set_name_2_defined
    f_dmalloc_set_name_2(args);
    return;

#endif /* f_dmalloc_set_name_2_defined */
    break;
   default:
    wrong_number_of_args_error("dmalloc_set_name",args,0);
  }
}

#endif /* f_dmalloc_set_name_1_defined, f_dmalloc_set_name_2_defined */
#line 543 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
extern void list_open_fds(void);

/*! @decl void list_open_fds()
 *!
 *! @note
 *!   Only available when compiled with dmalloc.
 */
#define f_list_open_fds_defined
DEFAULT_CMOD_STORAGE void f_list_open_fds(INT32 args) {
#line 550 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 0) wrong_number_of_args_error("list_open_fds",args,0);
{
  list_open_fds();
}

}
/*! @decl void dump_dmalloc_locations(string|array|mapping| @
 *!                                   multiset|function|object| @
 *!                                   program|type o)
 *!
 *! @note
 *!   Only available when compiled with dmalloc.
 */
#define f_dump_dmalloc_locations_defined
DEFAULT_CMOD_STORAGE void f_dump_dmalloc_locations(INT32 args) {
#line 562 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * o;
#line 562 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("dump_dmalloc_locations",args,1);
#line 562 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
o=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
{
  if(!REFCOUNTED_TYPE(TYPEOF(*o)))
    SIMPLE_ARG_TYPE_ERROR("refs", 1,
                          "array|mapping|multiset|object|"
                          "function|program|string|type");
  debug_malloc_dump_references (o->u.refs, 2, 1, 0);
}
}
#line 570 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
#endif /* DEBUG_MALLOC */

/*! @decl mapping(string:int) get_program_layout(program p)
 *! Returns a mapping which describes the layout of compiled machine
 *! code in the program @expr{p@}. The indices of the returned mapping
 *! are function names, the values the starting address of the compiled
 *! function. The total size of the program code is stored with index
 *! @expr{0@}.
 */
#define f_get_program_layout_defined
DEFAULT_CMOD_STORAGE void f_get_program_layout(INT32 args) {
#line 579 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct program * p;
#line 579 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("get_program_layout",args,1);
#line 579 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(!(p=program_from_svalue(Pike_sp+0-1))) SIMPLE_ARG_TYPE_ERROR("get_program_layout",1,"program");
#line 579 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
{
  size_t i;
  struct mapping *m = allocate_mapping(64);

  if(p->flags & PROGRAM_FINISHED) {
    for (i = 0; i < p->num_identifier_references; i++) {
      struct reference *ref = p->identifier_references + i;
      struct identifier *id = ID_FROM_PTR(p, ref);

      if ((id->identifier_flags & IDENTIFIER_TYPE_MASK)
            == IDENTIFIER_PIKE_FUNCTION
          && !ref->inherit_offset) {
        PIKE_OPCODE_T *pc = p->program + id->func.offset;
        struct svalue sv;

        ulongest_to_svalue_no_free(&sv, (UINT64)PTR_TO_INT(pc));

        mapping_string_insert(m, id->name, &sv);
        free_svalue(&sv);
      }
    }

    {
      struct svalue key, value;

      SET_SVAL(key, PIKE_T_INT, NUMBER_NUMBER, integer, 0);
      SET_SVAL(value, PIKE_T_INT, NUMBER_NUMBER, integer,
               p->num_program * sizeof(PIKE_OPCODE_T));
      mapping_insert(m, &key, &value);
    }
  }

  do { struct mapping * ret_=(m); pop_stack(); push_mapping(ret_); return; }while(0);
#line 612 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
}

}
/*! @decl int(0..) map_all_programs(function(program:void) cb)
 *!
 *! Call cb for all programs that currently exist.
 *!
 *! Programs might be missed if @[cb] creates new programs.
 *!
 *! This function is only intended to be used for debug purposes.
 *!
 *! @returns
 *!   The total number of programs
 *!
 *! @seealso
 *!   @[map_all_objects()]
 */
#define f_map_all_programs_defined
DEFAULT_CMOD_STORAGE void f_map_all_programs(INT32 args) {
#line 628 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
struct svalue * cb;
#line 628 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(args != 1) wrong_number_of_args_error("map_all_programs",args,1);
#line 628 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
if(TYPEOF(Pike_sp[0-1]) != PIKE_T_FUNCTION) SIMPLE_ARG_TYPE_ERROR("map_all_programs",1,"function(program:void)");
#line 628 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
cb=Pike_sp+0-1; dmalloc_touch_svalue(Pike_sp+0-1);
{
  struct program *p = first_program;
  INT32 total = 0;


  while( p )
  {
    struct program *next;

    if (p->flags & PROGRAM_FINISHED) {
      add_ref(p);
      ref_push_program( p );
      safe_apply_svalue( Pike_sp-2, 1, 1 );
      pop_stack();
      total++;
      next = p->next;
      sub_ref(p);
    } else next = p->next;
    p = next;
  }
  do { INT_TYPE ret_=(total); pop_stack(); push_int(ret_); return; }while(0);
#line 650 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
}

}
/*! @endmodule
 */

#line 655 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
PIKE_MODULE_INIT
{
  
#ifdef CMOD_MAP_PROGRAM_IDS_DEFINED
set_program_id_to_id( ___cmod_map_program_ids );

#endif /* CMOD_MAP_PROGRAM_IDS_DEFINED */

#ifdef f_map_all_objects_defined

#ifdef f_map_all_objects_fun_num_used
  f_map_all_objects_fun_num =
#endif /* f_map_all_objects_fun_num_used */
#line 38 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("map_all_objects", f_map_all_objects, tFunc(tFunc(tObj,tVoid),"\10\0\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_map_all_objects_defined */

#ifdef f_find_all_clones_defined

#ifdef f_find_all_clones_fun_num_used
  f_find_all_clones_fun_num =
#endif /* f_find_all_clones_fun_num_used */
#line 76 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("find_all_clones", f_find_all_clones, tFunc(tOr(tPrg(tObj),tFuncV(tNone,tMix,tAny)) tOr("\10\0\0\0\0\0\0\0\1",tVoid),tArr(tObj)), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_find_all_clones_defined */

#ifdef f_refs_defined

#ifdef f_refs_fun_num_used
  f_refs_fun_num =
#endif /* f_refs_fun_num_used */
#line 131 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("refs", f_refs, tFunc(tOr7(tStr,tArray,tMapping,tMultiset,tFuncV(tNone,tMix,tAny),tObj,tPrg(tObj)),"\10\200\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_refs_defined */

#ifdef f_next_object_defined

#ifdef f_next_object_fun_num_used
  f_next_object_fun_num =
#endif /* f_next_object_fun_num_used */
#line 160 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("next_object", f_next_object, tFunc(tOr(tVoid,tObj),tObj), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_next_object_defined */

#ifdef f_next_defined

#ifdef f_next_fun_num_used
  f_next_fun_num =
#endif /* f_next_fun_num_used */
#line 188 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("next", f_next, tOr6(tFunc(tStr,tStr),
             tFunc(tObj,tObj),
             tFunc(tMapping,tMapping),
             tFunc(tMultiset,tMultiset),
             tFunc(tPrg(tObj),tPrg(tObj)),
             tFunc(tArray,tArray)), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_next_defined */

#ifdef f_prev_defined

#ifdef f_prev_fun_num_used
  f_prev_fun_num =
#endif /* f_prev_fun_num_used */
#line 238 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("prev", f_prev, tOr5(tFunc(tObj,tObj),
             tFunc(tMapping,tMapping),
             tFunc(tMultiset,tMultiset),
             tFunc(tPrg(tObj),tPrg(tObj)),
             tFunc(tArray,tArray)), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_prev_defined */

#ifdef f_leak_defined

#ifdef f_leak_fun_num_used
  f_leak_fun_num =
#endif /* f_leak_fun_num_used */
#line 273 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("leak", f_leak, tFunc(tOr(tArray,tOr7(tMapping,tMultiset,tObj,tFuncV(tNone,tMix,tAny),tPrg(tObj),tStr,tType(tMix))),"\10\200\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_leak_defined */

#ifdef f_debug_defined

#ifdef f_debug_fun_num_used
  f_debug_fun_num =
#endif /* f_debug_fun_num_used */
#line 299 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("debug", f_debug, tFunc("\10\0\0\0\0\177\377\377\377","\10\0\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_debug_defined */

#ifdef f_optimizer_debug_defined

#ifdef f_optimizer_debug_fun_num_used
  f_optimizer_debug_fun_num =
#endif /* f_optimizer_debug_fun_num_used */
#line 318 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("optimizer_debug", f_optimizer_debug, tFunc("\10\0\0\0\0\177\377\377\377","\10\0\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_optimizer_debug_defined */

#ifdef f_assembler_debug_defined

#ifdef f_assembler_debug_fun_num_used
  f_assembler_debug_fun_num =
#endif /* f_assembler_debug_fun_num_used */
#line 337 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("assembler_debug", f_assembler_debug, tFunc("\10\0\0\0\0\177\377\377\377","\10\0\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_assembler_debug_defined */

#ifdef f_dump_program_tables_defined

#ifdef f_dump_program_tables_fun_num_used
  f_dump_program_tables_fun_num =
#endif /* f_dump_program_tables_fun_num_used */
#line 355 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("dump_program_tables", f_dump_program_tables, tFunc(tPrg(tObj) tOr("\10\0\0\0\0\177\377\377\377",tVoid),tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_dump_program_tables_defined */

#ifdef f_locate_references_defined

#ifdef f_locate_references_fun_num_used
  f_locate_references_fun_num =
#endif /* f_locate_references_fun_num_used */
#line 374 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("locate_references", f_locate_references, tFunc(tSetvar(1,tMix),tVar(1)), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_locate_references_defined */

#ifdef f_describe_defined

#ifdef f_describe_fun_num_used
  f_describe_fun_num =
#endif /* f_describe_fun_num_used */
#line 391 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("describe", f_describe, tFunc(tSetvar(1,tMix),tVar(1)), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_describe_defined */

#ifdef f_gc_set_watch_defined

#ifdef f_gc_set_watch_fun_num_used
  f_gc_set_watch_fun_num =
#endif /* f_gc_set_watch_fun_num_used */
#line 408 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("gc_set_watch", f_gc_set_watch, tFunc(tOr7(tArray,tMultiset,tMapping,tObj,tFuncV(tNone,tMix,tAny),tPrg(tObj),tStr),tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_gc_set_watch_defined */

#ifdef f_dump_backlog_defined

#ifdef f_dump_backlog_fun_num_used
  f_dump_backlog_fun_num =
#endif /* f_dump_backlog_fun_num_used */
#line 425 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("dump_backlog", f_dump_backlog, tFunc(tNone,tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_dump_backlog_defined */

#ifdef f_compiler_trace_defined

#ifdef f_compiler_trace_fun_num_used
  f_compiler_trace_fun_num =
#endif /* f_compiler_trace_fun_num_used */
#line 443 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("compiler_trace", f_compiler_trace, tFunc("\10\0\0\0\0\177\377\377\377","\10\0\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_compiler_trace_defined */

#ifdef f_disassemble_defined

#ifdef f_disassemble_fun_num_used
  f_disassemble_fun_num =
#endif /* f_disassemble_fun_num_used */
#line 462 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("disassemble", f_disassemble, tFunc(tFuncV(tNone,tMix,tAny),tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_disassemble_defined */

#ifdef f_reset_dmalloc_defined

#ifdef f_reset_dmalloc_fun_num_used
  f_reset_dmalloc_fun_num =
#endif /* f_reset_dmalloc_fun_num_used */
#line 515 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("reset_dmalloc", f_reset_dmalloc, tFunc(tNone,tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_reset_dmalloc_defined */

#ifdef f_dmalloc_set_name_defined

#ifdef f_dmalloc_set_name_fun_num_used
  f_dmalloc_set_name_fun_num =
#endif /* f_dmalloc_set_name_fun_num_used */
#line 538 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("dmalloc_set_name", f_dmalloc_set_name, tOr(tFunc(tNone,tVoid),tFunc(tStr "\10\0\0\0\1\177\377\377\377",tVoid)), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_dmalloc_set_name_defined */

#ifdef f_list_open_fds_defined

#ifdef f_list_open_fds_fun_num_used
  f_list_open_fds_fun_num =
#endif /* f_list_open_fds_fun_num_used */
#line 550 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("list_open_fds", f_list_open_fds, tFunc(tNone,tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_list_open_fds_defined */

#ifdef f_dump_dmalloc_locations_defined

#ifdef f_dump_dmalloc_locations_fun_num_used
  f_dump_dmalloc_locations_fun_num =
#endif /* f_dump_dmalloc_locations_fun_num_used */
#line 562 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("dump_dmalloc_locations", f_dump_dmalloc_locations, tFunc(tOr(tStr,tOr7(tArray,tMapping,tMultiset,tFuncV(tNone,tMix,tAny),tObj,tPrg(tObj),tType(tMix))),tVoid), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_dump_dmalloc_locations_defined */

#ifdef f_get_program_layout_defined

#ifdef f_get_program_layout_fun_num_used
  f_get_program_layout_fun_num =
#endif /* f_get_program_layout_fun_num_used */
#line 579 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("get_program_layout", f_get_program_layout, tFunc(tPrg(tObj),tMapping), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_get_program_layout_defined */

#ifdef f_map_all_programs_defined

#ifdef f_map_all_programs_fun_num_used
  f_map_all_programs_fun_num =
#endif /* f_map_all_programs_fun_num_used */
#line 628 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
    ADD_FUNCTION2("map_all_programs", f_map_all_programs, tFunc(tFunc(tPrg(tObj),tVoid),"\10\0\0\0\0\177\377\377\377"), 0, OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT);

#endif /* f_map_all_programs_defined */

#ifdef CMOD_MAP_PROGRAM_IDS_DEFINED
set_program_id_to_id( 0 );
#endif /* CMOD_MAP_PROGRAM_IDS_DEFINED */
#line 657 "/Users/hww3/devel/pike/src/modules/_Debug/debug.cmod"
;
#ifdef PIKE_DEBUG
  ADD_INT_CONSTANT("HAVE_DEBUG", 1, 0);
#endif
}

PIKE_MODULE_EXIT
{
  ;
}


#ifdef CMOD_MAP_PROGRAM_IDS_DEFINED
static int ___cmod_map_program_ids(int id)
{
  if( (id&0x7f000000) != 0x7f000000 ) return id;
  id = id&0x00ffffff;
  return 0;
}
#endif /* CMOD_MAP_PROGRAM_IDS_DEFINED */
