Fixed bug introduced by fixing a bug.

I forgot that the inner scope isn't necessarily exited when updating
upperWasValid. (Additional iterations overwrote the result before the
upper level could read it.) This is fixed now. Inner level only adds to
the value, upper level resets it to 0 before going down.
This commit is contained in:
Robert Klotzner 2013-01-11 19:10:37 +01:00
parent 35f0ac97fd
commit 62522d1d24

View file

@ -477,7 +477,7 @@ string preSqlParser(ref string data, int level=0) {
immutable wasValid="wasValid"~slevel; immutable wasValid="wasValid"~slevel;
immutable isFirst="isFirst"~to!string(level); // Defined in doVariableProcessing immutable isFirst="isFirst"~to!string(level); // Defined in doVariableProcessing
out_cmd~="int "~validCount~"=-1;\n"; out_cmd~="int "~validCount~"=-1;\n";
out_cmd~="int "~wasValid~";\n"; // Tri state: 0 not valid; -1 valid (was just text); >0 valid (contained valid D expressions) out_cmd~="int "~wasValid~";\n"; // validCount of inner level. (But never -1, if it would be -1 it is 1)
out_cmd~="string "~text~";\n"; out_cmd~="string "~text~";\n";
while(data.length) { while(data.length) {
auto end=data.length; auto end=data.length;
@ -499,7 +499,7 @@ string preSqlParser(ref string data, int level=0) {
data=data[1..$]; data=data[1..$];
out_cmd~="if("~validCount~"==0) {\n"; out_cmd~="if("~validCount~"==0) {\n";
out_cmd~=buf~"="~buf~"[0..$-"~text~".length];\n}\n"; out_cmd~=buf~"="~buf~"[0..$-"~text~".length];\n}\n";
out_cmd~=wasValid~"=0;\n"; // Reset, because inner level will just add to it.
out_cmd~=preSqlParser(data, level+1); out_cmd~=preSqlParser(data, level+1);
assert(data[0]=='}', "Expected closing '}', got: "~data); assert(data[0]=='}', "Expected closing '}', got: "~data);
@ -507,8 +507,9 @@ string preSqlParser(ref string data, int level=0) {
out_cmd~="if("~wasValid~"==0 && "~validCount~">0) {\n"; // validCount has to be greater than 0 otherwise we have removed the data already. (See above) out_cmd~="if("~wasValid~"==0 && "~validCount~">0) {\n"; // validCount has to be greater than 0 otherwise we have removed the data already. (See above)
out_cmd~=buf~"="~buf~"[0..$-"~text~".length];\n}\n"; out_cmd~=buf~"="~buf~"[0..$-"~text~".length];\n}\n";
out_cmd~=wasValid~"="~wasValid~"==-1 ? 1 : "~wasValid~";\n"; out_cmd~=`debug(queryGenerator) writefln("Received data from level: `~to!string(level+1)~` on level: `~slevel~`, data was valid: %s, current valid count: %s", `~wasValid~`, `~validCount~`);`~"\n";
out_cmd~=validCount~"="~validCount~"==-1 ? "~wasValid~" : "~validCount~"+"~wasValid~";\n"; out_cmd~=validCount~"="~validCount~"==-1 ? "~wasValid~" : "~validCount~"+"~wasValid~";\n";
out_cmd~=`debug(queryGenerator) writefln("Updated valid count is now: %s", `~validCount~`);`~"\n";
break; break;
case '}' : case '}' :
goto finish; goto finish;
@ -534,12 +535,11 @@ finish:
out_cmd~=isFirst~"=false;\n"; // No longer the first valid run, so separator should be inserted. out_cmd~=isFirst~"=false;\n"; // No longer the first valid run, so separator should be inserted.
out_cmd~=upperBuf~"~="~buf~";\n}\n"; out_cmd~=upperBuf~"~="~buf~";\n}\n";
if(level>0) { if(level>0) {
out_cmd~=upperWasValid~"="~validCount~";\n"; out_cmd~=upperWasValid~"+="~validCount~"<0 ? 1 : "~validCount~";\n";
} }
// End of loop: // End of loop:
out_cmd~="}\n"; out_cmd~="}\n";
if(level>0) // End of block:
out_cmd~="if("~isFirst~") "~upperWasValid~"=0;\n"; // In case loop wasn't executed a single time. out_cmd~="}\n";
out_cmd~="}\n";
return out_cmd; return out_cmd;
} }