Changeset: d01d05a28dc2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d01d05a28dc2
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
Branch: graph0
Log Message:

Fix SEGV in MAL codegen

At least now we know why in existing code the instr ptr is
reassigned in every API call of the codegen.


diffs (124 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -2824,25 +2824,25 @@ static int
                        // let's start with the first join
                        jr1 = newTmpVariable(mb, TYPE_any);
                        join = newStmt(mb, algebraRef, "subsemijoin");
-                       pushReturn(mb, join, jr1);
-                       pushArgument(mb, join, ref_left);
-                       pushArgument(mb, join, ref_domain);
-                       pushNil(mb, join, TYPE_bat);
-                       pushNil(mb, join, TYPE_bat);
-                       pushBit(mb, join, FALSE);
-                       pushLng(mb, q, getDestVar(cnt1));
+                       join = pushReturn(mb, join, jr1);
+                       join = pushArgument(mb, join, ref_left);
+                       join = pushArgument(mb, join, ref_domain);
+                       join = pushNil(mb, join, TYPE_bat);
+                       join = pushNil(mb, join, TYPE_bat);
+                       join = pushBit(mb, join, FALSE);
+                       join = pushArgument(mb, join, getDestVar(cnt1));
 //                     jl1 = getDestVar(join);
 
                        // second join
                        jr2 = newTmpVariable(mb, TYPE_any);
                        join = newStmt(mb, algebraRef, "subsemijoin");
-                       pushReturn(mb, join, jr2);
-                       pushArgument(mb, join, ref_right);
-                       pushArgument(mb, join, ref_domain);
-                       pushArgument(mb, join, jr1);
-                       pushNil(mb, join, TYPE_bat);
-                       pushBit(mb, join, FALSE);
-                       pushLng(mb, q, getDestVar(cnt1));
+                       join = pushReturn(mb, join, jr2);
+                       join = pushArgument(mb, join, ref_right);
+                       join = pushArgument(mb, join, ref_domain);
+                       join = pushArgument(mb, join, jr1);
+                       join = pushNil(mb, join, TYPE_bat);
+                       join = pushBit(mb, join, FALSE);
+                       join = pushArgument(mb, join, getDestVar(cnt1));
                        jl2 = getDestVar(join);
 
 //                     qtemp = newTmpVariable(mb, TYPE_bat); // qfrom
@@ -2856,8 +2856,8 @@ static int
 
                        // if |jr1| > |jr2|
                        cmp = newStmt(mb, "calc", "==");
-                       pushArgument(mb, cmp, getDestVar(cnt1));
-                       pushArgument(mb, cmp, getDestVar(cnt2));
+                       cmp = pushArgument(mb, cmp, getDestVar(cnt1));
+                       cmp = pushArgument(mb, cmp, getDestVar(cnt2));
                        stmt_if = newAssignment(mb);
                        stmt_if->barrier = BARRIERsymbol;
                        stmt_if = pushArgument(mb, stmt_if, getDestVar(cmp));
@@ -2865,13 +2865,13 @@ static int
                        // third join
                        jr3 = newTmpVariable(mb, TYPE_any);
                        join = newStmt(mb, algebraRef, "subsemijoin");
-                       pushReturn(mb, join, jr3);
-                       pushArgument(mb, join, ref_left);
-                       pushArgument(mb, join, ref_domain);
-                       pushArgument(mb, join, jl2); // candidate list for 
ref_left
-                       pushNil(mb, join, TYPE_bat);
-                       pushBit(mb, join, FALSE);
-                       pushArgument(mb, join, getDestVar(cnt2));
+                       join = pushReturn(mb, join, jr3);
+                       join = pushArgument(mb, join, ref_left);
+                       join = pushArgument(mb, join, ref_domain);
+                       join = pushArgument(mb, join, jl2); // candidate list 
for ref_left
+                       join = pushNil(mb, join, TYPE_bat);
+                       join = pushBit(mb, join, FALSE);
+                       join = pushArgument(mb, join, getDestVar(cnt2));
 //                     jl3 = getDestVar(join);
 
                        qfrom_oid = newAssignment(mb);
@@ -2884,7 +2884,7 @@ static int
 
                        // else |jr1| == |jr2|
                        cmp_not = newStmt(mb, calcRef, notRef);
-                       pushArgument(mb, cmp_not, getDestVar(cmp));
+                       cmp_not = pushArgument(mb, cmp_not, getDestVar(cmp));
                        stmt_else = newAssignment(mb);
                        stmt_else->barrier = BARRIERsymbol;
                        stmt_else = pushArgument(mb, stmt_else, 
getDestVar(cmp_not));
@@ -2952,13 +2952,13 @@ static int
 
                        // spfw(V:bat[:oid], E:bat[:oid], W:bat[:lng], 
qf:bat[:oid], qt:bat[:oid])
                        q = newStmt(mb, graphRef, "spfw");
-                       pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
-                       pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
-                       pushArgument(mb, q, qfrom);
-                       pushArgument(mb, q, qto);
-                       pushNil(mb, q, TYPE_bat);
-                       pushArgument(mb, q, left);
-                       pushArgument(mb, q, right);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
+                       q = pushArgument(mb, q, qfrom);
+                       q = pushArgument(mb, q, qto);
+                       q = pushNil(mb, q, TYPE_bat);
+                       q = pushArgument(mb, q, left);
+                       q = pushArgument(mb, q, right);
 
                        // abi convention for st_result
                        s->nr = getDestVar(q); // qfrom
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1714,6 +1714,7 @@ static void
 stack_push_children(sql_stack *stk, stmt *s)
 {
        switch (s->type) {
+       case st_concat:
        case st_list:
                stack_push_list(stk, s->op4.lval);
                break;
@@ -1786,6 +1787,7 @@ print_stmt(sql_allocator *sa, stmt *s)
        case st_atom:
                printf("z%d := '%s':%s\n", s->nr, atom2string(sa, s->op4.aval), 
s->op4.aval->tpe.type->base.name);
                break;
+       case st_concat:
        case st_list:{
                node *n;
                printf("z%d := %s(", s->nr, st_type2string(s->type));
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to