pike.git / src / builtin.cmod

version» Context lines:

pike.git/src/builtin.cmod:23:   #include "cyclic.h"   #include "bignum.h"   #include "main.h"   #include "operators.h"   #include "builtin_functions.h"   #include "fsort.h"   #include "port.h"   #include "gc.h"   #include "block_alloc.h"   #include "pikecode.h" + #include "opcodes.h"      #include <ctype.h>   #include <errno.h>   #include <math.h>      DECLARATIONS      /*! @decl array(array(int|string|type)) describe_program(program p)    *! @belongs Debug    *!
pike.git/src/builtin.cmod:1680:    * assume no other entities are naughty enough to modify it). */    mapping_string_insert_string (env_allocs, env_alloc_var, putenv_str);    else {    struct svalue key;    SET_SVAL(key, T_STRING, 0, string, env_alloc_var);    map_delete (env_allocs, &key);    }   #endif /* !USE_SETENV */   }    + #if defined(PIKE_DEBUG) && defined(PIKE_PORTABLE_BYTECODE) +  + /*! @decl void disassemble(function fun) +  *! @belongs Debug +  *! +  *! Disassemble a Pike function to @[Stdio.stderr]. +  *! +  *! @note +  *! This function is only available if the Pike runtime +  *! has been compiled with debug enabled. +  */ + PIKEFUN void _disassemble(function fun) + { +  if ((TYPEOF(*fun) != T_FUNCTION) || +  (SUBTYPEOF(*fun) == FUNCTION_BUILTIN)) { +  fprintf(stderr, +  "Disassembly only supported for functions implemented in Pike.\n"); +  } else if (!fun->u.object->prog) { +  fprintf(stderr, "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) { \ +  fprintf(stderr, "@@@ %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 { +  fprintf(stderr, "Prototype.\n"); +  } +  } +  pop_n_elems(args); +  push_int(0); + } +  + #endif /* PIKE_DEBUG && PIKE_PORTABLE_BYTECODE */ +    /*    * Backtrace handling.    */      /*! @module Pike    */      /*! @class BacktraceFrame    */