Rather than calling var_block_close() from common non-terminals, move
the calls into the body of the parent non-terminal. This places them
after the 'struct exec' which represents the scope has been created.
This is needed to attach the variables to the point where their scope is
closed, so they can be freed.
This change helped me focus on some untested - and broken - code.
Signed-off-by: NeilBrown <neil@brown.name>
@mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage || true
@ awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \
END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \
@mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage || true
@ awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \
END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \
- if (ran < (ran + skip) *0.948) exit(1) }' \
+ if (ran < (ran + skip) *0.956) exit(1) }' \
coverage/oceani.mdc.gcov
@rm -f .tmp*
coverage/oceani.mdc.gcov
@rm -f .tmp*
else
pass
print "sum 1..10 is", sum
else
pass
print "sum 1..10 is", sum
+ if
+ PI1 := 22/7
+ use PI1 < pi
+ then
+ print "Smaller"
+ else
+ print 'larger'
###### output: cond_loop
Success
###### output: cond_loop
Success
pi exceeds three
pi sufficient
sum 1..10 is 55
pi exceeds three
pi sufficient
sum 1..10 is 55
$void
OpenScope -> ${ scope_push(c); }$
$void
OpenScope -> ${ scope_push(c); }$
- ClosePara -> ${ var_block_close(c, CloseParallel); }$
Each variable records a scope depth and is in one of four states:
Each variable records a scope depth and is in one of four states:
// may or may not end with EOL
// WhilePart and IfPart include an appropriate Suffix
// may or may not end with EOL
// WhilePart and IfPart include an appropriate Suffix
- // Both ForPart and Whilepart open scopes, and CondSuffix only
- // closes one - so in the first branch here we have another to close.
+ // ForPart, SwitchPart, and IfPart open scopes, o we have to close
+ // them. WhilePart opens and closes its own scope.
CondStatement -> ForPart OptNL ThenPart OptNL WhilePart CondSuffix ${
$0 = $<CS;
$0->forpart = $<FP;
CondStatement -> ForPart OptNL ThenPart OptNL WhilePart CondSuffix ${
$0 = $<CS;
$0->forpart = $<FP;
var_block_close(c, CloseSequential);
}$
var_block_close(c, CloseSequential);
}$
- IfPart -> if UseBlock OptNL then OpenBlock ClosePara ${
+ IfPart -> if UseBlock OptNL then OpenBlock ${
+ $0.thenpart = $<OB;
+ var_block_close(c, CloseParallel);
- | if OpenScope Expression OpenScope ColonBlock ClosePara ${
+ | if OpenScope Expression OpenScope ColonBlock ${
+ $0.thenpart = $<CB;
+ var_block_close(c, CloseParallel);
- | if OpenScope Expression OpenScope OptNL then Block ClosePara ${
+ | if OpenScope Expression OpenScope OptNL then Block ${
$0.condpart = $<Ex;
$0.thenpart = $<Bl;
$0.condpart = $<Ex;
$0.thenpart = $<Bl;
+ var_block_close(c, CloseParallel);
do_indent(indent, "if");
if (cs->condpart && cs->condpart->type == Xbinode &&
cast(binode, cs->condpart)->op == Block) {
do_indent(indent, "if");
if (cs->condpart && cs->condpart->type == Xbinode &&
cast(binode, cs->condpart)->op == Block) {
- if (bracket) // UNTESTED
- printf(" {\n"); // UNTESTED
+ if (bracket)
+ printf(" {\n");
- printf(":\n"); // UNTESTED
- print_exec(cs->condpart, indent+1, bracket); // UNTESTED
- if (bracket) // UNTESTED
- do_indent(indent, "}\n"); // UNTESTED
- if (cs->thenpart) { // UNTESTED
- do_indent(indent, "then:\n"); // UNTESTED
- print_exec(cs->thenpart, indent+1, bracket); // UNTESTED
+ printf("\n");
+ print_exec(cs->condpart, indent+1, bracket);
+ if (bracket)
+ do_indent(indent, "}\n");
+ if (cs->thenpart) {
+ do_indent(indent, "then\n");
+ print_exec(cs->thenpart, indent+1, bracket);