/* * Determine the variables being used and clear non-used onces. */ void MSresetVariables(Client cntxt, MalBlkPtr mb, MalStkPtr glb, int start) { int i; bit *used = GDKzalloc(mb->vtop * sizeof(bit)); if( used == NULL){ GDKerror("MSresetVariables" MAL_MALLOC_FAIL); return; } for (i = 0; i < start && start < mb->vtop; i++) used[i] = 1; if (mb->errors == 0) for (i = start; i < mb->vtop; i++) { if (used[i] || !isTmpVar(mb, i)) { assert(!mb->var[i]->value.vtype || isVarConstant(mb, i)); used[i] = 1; } if (glb && !used[i]) { if (isVarConstant(mb, i)) garbageElement(cntxt, &glb->stk[i]); /* clean stack entry */ glb->stk[i].vtype = TYPE_int; glb->stk[i].len = 0; glb->stk[i].val.pval = 0; } } if (mb->errors == 0) trimMalVariables_(mb, used, glb); GDKfree(used); }
str shortStmtRendering(MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { int i; str base, s, t, nme; size_t len= (mb->stop < 1000? 1000: mb->stop) * 128 /* max realistic line length estimate */; base = s = GDKmalloc(len); if ( s == NULL) return s; *s =0; t=s; if (p->token == REMsymbol && !( getModuleId(p) && strcmp(getModuleId(p),"querylog") == 0 && getFunctionId(p) && strcmp(getFunctionId(p),"define") == 0)) return base; if (p->barrier == LEAVEsymbol || p->barrier == REDOsymbol || p->barrier == RETURNsymbol || p->barrier == YIELDsymbol || p->barrier == EXITsymbol || p->barrier == RAISEsymbol) { snprintf(t,(len-(t-base)), "%s ", operatorName(p->barrier)); advance(t,base,len); } if( p->token == FUNCTIONsymbol) { snprintf(t,(len-(t-base)), "function %s.", getModuleId(p)); advance(t,base,len); } if (p->token == ENDsymbol ){ snprintf(t,(len-(t-base)), "end %s.%s", getModuleId(getInstrPtr(mb,0)), getFunctionId(getInstrPtr(mb,0))); return base; } // handle the result variables for (i = 0; i < p->retc; i++) if ( !isTmpVar(mb,getArg(p,i)) || isVarUsed(mb, getArg(p, i)) || isVarUDFtype(mb,getArg(p,i))) break; if (i == p->retc) // no result arguments goto short_end; /* display optional multi-assignment list */ if( getArgType(mb,p,0) != TYPE_void){ if (p->retc > 1 && t < base + len-1){ *t++ = '('; *t=0; } for (i = 0; i < p->retc; i++) { nme = shortRenderingTerm(mb, stk, p,i); snprintf(t,(len-(t-base)), "%s%s", (i?", ":""), nme); GDKfree(nme); advance(t,base,len); } if (p->retc > 1 && t< base+len) *t++ = ')'; if( t < base +len) *t++ = ':'; if( t < base +len) *t++ = '='; if( t < base +len) *t++ = ' '; } *t =0; short_end: advance(t,base,len); // handle the instruction mapping snprintf(t, (len-(t-base)),"%s", (getFunctionId(p)?getFunctionId(p):"")); advance(t,base,len); // handle the arguments, constants should be shown including their non-default type /* display optional multi-assignment list */ if( t< base + len) *t++ = '('; for (i = p->retc; i < p->argc; i++) { nme = shortRenderingTerm(mb, stk, p,i); snprintf(t,(len-(t-base)), "%s%s", (i!= p->retc? ", ":" "), nme); GDKfree(nme); advance(t,base,len); if (i < p->retc - 1 && t < base+len){ *t++ = ','; *t++ = ' '; } } if( t < base + len) *t++ = ' '; if( t < base + len) *t++ = ')'; *t=0; if (t >= s + len) throw(MAL,"instruction2str:","instruction too long"); return base; }
str instruction2str(MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int flg) { int i; str base, t; size_t len = 512 + (p->argc * 128); /* max realistic line length estimate */ str arg; t = base = GDKmalloc(len); if ( base == NULL) return NULL; if (!flg) { *t++ = '#'; len--; if (p->typechk == TYPE_UNKNOWN) { *t++ = '!'; /* error */ len--; } } *t = 0; if (p->token == REMsymbol && !( getModuleId(p) && strcmp(getModuleId(p),"querylog") == 0 && getFunctionId(p) && strcmp(getFunctionId(p),"define") == 0)) { /* do nothing */ } else if (p->barrier) { if (p->barrier == LEAVEsymbol || p->barrier == REDOsymbol || p->barrier == RETURNsymbol || p->barrier == YIELDsymbol || p->barrier == RAISEsymbol) { if (!copystring(&t, " ", &len)) return base; } arg = operatorName(p->barrier); if (!copystring(&t, arg, &len) || !copystring(&t, " ", &len)) return base; } else if( functionStart(p) && flg != LIST_MAL_CALL ){ return fcnDefinition(mb, p, t, flg, base, len + (t - base)); } else if (!functionExit(p) && flg!=LIST_MAL_CALL) { // beautify with tabs if (!copystring(&t, " ", &len)) return base; } switch (p->token<0?-p->token:p->token) { case FCNcall: case FACcall: case PATcall: case CMDcall: case ASSIGNsymbol : // is any variable explicit or used for (i = 0; i < p->retc; i++) if ( !isTmpVar(mb,getArg(p,i)) || isVarUsed(mb, getArg(p, i)) || isVarUDFtype(mb,getArg(p,i))) break; if (i == p->retc) break; /* display multi-assignment list */ if (p->retc > 1 && !copystring(&t, "(", &len)) return base; for (i = 0; i < p->retc; i++) { arg= renderTerm(mb, stk, p, i, flg); if (arg) { if (!copystring(&t, arg, &len)) { GDKfree(arg); return base; } GDKfree(arg); } if (i < p->retc - 1 && !copystring(&t, ", ", &len)) return base; } if (p->retc > 1 && !copystring(&t, ")", &len)) return base; if (p->argc > p->retc || getFunctionId(p)) { if (!copystring(&t, " := ", &len)) return base; } break; case ENDsymbol: if (!copystring(&t, "end ", &len) || !copystring(&t, getModuleId(getInstrPtr(mb,0)), &len) || !copystring(&t, ".", &len) || !copystring(&t, getFunctionId(getInstrPtr(mb, 0)), &len)) return base; break; case COMMANDsymbol: case FUNCTIONsymbol: case FACTORYsymbol: case PATTERNsymbol: if (flg & LIST_MAL_VALUE) { if (!copystring(&t, operatorName(p->token), &len) || !copystring(&t, " ", &len)) return base; } return fcnDefinition(mb, p, t, flg, base, len + (t - base)); case REMsymbol: case NOOPsymbol: if (!copystring(&t, "#", &len)) return base; if (getVar(mb, getArg(p, 0))->value.val.sval && getVar(mb, getArg(p, 0))->value.len > 0 && !copystring(&t, getVar(mb, getArg(p, 0))->value.val.sval, &len)) return base; if (!copystring(&t, " ", &len)) return base; break; default: i = snprintf(t, len, " unknown symbol ?%d? ", p->token); if (i < 0 || (size_t) i >= len) return base; len -= (size_t) i; t += i; break; } if (getModuleId(p)) { if (!copystring(&t, getModuleId(p), &len) || !copystring(&t, ".", &len)) return base; } if (getFunctionId(p)) { if (!copystring(&t, getFunctionId(p), &len) || !copystring(&t, "(", &len)) return base; } else if (p->argc > p->retc + 1) { if (!copystring(&t, "(", &len)) return base; } for (i = p->retc; i < p->argc; i++) { arg= renderTerm(mb, stk, p, i, flg); if (arg) { if (!copystring(&t, arg, &len)) { GDKfree(arg); return base; } GDKfree(arg); } if (i < p->argc -1 && !copystring(&t, ", ", &len)) return base; } if (getFunctionId(p) || p->argc > p->retc + 1) { if (!copystring(&t, ")", &len)) return base; } if (p->token != REMsymbol){ if (!copystring(&t, ";", &len)) return base; } return base; }