[PATCH] remote_expect: Pass "break" and "continue" exceptions up

"Maciej W. Rozycki" <[email protected]>
Newsgroups gmane.comp.sysutils.dejagnu.bugs
Message-ID <[email protected]>
Hi,

 In the GDB testsuite there are several places where gdb_expect (that 
expands to remote_expect) is called with "break" and "continue" commands 
used within to control the loop the procedure call is within.  The authors 
of these pieces must have been unaware these commands are ineffective, 
because remote_expect has this piece at the end:

	    set code [catch {uplevel $error_sect} string]
[...]
    if {$code == 1} {
	return -code error -errorinfo $errorInfo -errorcode $errorCode $string
    } elseif {$code == 2} {
	return -code return $string
    } elseif {$code == 3} {
	return
    } elseif {$code > 4} {
	return -code $code $string
    }

As you can see error codes #3 and #4 that correspond to the "break" and 
"continue" exceptions respectively are not passed through and are treated 
as if the procedure exited with the "return" command and by reaching its 
end respectively.  The end result is that a piece of code like this:

for {set i 1} {$i <= 10} {incr i} {
    remote_expect {
	"foo" {
	    puts foo
	    break
	}
	"bar" {
	    puts bar
	    continue
	}
    }
    puts "baz"
}

is treated effectively (barring any extra features remote_expect provides) 
like:

for {set i 1} {$i <= 10} {incr i} {
    expect {
	"foo" {
	    puts foo
	}
	"bar" {
	    puts bar
	}
    }
    puts "baz"
}

rather than:

for {set i 1} {$i <= 10} {incr i} {
    expect {
	"foo" {
	    puts foo
	    break
	}
	"bar" {
	    puts bar
	    continue
	}
    }
    puts "baz"
}

as one might (nomen omen) expect.

 Documentation on remote_expect is vague, essentially all it says is: 
"[it] works basically the same as standard expect," which given the above 
is clearly untrue.  Historical records, such as ChangeLog entries did not 
provide any further insight, nor did a search of the Internet.

 My proposal therefore is to simplify the return path from remote_expect 
and except from keeping the current special handling of the error 
exception intact, pass all the other conditions expect might have produced 
up to the caller.  Below is the proposed implementation.  It makes a loop 
like above behave as expected.

 NB gdb_expect (from the GDB testsuite) will require a corresponding 
change as its return path clearly has been copied and pasted from here; 
I'll handle that separately if we agree on the change below.  The two 
changes did not cause any testsuite regressions in a randomly picked up 
GDB configuration.

 Comments?

2010-10-06  Maciej W. Rozycki  <[email protected]>

	* lib/remote.exp (remote_expect): Pass all the exception
	conditions up to the caller.

  Maciej

dejagnu-1.4.99-remote-expect-0.patch
diff --git a/lib/remote.exp b/lib/remote.exp
index abe8b20..8a26518 100644
--- a/lib/remote.exp
+++ b/lib/remote.exp
@@ -1256,11 +1256,7 @@ proc remote_expect { board timeout args } {
 
     if {$code == 1} {
 	return -code error -errorinfo $errorInfo -errorcode $errorCode $string
-    } elseif {$code == 2} {
-	return -code return $string
-    } elseif {$code == 3} {
-	return
-    } elseif {$code > 4} {
+    } else {
 	return -code $code $string
     }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.