/*---------------------------------------------------------------------*/ void * bgl_debug_trace_top() { obj_t env = BGL_CURRENT_DYNAMIC_ENV(); #if !BMEMDEBUG if( !env ) { goto unknown; } else { struct bgl_dframe *top = BGL_ENV_GET_TOP_OF_FRAME( env ); if( !top ) goto unknown; if( !SYMBOLP( top->name ) ) goto unknown; return top->name; } unknown: { /* if we see no trace in a stack (or no stack at all) we */ /* check we are running a asynchronous fair-thread. */ void *th = bmem_thread ? ____bglthread_id_get() : 0; if( SYMBOLP( th ) ) return th; else return BUNSPEC; } }
/*---------------------------------------------------------------------*/ BGL_RUNTIME_DEF obj_t get_trace_stack( int depth ) { long level = 0L; struct bgl_dframe *runner = BGL_ENV_GET_TOP_OF_FRAME( BGL_CURRENT_DYNAMIC_ENV() ); obj_t l = MAKE_PAIR( BNIL, BNIL ); obj_t r = l; while( ((depth < 0) || (level < depth)) && runner ) { if( SYMBOLP( runner->name ) ) { obj_t p = MAKE_PAIR( runner->name, MAKE_PAIR( runner->location, BNIL ) ); SET_CDR( r, MAKE_PAIR( p, BNIL ) ); r = CDR( r ); level++; } runner = runner->link; } return CDR( l ); }
/*---------------------------------------------------------------------*/ void * bgl_debug_trace() { return BGL_ENV_GET_TOP_OF_FRAME( BGL_CURRENT_DYNAMIC_ENV() ); }