📄 opt_multiplex.c
字号:
#line 87 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"#include "mal_config.h"#include "opt_multiplex.h"#include "mal_interpreter.h"#line 112 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"static strOPTexpandMultiplex(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ int i = 2, k, mloop, resB, iter = 0, cr; int hvar, tvar; str mod, fcn; str msg = MAL_SUCCEED; int alias[MAXARG]; InstrPtr q; int ht, tt; (void) stk; mod = VALget(&getVar(mb, getArg(pci, 1))->value); mod = putName(mod,strlen(mod)); fcn = VALget(&getVar(mb, getArg(pci, 2))->value); fcn = putName(fcn,strlen(fcn)); /* search the iterator bat */ iter = getArg(pci, 3); for (i = 3; i < pci->argc; i++) if (isaBatType(getArgType(mb, pci, i))) { iter = getArg(pci, i); break; }#ifdef DEBUG_OPT_MULTIPLEX printf("calling the optimize multiplex script routine\n"); printFunction(GDKout,mb,LIST_MAL_ALL); printf("multiplex against operator %d %s\n",iter, getTypeName(getVarType(mb,iter))); printInstruction(GDKout,mb,pci,LIST_MAL_ALL);#endif#line 148 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx" /* resB := new(refBat) */ q = newFcnCall(mb, batRef, newRef); resB = getArg(q, 0); if (isAnyExpression(getArgType(mb, pci, 0))) msg = createException(MAL, "optimizer.multiplex", "Target type is missing"); ht = getHeadType(getArgType(mb, pci, 0)); tt = getTailType(getArgType(mb, pci, 0)); setVarType(mb, getArg(q, 0), newBatType(ht, tt)); q = pushNil(mb, q, ht); freezeVarType(mb,getArg(q,q->argc-1)); q = pushNil(mb, q, tt); freezeVarType(mb,getArg(q,q->argc-1)); /* barrier (mloop,h,r) := newIterator(refBat); */ q = newFcnCall(mb, batRef, "newIterator"); q->barrier = BARRIERsymbol; getArg(q, 0) = mloop = newTmpVariable(mb, TYPE_lng); hvar = newTmpVariable(mb, TYPE_any); pushReturn(mb, q, hvar); tvar = newTmpVariable(mb, TYPE_any); pushReturn(mb, q, tvar); pushArgument(mb, q, iter); /* $1:= bat.find(Ai,h) or constant */ alias[i] = tvar; for (i++; i < pci->argc; i++) if (isaBatType(getArgType(mb, pci, i))) { q = newFcnCall(mb, algebraRef, "find"); alias[i] = newTmpVariable(mb, getTailType(getArgType(mb, pci, i))); getArg(q, 0) = alias[i]; pushArgument(mb, q, getArg(pci, i)); pushArgument(mb, q, hvar); } /* cr:= mod.CMD($1,...,$n); */ q = newFcnCall(mb, mod, fcn); cr = getArg(q, 0) = newTmpVariable(mb, TYPE_any); for (i = 3; i < pci->argc; i++) if (isaBatType(getArgType(mb, pci, i))) { pushArgument(mb, q, alias[i]); } else { q = pushArgument(mb, q, getArg(pci, i)); } /* insert(resB,h,cr); not append(resB, cr); the head type (oid) may dynamically change */ q = newFcnCall(mb, batRef, insertRef); pushArgument(mb, q, resB); pushArgument(mb, q, hvar); pushArgument(mb, q, cr);/* redo (mloop,h,r):= hasMoreElements(refBat); */ q = newFcnCall(mb, batRef, "hasMoreElements"); q->barrier = REDOsymbol; getArg(q, 0) = mloop; pushReturn(mb, q, hvar); pushReturn(mb, q, tvar); pushArgument(mb, q, iter);/* catch MALException and ignore them and replace value with nil*/ q = newInstruction(mb,CATCHsymbol); k = newVariable(mb, GDKstrdup(exceptionToString(MAL)), TYPE_str); getVar(mb,k)->isudftype = 1; pushReturn(mb, q, k); pushInstruction(mb, q);/* redo (mloop,h,r):= hasMoreElements(refBat); *//* ignore the error and continue */ q = newFcnCall(mb, batRef, "hasMoreElements"); q->barrier = REDOsymbol; getArg(q, 0) = mloop; pushReturn(mb, q, hvar); pushReturn(mb, q, tvar); pushArgument(mb, q, iter);/* finalized the catch block */ q= newInstruction(mb,EXITsymbol); pushReturn(mb,q,k); pushInstruction(mb,q); q = newAssignment(mb); q->barrier = EXITsymbol; getArg(q, 0) = mloop; pushReturn(mb, q, hvar); pushReturn(mb, q, tvar); q = newAssignment(mb); getArg(q, 0) = getArg(pci, 0); pushArgument(mb, q, resB); return msg;}#line 248 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"strOPTmultiplex(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ InstrPtr *old, p; int i,j, limit,doit= 0, init=0; lng clk=GDKusec(); (void) stk; (void) pci; old = mb->stmt; limit = mb->stop; for (i = 0; i < limit; i++) { p = old[i]; if (getModuleId(p) == optimizerRef && getFunctionId(p) == multiplexRef) { if(init==0){ newMalBlkStmt(mb, mb->stop); for(j= 0; j<i; j++) pushInstruction(mb,old[j]); init++; } OPTexpandMultiplex(mb, stk, p); /* freeInstruction(p);*/ doit++; } else if( init ) pushInstruction(mb, p); } if( init){ GDKfree(old); optimizerCheck(mb, "optimizer.multiplex", doit, GDKusec() - clk,OPT_CHECK_ALL); } return MAL_SUCCEED;}#line 284 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -