Changeset: 29e16ed5ae4a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=29e16ed5ae4a
Modified Files:
        monetdb5/mal/mal_function.c
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_instruction.h
Branch: default
Log Message:

Enforce an extra check on non-initialized variables


diffs (66 lines):

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
@@ -691,6 +691,8 @@ chkDeclarations(MalBlkPtr mb){
                /* check correct use of the arguments*/
                for(k=p->retc;k<p->argc; k++) {
                        l=getArg(p,k);
+                       if ( l < 0)
+                                       throw(MAL, buf, "Non-declared variable: 
pc=%d, var= %d", pc, k);
                        setVarUsed(mb,l);
                        if( getVarScope(mb,l) == 0){
                                /*
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -762,6 +762,21 @@ makeVarSpace(MalBlkPtr mb)
 }
 
 /* create and initialize a variable record*/
+void
+setVariableType(MalBlkPtr mb, const int n, malType type)
+{
+       assert( n >= 0 && n <mb->vtop);
+       setVarType(mb, n, type);
+       setRowCnt(mb,n,0);
+       clrVarFixed(mb, n);
+       clrVarUsed(mb, n);
+       clrVarInit(mb, n);
+       clrVarDisabled(mb, n);
+       clrVarUDFtype(mb, n);
+       clrVarConstant(mb, n);
+       clrVarCleanup(mb, n);
+}
+
 int
 newVariable(MalBlkPtr mb, const char *name, size_t len, malType type)
 {
@@ -781,16 +796,8 @@ newVariable(MalBlkPtr mb, const char *na
                (void) strcpy_len( getVarName(mb,n), name, len + 1);
        }
 
-       setRowCnt(mb,n,0);
-       setVarType(mb, n, type);
-       clrVarFixed(mb, n);
-       clrVarUsed(mb, n);
-       clrVarInit(mb, n);
-       clrVarDisabled(mb, n);
-       clrVarUDFtype(mb, n);
-       clrVarConstant(mb, n);
-       clrVarCleanup(mb, n);
        mb->vtop++;
+       setVariableType(mb, n, type);
        return n;
 }
 
diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -164,6 +164,7 @@ mal_export int cloneVariable(MalBlkPtr d
 /* generate a new variable name based on a pattern with 1 %d argument
  * -- not used, but this is how to do it */
 /* #define renameVariable(mb, id, pattern, newid) 
snprintf(getVarName(mb,id),IDLENGTH,pattern,newid) */
+mal_export void setVariableType(MalBlkPtr mb, const int idx, malType type);
 mal_export int newTmpVariable(MalBlkPtr mb, malType type);
 mal_export int newTypeVariable(MalBlkPtr mb, malType type);
 mal_export void freeVariable(MalBlkPtr mb, int varid);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to