Changeset: 0e3e2350d316 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0e3e2350d316
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        monetdb5/mal/mal.h
        monetdb5/mal/mal_builder.c
        monetdb5/mal/mal_dataflow.c
        monetdb5/mal/mal_function.c
        monetdb5/mal/mal_function.h
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_instruction.h
        monetdb5/mal/mal_listing.c
        monetdb5/mal/mal_parser.c
        monetdb5/mal/mal_session.c
        monetdb5/optimizer/opt_garbageCollector.c
        monetdb5/optimizer/opt_inline.c
        monetdb5/optimizer/opt_jit.c
        monetdb5/optimizer/opt_macro.c
        monetdb5/optimizer/opt_multiplex.c
        monetdb5/optimizer/opt_profiler.c
        monetdb5/optimizer/opt_remap.c
        monetdb5/scheduler/run_adder.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_optimizer.c
Branch: malupgrade
Log Message:

Bulk allocation for variables.
The variable structure is now a single big chunk of ValRecords
Access to components has been further directed using macros


diffs (truncated from 1028 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -7921,7 +7921,6 @@ Ready.
 [ "mdb",       "getStackFrame",        "pattern mdb.getStackFrame() 
(X_0:bat[:str],X_1:bat[:str]) ",   "MDBgetStackFrame;",    "Collect variable 
binding of current (n-th) stack frame."       ]
 [ "mdb",       "getStackFrame",        "pattern mdb.getStackFrame(i:int) 
(X_0:bat[:str],X_1:bat[:str]) ",      "MDBgetStackFrameN;",   ""      ]
 [ "mdb",       "getStackTrace",        "pattern mdb.getStackTrace() 
(X_0:bat[:int],X_1:bat[:str]) ",   "MDBStkTrace;", ""      ]
-[ "mdb",       "grab", "pattern mdb.grab():void ",     "mdbGrab;",     "Call 
debugger for a suspended process."        ]
 [ "mdb",       "inspect",      "pattern mdb.inspect(mod:str,fcn:str):void ",   
"MDBinspect;",  "Run the debugger on a specific function"       ]
 [ "mdb",       "list", "pattern mdb.list(M:str,F:str):void ",  "MDBlist3;",    
"Dump the routine M.F on standard out." ]
 [ "mdb",       "list", "pattern mdb.list():void ",     "MDBlist;",     "Dump 
the current routine on standard out."     ]
@@ -7932,14 +7931,11 @@ Ready.
 [ "mdb",       "setDebug",     "command mdb.setDebug(flg:str):int ",   
"MDBsetDebugStr;",      "Set the kernel debugging bit-set and return its 
previous value.\nThe recognized options are: threads, memory, properties,\nio, 
transactions, modules, algorithms, estimates."  ]
 [ "mdb",       "setTrace",     "pattern mdb.setTrace(b:bit):void ",    
"MDBsetTrace;", "Turn on/off tracing of current routine"        ]
 [ "mdb",       "setTrace",     "pattern mdb.setTrace(b:str):void ",    
"MDBsetVarTrace;",      "Turn on/off tracing of a variable "    ]
-[ "mdb",       "setTrap",      "pattern 
mdb.setTrap(mod:str,fcn:str,b:bit):void ",     "MDBtrapFunction;",     "Suspend 
upon a call to the MAL function."      ]
-[ "mdb",       "setTrap",      "pattern mdb.setTrap(idx:int):void ",   
"mdbTrapClient;",       "Call debugger for a specific process." ]
 [ "mdb",       "start",        "pattern mdb.start():void ",    "MDBstart;",    
"Start interactive debugger"    ]
 [ "mdb",       "start",        "pattern mdb.start(clientid:int):void ",        
"MDBstart;",    "Start interactive debugger on a client"        ]
 [ "mdb",       "start",        "pattern mdb.start(mod:str,fcn:str):void ",     
"MDBstartFactory;",     "Start interactive debugger on a running factory"       
]
 [ "mdb",       "stop", "pattern mdb.stop():void ",     "MDBstop;",     "Stop 
the interactive debugger" ]
 [ "mdb",       "traceOptimizer",       "command 
mdb.traceOptimizer(flg:str):void ",    "OPTsetDebugStr;",      "Otherwise it is 
considered a request to trace the optimizers,\nwhich requires a comma separated 
list or pipeline name."        ]
-[ "mdb",       "trap", "pattern mdb.trap():void ",     "mdbTrap;",     "A 
suspended process for debugging."    ]
 [ "mdb",       "var",  "pattern mdb.var(M:str,F:str):void ",   "MDBvar3;",     
"Dump the symboltable of routine M.F on standard out."  ]
 [ "mdb",       "var",  "pattern mdb.var():void ",      "MDBvar;",      "Dump 
the symboltable of current routine on standard out."      ]
 [ "mkey",      "bulk_rotate_xor_hash", "command 
mkey.bulk_rotate_xor_hash(h:bat[:lng],nbits:int,b:bat[:any_1]):bat[:lng] ",    
"MKEYbulk_rotate_xor_hash;",    "pre:  h and b should be synced on head\n       
  post: [:xor=]([:rotate=](h, nbits), [hash](b))"       ]
@@ -8191,9 +8187,6 @@ Ready.
 [ "optimizer", "reorder",      "pattern optimizer.reorder(mod:str,fcn:str):str 
",      "OPTwrapper;",  "Reorder by dataflow dependencies"      ]
 [ "optimizer", "selcrack",     "pattern optimizer.selcrack():str ",    
"OPTwrapper;",  ""      ]
 [ "optimizer", "selcrack",     "pattern 
optimizer.selcrack(mod:str,fcn:str):str ",     "OPTwrapper;",  "Selection 
cracking"    ]
-[ "optimizer", "showFlowGraph",        "pattern 
optimizer.showFlowGraph(M:str,F:str,s:str):void ",     "QOTshowFlowGraph;",    
"Dump the data flow of the function \n\tM.F in a format recognizable by the 
\n\tcommand 'dot' on the file s"    ]
-[ "optimizer", "showPlan",     "pattern optimizer.showPlan():void ",   
"QOTshowPlan;", "Illustrate the plan derived so far"    ]
-[ "optimizer", "showPlan",     "pattern 
optimizer.showPlan(M:str,F:str,s:str):void ",  "QOTshowPlan;", ""      ]
 [ "optimizer", "sql_append",   "pattern optimizer.sql_append():str ",  
"OPTsql_append;",       "Avoid extra BAT copy with sql.append() whenever 
possible."     ]
 [ "optimizer", "sql_append",   "pattern 
optimizer.sql_append(mod:str,fcn:str):str ",   "OPTsql_append;",       "Avoid 
extra BAT copy with sql.append() whenever possible."     ]
 [ "optimizer", "trace",        "pattern optimizer.trace():str ",       
"OPTwrapper;",  ""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -10282,7 +10282,6 @@ Ready.
 [ "mdb",       "getStackFrame",        "pattern mdb.getStackFrame() 
(X_0:bat[:str],X_1:bat[:str]) ",   "MDBgetStackFrame;",    "Collect variable 
binding of current (n-th) stack frame."       ]
 [ "mdb",       "getStackFrame",        "pattern mdb.getStackFrame(i:int) 
(X_0:bat[:str],X_1:bat[:str]) ",      "MDBgetStackFrameN;",   ""      ]
 [ "mdb",       "getStackTrace",        "pattern mdb.getStackTrace() 
(X_0:bat[:int],X_1:bat[:str]) ",   "MDBStkTrace;", ""      ]
-[ "mdb",       "grab", "pattern mdb.grab():void ",     "mdbGrab;",     "Call 
debugger for a suspended process."        ]
 [ "mdb",       "inspect",      "pattern mdb.inspect(mod:str,fcn:str):void ",   
"MDBinspect;",  "Run the debugger on a specific function"       ]
 [ "mdb",       "list", "pattern mdb.list(M:str,F:str):void ",  "MDBlist3;",    
"Dump the routine M.F on standard out." ]
 [ "mdb",       "list", "pattern mdb.list():void ",     "MDBlist;",     "Dump 
the current routine on standard out."     ]
@@ -10293,14 +10292,11 @@ Ready.
 [ "mdb",       "setDebug",     "command mdb.setDebug(flg:str):int ",   
"MDBsetDebugStr;",      "Set the kernel debugging bit-set and return its 
previous value.\nThe recognized options are: threads, memory, properties,\nio, 
transactions, modules, algorithms, estimates."  ]
 [ "mdb",       "setTrace",     "pattern mdb.setTrace(b:bit):void ",    
"MDBsetTrace;", "Turn on/off tracing of current routine"        ]
 [ "mdb",       "setTrace",     "pattern mdb.setTrace(b:str):void ",    
"MDBsetVarTrace;",      "Turn on/off tracing of a variable "    ]
-[ "mdb",       "setTrap",      "pattern 
mdb.setTrap(mod:str,fcn:str,b:bit):void ",     "MDBtrapFunction;",     "Suspend 
upon a call to the MAL function."      ]
-[ "mdb",       "setTrap",      "pattern mdb.setTrap(idx:int):void ",   
"mdbTrapClient;",       "Call debugger for a specific process." ]
 [ "mdb",       "start",        "pattern mdb.start():void ",    "MDBstart;",    
"Start interactive debugger"    ]
 [ "mdb",       "start",        "pattern mdb.start(clientid:int):void ",        
"MDBstart;",    "Start interactive debugger on a client"        ]
 [ "mdb",       "start",        "pattern mdb.start(mod:str,fcn:str):void ",     
"MDBstartFactory;",     "Start interactive debugger on a running factory"       
]
 [ "mdb",       "stop", "pattern mdb.stop():void ",     "MDBstop;",     "Stop 
the interactive debugger" ]
 [ "mdb",       "traceOptimizer",       "command 
mdb.traceOptimizer(flg:str):void ",    "OPTsetDebugStr;",      "Otherwise it is 
considered a request to trace the optimizers,\nwhich requires a comma separated 
list or pipeline name."        ]
-[ "mdb",       "trap", "pattern mdb.trap():void ",     "mdbTrap;",     "A 
suspended process for debugging."    ]
 [ "mdb",       "var",  "pattern mdb.var(M:str,F:str):void ",   "MDBvar3;",     
"Dump the symboltable of routine M.F on standard out."  ]
 [ "mdb",       "var",  "pattern mdb.var():void ",      "MDBvar;",      "Dump 
the symboltable of current routine on standard out."      ]
 [ "mkey",      "bulk_rotate_xor_hash", "command 
mkey.bulk_rotate_xor_hash(h:bat[:lng],nbits:int,b:bat[:any_1]):bat[:lng] ",    
"MKEYbulk_rotate_xor_hash;",    "pre:  h and b should be synced on head\n       
  post: [:xor=]([:rotate=](h, nbits), [hash](b))"       ]
@@ -10553,9 +10549,6 @@ Ready.
 [ "optimizer", "reorder",      "pattern optimizer.reorder(mod:str,fcn:str):str 
",      "OPTwrapper;",  "Reorder by dataflow dependencies"      ]
 [ "optimizer", "selcrack",     "pattern optimizer.selcrack():str ",    
"OPTwrapper;",  ""      ]
 [ "optimizer", "selcrack",     "pattern 
optimizer.selcrack(mod:str,fcn:str):str ",     "OPTwrapper;",  "Selection 
cracking"    ]
-[ "optimizer", "showFlowGraph",        "pattern 
optimizer.showFlowGraph(M:str,F:str,s:str):void ",     "QOTshowFlowGraph;",    
"Dump the data flow of the function \n\tM.F in a format recognizable by the 
\n\tcommand 'dot' on the file s"    ]
-[ "optimizer", "showPlan",     "pattern optimizer.showPlan():void ",   
"QOTshowPlan;", "Illustrate the plan derived so far"    ]
-[ "optimizer", "showPlan",     "pattern 
optimizer.showPlan(M:str,F:str,s:str):void ",  "QOTshowPlan;", ""      ]
 [ "optimizer", "sql_append",   "pattern optimizer.sql_append():str ",  
"OPTsql_append;",       "Avoid extra BAT copy with sql.append() whenever 
possible."     ]
 [ "optimizer", "sql_append",   "pattern 
optimizer.sql_append(mod:str,fcn:str):str ",   "OPTsql_append;",       "Avoid 
extra BAT copy with sql.append() whenever possible."     ]
 [ "optimizer", "trace",        "pattern optimizer.trace():str ",       
"OPTwrapper;",  ""      ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1373,7 +1373,6 @@ str MDBgetExceptionReason(str *ret, str 
 str MDBgetExceptionVariable(str *ret, str *msg);
 str MDBgetStackFrame(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p);
 str MDBgetStackFrameN(Client cntxt, MalBlkPtr m, MalStkPtr s, InstrPtr p);
-str MDBgrapTrappedProcess(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 str MDBinspect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MDBlist(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MDBlist3(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
@@ -1389,7 +1388,6 @@ str MDBshowFlowGraph(Client cntxt, MalBl
 str MDBstart(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MDBstartFactory(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MDBstop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
-str MDBtrapFunction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str MDBvar(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MDBvar3(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str MKEYbathash(bat *res, const bat *bid);
@@ -1615,8 +1613,6 @@ int QLOGisset(void);
 str QLOGissetFcn(int *ret);
 str QOTgetStatistics(bat *ret, str *nme);
 str QOToptimize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-str QOTshowFlowGraph(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
-str QOTshowPlan(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 void QOTstatisticsExit(void);
 void QOTupdateStatistics(str nme, int prop, lng val);
 QueryQueue QRYqueue;
@@ -1991,7 +1987,6 @@ str convertConstant(malType type, ValPtr
 InstrPtr copyInstruction(InstrPtr p);
 MalBlkPtr copyMalBlk(MalBlkPtr mb);
 str copyRef;
-int copyVariable(MalBlkPtr dst, VarPtr v);
 str copy_fromRef;
 str countRef;
 str count_no_nilRef;
@@ -2132,7 +2127,6 @@ int initQlog(void);
 int initTrace(void);
 int inlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc);
 str inplaceRef;
-void insertInstruction(MalBlkPtr mb, InstrPtr p, int pc);
 void insertSymbol(Module scope, Symbol prg);
 str instruction2str(MalBlkPtr mb, MalStkPtr stl, InstrPtr p, int hidden);
 str instructionCall(MalBlkPtr mb, InstrPtr p, str s, str base, size_t len);
@@ -2283,7 +2277,7 @@ InstrPtr newExitStmt(MalBlkPtr mb, str n
 InstrPtr newFcnCall(MalBlkPtr mb, char *mod, char *fcn);
 Symbol newFunction(str mod, str nme, int kind);
 MalStkPtr newGlobalStack(int size);
-InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme);
+InstrPtr newInstruction(str modnme, str fcnnme);
 MalBlkPtr newMalBlk(int maxvars, int maxstmts);
 int newMalBlkStmt(MalBlkPtr mb, int maxstmts);
 Module newModule(Module scope, str nme);
@@ -2349,7 +2343,7 @@ InstrPtr pushBit(MalBlkPtr mb, InstrPtr 
 InstrPtr pushBte(MalBlkPtr mb, InstrPtr q, bte val);
 InstrPtr pushDbl(MalBlkPtr mb, InstrPtr q, dbl val);
 InstrPtr pushEmptyBAT(MalBlkPtr mb, InstrPtr q, int tpe);
-void pushEndInstruction(MalBlkPtr mb);
+InstrPtr pushEndInstruction(MalBlkPtr mb);
 InstrPtr pushFlt(MalBlkPtr mb, InstrPtr q, flt val);
 InstrPtr pushHge(MalBlkPtr mb, InstrPtr q, hge val);
 void pushInstruction(MalBlkPtr mb, InstrPtr p);
@@ -2422,7 +2416,6 @@ void setPolymorphic(InstrPtr p, int tpe,
 void setReturnArgument(InstrPtr p, int varid);
 str setScenario(Client c, str nme);
 void setVarName(MalBlkPtr mb, int i, str nme);
-void setVarType(MalBlkPtr mb, int i, int tpe);
 str setVariableRef;
 void setVariableScope(MalBlkPtr mb);
 str setWriteModeRef;
diff --git a/monetdb5/mal/mal.h b/monetdb5/mal/mal.h
--- a/monetdb5/mal/mal.h
+++ b/monetdb5/mal/mal.h
@@ -144,14 +144,14 @@ typedef struct SYMDEF {
 typedef struct VARRECORD {
        char id[IDLENGTH];                      /* use the space for the full 
name */
        malType type;                           /* internal type signature */
-       int flags;                                      /* see below, reserve 
some space */
+       short flags;                                    /* see below, reserve 
some space */
+       short depth;                            /* scope block depth, set to -1 
if not used */
+       short worker;                           /* thread id of last worker 
producing it */
        ValRecord value;
        int declared;                           /* pc index when it was first 
assigned */
        int updated;                            /* pc index when it was first 
updated */
        int eolife;                                     /* pc index when it 
should be garbage collected */
-       int depth;                                      /* scope block depth, 
set to -1 if not used */
-       int worker;                                     /* thread id of last 
worker producing it */
-       char stc[2* IDLENGTH];          /* rendering schema.table.column, with 
little more space */
+       char stc[IDLENGTH];                 /* rendering schema.table.column 
(truncated) */
        BUN rowcnt;                                     /* estimated row count*/
 } *VarPtr, VarRecord;
 
@@ -195,7 +195,7 @@ typedef struct MALBLK {
        int vtop;                                       /* next free slot */
        int vsize;                                      /* size of variable 
arena */
        int vid;                                        /* generate local 
variable counter */
-       VarRecord **var;                        /* Variable table */
+       VarRecord *var;                         /* Variable table */
        int stop;                                       /* next free slot */
        int ssize;                                      /* byte size of arena */
        InstrPtr *stmt;                         /* Instruction location */
diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c
--- a/monetdb5/mal/mal_builder.c
+++ b/monetdb5/mal/mal_builder.c
@@ -512,7 +512,7 @@ pushNil(MalBlkPtr mb, InstrPtr q, int tp
                cst.vtype = TYPE_bat;
                cst.val.bval = bat_nil;
                _t = defConstant(mb,TYPE_bat,&cst);
-               mb->var[_t]->type = tpe;
+               getVarType(mb,_t) = tpe;
        }
        q= pushArgument(mb, q, _t);
        setVarUDFtype(mb,getArg(q,q->argc-1)); /* needed */
diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -410,7 +410,7 @@ DFLOWworker(void *T)
                /* update the numa information. keep the thread-id producing 
the value */
                p= getInstrPtr(flow->mb,fe->pc);
                for( i = 0; i < p->argc; i++)
-                       flow->mb->var[getArg(p,i)]->worker = thr->tid;
+                       setVarWorker(flow->mb,getArg(p,i),thr->tid);
 
                MT_lock_set(&flow->flowlock);
                fe->state = DFLOWwrapup;
diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c
--- a/monetdb5/mal/mal_function.c
+++ b/monetdb5/mal/mal_function.c
@@ -570,14 +570,15 @@ setVariableScope(MalBlkPtr mb)
        for (k = 0; k < mb->vtop; k++)
        if( isVarConstant(mb,k)){
                setVarScope(mb,k,0);
-               mb->var[k]->declared = 0;
-               mb->var[k]->updated = 0;
-               mb->var[k]->eolife = mb->stop;
+               setVarDeclared(mb,k,0);
+               setVarUpdated(mb,k,0);
+               setVarEolife(mb,k,mb->stop);
        } else {
                setVarScope(mb,k,0);
-               mb->var[k]->declared = 0;
-               mb->var[k]->updated = 0;
-               mb->var[k]->eolife = 0;
+               mb->var[k].declared = 0;
+               setVarDeclared(mb,k,0);
+               setVarUpdated(mb,k,0);
+               setVarEolife(mb,k,0);
        }
 
        for (pc = 0; pc < mb->stop; pc++) {
@@ -598,20 +599,20 @@ setVariableScope(MalBlkPtr mb)
 
                for (k = 0; k < p->argc; k++) {
                        int v = getArg(p,k);
-                       if( isVarConstant(mb,v) && mb->var[v]->updated == 0)
-                               mb->var[v]->updated= pc;
+                       if( isVarConstant(mb,v) && getVarUpdated(mb,v) == 0)
+                               setVarUpdated(mb,v, pc);
 
-                       if (mb->var[v]->declared == 0 ){
-                               mb->var[v]->declared = pc;
+                       if ( getVarDeclared(mb,v) == 0 ){
+                               setVarDeclared(mb,v, pc);
                                setVarScope(mb,v,depth);
                        }
                        if (k < p->retc )
-                               mb->var[v]->updated= pc;
+                               setVarUpdated(mb,v, pc);
                        if ( getVarScope(mb,v) == depth )
-                               mb->var[v]->eolife = pc;
+                               setVarEolife(mb,v,pc);
 
                        if ( k >= p->retc && getVarScope(mb,v) < depth )
-                               mb->var[v]->eolife = -1;
+                               setVarEolife(mb,v,-1);
                }
                /*
                 * At a block exit we can finalize all variables defined within 
that block.
@@ -620,10 +621,10 @@ setVariableScope(MalBlkPtr mb)
                 */
                if( blockExit(p) ){
                        for (k = 0; k < mb->vtop; k++)
-                       if ( mb->var[k]->eolife == 0 && getVarScope(mb,k) 
==depth )
-                               mb->var[k]->eolife = pc;
-                       else if ( mb->var[k]->eolife == -1 )
-                               mb->var[k]->eolife = pc;
+                       if ( getVarEolife(mb,k) == 0 && getVarScope(mb,k) 
==depth )
+                               setVarEolife(mb,k,pc);
+                       else if ( getVarEolife(mb,k) == -1 )
+                               setVarEolife(mb,k,pc);
                        
                        if( dflow == depth)
                                dflow= -1;
@@ -631,8 +632,8 @@ setVariableScope(MalBlkPtr mb)
                }
        }
        for (k = 0; k < mb->vtop; k++)
-               if( mb->var[k]->eolife == 0)
-                       mb->var[k]->eolife = mb->stop-1;
+               if( getVarEolife(mb,k) == 0)
+                       setVarEolife(mb,k, mb->stop-1);
 }
 
 int
@@ -705,8 +706,8 @@ malGarbageCollector(MalBlkPtr mb)
 
        for (i = 0; i < mb->vtop; i++)
                if( isVarCleanup(mb,i) && getEndScope(mb,i) >= 0) {
-                       mb->var[i]->eolife = getEndScope(mb,i);
-                       mb->stmt[mb->var[i]->eolife]->gc |= GARBAGECONTROL;
+                       setVarEolife(mb,i, getEndScope(mb,i));
+                       mb->stmt[getVarEolife(mb,i)]->gc |= GARBAGECONTROL;
                }
 }
 /*
diff --git a/monetdb5/mal/mal_function.h b/monetdb5/mal/mal_function.h
--- a/monetdb5/mal/mal_function.h
+++ b/monetdb5/mal/mal_function.h
@@ -13,9 +13,9 @@
 #include "mal_module.h"
 #include "mal_resolve.h"
 
-#define getLastUpdate(L,I)     ((L)->var[I]->updated)
-#define getEndScope(L,I)       ((L)->var[I]->eolife)
-#define getBeginScope(L,I)     ((L)->var[I]->declared)
+#define getLastUpdate(L,I)     ((L)->var[I].updated)
+#define getEndScope(L,I)       ((L)->var[I].eolife)
+#define getBeginScope(L,I)     ((L)->var[I].declared)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to