From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16576 invoked by alias); 24 Feb 2004 23:12:31 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 16522 invoked from network); 24 Feb 2004 23:12:19 -0000 Received: from unknown (HELO localhost.redhat.com) (216.129.200.20) by sources.redhat.com with SMTP; 24 Feb 2004 23:12:19 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id E54A82B92; Tue, 24 Feb 2004 18:12:15 -0500 (EST) Message-ID: <403BDA4F.9000302@gnu.org> Date: Tue, 24 Feb 2004 23:12:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.4.1) Gecko/20040217 MIME-Version: 1.0 To: da_gdb@egenera.com Cc: GDB patches Subject: Re: make execute_control_command conform to docs References: <1077640948.1311.61.camel@hasufel.egenera.com> <403BB5AD.9040502@gnu.org> <1077659195.1310.192.camel@hasufel.egenera.com> In-Reply-To: <1077659195.1310.192.camel@hasufel.egenera.com> Content-Type: multipart/mixed; boundary="------------070609060902050409080102" X-SW-Source: 2004-02/txt/msg00705.txt.bz2 This is a multi-part message in MIME format. --------------070609060902050409080102 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 317 > I was trying to make the patch as small as possible, but I ought to have > done it as you say. Letting everything flow through to the end so that > there is only one return point is definitely the cleanest way to do it. Here, yes, it appears to be the case. Any way, does the attached appear to work? Andrew --------------070609060902050409080102 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 2473 2004-02-24 Andrew Cagney PR cli/1566. Problem found, and fix suggested by David Allan. * cli/cli-script.c (execute_control_command): Unconditionally install a cleanup. Default "ret" to "invalid_control". Use "break" instead of "return" to escape from the switch. Index: cli/cli-script.c =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-script.c,v retrieving revision 1.21 diff -u -r1.21 cli-script.c --- cli/cli-script.c 22 Dec 2003 03:43:19 -0000 1.21 +++ cli/cli-script.c 24 Feb 2004 23:10:13 -0000 @@ -294,21 +294,25 @@ { struct expression *expr; struct command_line *current; - struct cleanup *old_chain = 0; + struct cleanup *old_chain = make_cleanup (null_cleanup, 0); struct value *val; struct value *val_mark; int loop; enum command_control_type ret; char *new_line; + /* Start by assuming failure, if a problem is detected, the code + below will simply "break" out of the switch. */ + ret = invalid_control; + switch (cmd->control_type) { case simple_control: /* A simple command, execute it and return. */ new_line = insert_args (cmd->line); if (!new_line) - return invalid_control; - old_chain = make_cleanup (free_current_contents, &new_line); + break; + make_cleanup (free_current_contents, &new_line); execute_command (new_line, 0); ret = cmd->control_type; break; @@ -325,8 +329,8 @@ /* Parse the loop control expression for the while statement. */ new_line = insert_args (cmd->line); if (!new_line) - return invalid_control; - old_chain = make_cleanup (free_current_contents, &new_line); + break; + make_cleanup (free_current_contents, &new_line); expr = parse_expression (new_line); make_cleanup (free_current_contents, &expr); @@ -385,8 +389,8 @@ { new_line = insert_args (cmd->line); if (!new_line) - return invalid_control; - old_chain = make_cleanup (free_current_contents, &new_line); + break; + make_cleanup (free_current_contents, &new_line); /* Parse the conditional for the if statement. */ expr = parse_expression (new_line); make_cleanup (free_current_contents, &expr); @@ -424,11 +428,10 @@ default: warning ("Invalid control type in command structure."); - return invalid_control; + break; } - if (old_chain) - do_cleanups (old_chain); + do_cleanups (old_chain); return ret; } --------------070609060902050409080102--