/* * For clarity we show the last optimizer applied * also as the last of the list, although it is linked with mb. */ void showMalBlkHistory(stream *out, MalBlkPtr mb) { MalBlkPtr m=mb; InstrPtr p,sig; int j=0; str msg; sig = getInstrPtr(mb,0); m= m->history; while(m){ p= getInstrPtr(m,m->stop-1); if( p->token == REMsymbol){ msg= instruction2str(m, 0, p, FALSE); if (msg ) { mnstr_printf(out,"%s.%s[%2d] %s\n", getModuleId(sig), getFunctionId(sig),j++,msg+3); GDKfree(msg); } } m= m->history; } p=getInstrPtr(mb,mb->stop-1); if( p->token == REMsymbol){ msg= instruction2str(mb, 0, p, FALSE); if (msg) { mnstr_printf(out,"%s.%s[%2d] %s\n", getModuleId(sig), getFunctionId(sig),j++,msg+3); GDKfree(msg); } } }
/* Remote execution of MAL calls for more type/property information to be exchanged */ str mal2str(MalBlkPtr mb, int first, int last) { str ps = NULL, *txt; int i, *len, totlen = 0, j; txt = GDKmalloc(sizeof(str) * mb->stop); len = GDKmalloc(sizeof(int) * mb->stop); if( txt == NULL || len == NULL){ addMalException(mb,"mal2str: " MAL_MALLOC_FAIL); GDKfree(txt); GDKfree(len); return NULL; } for (i = first; i < last; i++) { if( i == 0) txt[i] = instruction2str(mb, 0, getInstrPtr(mb, i), LIST_MAL_NAME | LIST_MAL_TYPE | LIST_MAL_PROPS); else txt[i] = instruction2str(mb, 0, getInstrPtr(mb, i), LIST_MAL_CALL | LIST_MAL_PROPS | LIST_MAL_REMOTE); #ifdef _DEBUG_LISTING_ fprintf(stderr,"%s\n",txt[i]); #endif if ( txt[i]) totlen += len[i] = (int)strlen(txt[i]); else { addMalException(mb,"mal2str: " MAL_MALLOC_FAIL); GDKfree(len); for (j = first; j < i; j++) GDKfree(txt[j]); GDKfree(txt); return NULL; } } ps = GDKmalloc(totlen + mb->stop + 1); if( ps == NULL){ addMalException(mb,"mal2str: " MAL_MALLOC_FAIL); GDKfree(len); for (i = first; i < last; i++) GDKfree(txt[i]); GDKfree(txt); return NULL; } totlen = 0; for (i = first; i < last; i++) { if( txt[i]){ strncpy(ps + totlen, txt[i], len[i]); ps[totlen + len[i]] = '\n'; ps[totlen + len[i] + 1] = 0; totlen += len[i] + 1; GDKfree(txt[i]); } } GDKfree(len); GDKfree(txt); return ps; }
/* * It may be handy to dump the graph for inspection * or to prepare for the dot program. */ static void QEPdump(stream *f, QEP qep, int indent){ int i,inc = 0; str s; if( qep->p){ for(i=0;i<indent; i++) mnstr_printf(f," "); s= instruction2str(qep->mb, 0,qep->p, LIST_MAL_DEBUG ); mnstr_printf(f,"%s\n",s); GDKfree(s); inc = 4; } for(i=0; i< qep->climit; i++) if( qep->children[i]) QEPdump(f,qep->children[i], indent+ inc); }
void printInstruction(stream *fd, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int flg) { str ps; if (fd == 0) return; ps = instruction2str(mb, stk, p, flg); /* ps[strlen(ps)-1] = 0; remove '\n' */ if ( ps ){ mnstr_printf(fd, "%s%s", (flg & LIST_MAL_MAPI ? "=" : ""), ps); GDKfree(ps); } mnstr_printf(fd, "\n"); }
void fprintInstruction(FILE *fd, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int flg) { str ps; if (fd == 0) return; ps = instruction2str(mb, stk, p, flg); /* ps[strlen(ps)-1] = 0; remove '\n' */ if ( ps ){ fprintf(fd, "%s%s", (flg & LIST_MAL_MAPI ? "=" : ""), ps); GDKfree(ps); } else { fprintf(fd,"#failed instruction2str()"); } fprintf(fd, "\n"); }
/* * It is illustrative to dump the code when you * have encountered an error. */ str MDBgetDefinition(Client cntxt, MalBlkPtr m, MalStkPtr stk, InstrPtr p) { int i; bat *ret = getArgReference_bat(stk, p, 0); str ps; BAT *b = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); (void) cntxt; if (b == 0) throw(MAL, "mdb.getDefinition", MAL_MALLOC_FAIL); BATseqbase(b,0); for (i = 0; i < m->stop; i++) { ps = instruction2str(m,0, getInstrPtr(m, i), 1); BUNappend(b, ps, FALSE); GDKfree(ps); } if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); pseudo(ret,b,"view","fcn","stmt"); return MAL_SUCCEED; }
str MDBStkTrace(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p) { BAT *b, *bn; str msg; char *buf; bat *ret = getArgReference_bat(s, p, 0); bat *ret2 = getArgReference_bat(s, p, 1); int k = 0; size_t len,l; b = BATnew(TYPE_void, TYPE_int, 256, TRANSIENT); if ( b== NULL) throw(MAL, "mdb.getStackTrace", MAL_MALLOC_FAIL); bn = BATnew(TYPE_void, TYPE_str, 256, TRANSIENT); if ( bn== NULL) { BBPreclaim(b); throw(MAL, "mdb.getStackTrace", MAL_MALLOC_FAIL); } BATseqbase(b,0); BATseqbase(bn,0); (void) cntxt; msg = instruction2str(s->blk, s, p, LIST_MAL_DEBUG); len = strlen(msg); buf = (char*) GDKmalloc(len +1024); if ( buf == NULL){ GDKfree(msg); throw(MAL,"mdb.setTrace",MAL_MALLOC_FAIL); } snprintf(buf,len+1024,"%s at %s.%s[%d]", msg, getModuleId(getInstrPtr(m,0)), getFunctionId(getInstrPtr(m,0)), getPC(m, p)); BUNappend(b, &k, FALSE); BUNappend(bn, buf, FALSE); GDKfree(msg); for (s = s->up, k++; s != NULL; s = s->up, k++) { msg = instruction2str(s->blk, s, getInstrPtr(s->blk,s->pcup),LIST_MAL_DEBUG); l = strlen(msg); if (l>len){ GDKfree(buf); len=l; buf = (char*) GDKmalloc(len +1024); if ( buf == NULL){ GDKfree(msg); BBPunfix(b->batCacheid); BBPunfix(bn->batCacheid); throw(MAL,"mdb.setTrace",MAL_MALLOC_FAIL); } } snprintf(buf,len+1024,"%s at %s.%s[%d]", msg, getModuleId(getInstrPtr(s->blk,0)), getFunctionId(getInstrPtr(s->blk,0)), s->pcup); BUNappend(b, &k, FALSE); BUNappend(bn, buf, FALSE); GDKfree(msg); } GDKfree(buf); if (!(b->batDirty&2)) BATsetaccess(b, BAT_READ); if (!(bn->batDirty&2)) BATsetaccess(bn, BAT_READ); pseudo(ret,b,"view","stk","trace"); pseudo(ret2,bn,"view","stk","traceB"); return MAL_SUCCEED; }