This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: RFA: Reliably restore result_ptr in gdbtk_load_asm


Jim,

This is fine, check it in.  Thanks for hunting this one down.

In the long run, we should stop using the wrapper around the WHOLE Tcl 
command, and go to wrapping each call into gdb.  The former is much
too coarse grained, and makes error recovery difficult.

Actually, gdb should provide "longjmp free" wrappers for each call in
the "libgdb" API, maybe using some macro, like Nick suggested is
easiest...

But for now, this is great.

Jim

 > 
 > 2000-04-01  Jim Blandy  <jimb@redhat.com>
 > 
 > 	* gdbtk-hooks.c (gdbtk_restore_result_ptr): New function.
 > 	* gdbtk.h (gdbtk_restore_result_ptr): Declare it.
 > 	* gdbtk-cmds.c (gdbtk_load_asm): Use it to restore the old value
 > 	of result_ptr, in case we get errors while disassembling things.
 > 
 > Index: gdb/gdbtk/generic/gdbtk-cmds.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v
 > retrieving revision 1.5
 > diff -c -r1.5 gdbtk-cmds.c
 > *** gdb/gdbtk/generic/gdbtk-cmds.c	2000/03/28 23:04:02	1.5
 > --- gdb/gdbtk/generic/gdbtk-cmds.c	2000/04/01 23:19:21
 > ***************
 > *** 2751,2756 ****
 > --- 2751,2757 ----
 >   
 >   }
 >   
 > + 
 >   static CORE_ADDR
 >   gdbtk_load_asm (clientData, pc, di)
 >        ClientData clientData;
 > ***************
 > *** 2761,2767 ****
 >       = (struct disassembly_client_data *) clientData;
 >     char **text_argv;
 >     int i, pc_to_line_len, line_to_pc_len;
 > !   gdbtk_result new_result, *old_result_ptr;
 >   
 >     pc_to_line_len = Tcl_DStringLength (&client_data->pc_to_line_prefix);
 >     line_to_pc_len = Tcl_DStringLength (&client_data->line_to_pc_prefix);
 > --- 2762,2769 ----
 >       = (struct disassembly_client_data *) clientData;
 >     char **text_argv;
 >     int i, pc_to_line_len, line_to_pc_len;
 > !   gdbtk_result new_result;
 > !   struct cleanup *old_chain = NULL;
 >   
 >     pc_to_line_len = Tcl_DStringLength (&client_data->pc_to_line_prefix);
 >     line_to_pc_len = Tcl_DStringLength (&client_data->line_to_pc_prefix);
 > ***************
 > *** 2771,2777 ****
 >     /* Preserve the current Tcl result object, print out what we need, and then
 >        suck it out of the result, and replace... */
 >   
 > !   old_result_ptr = result_ptr;
 >     result_ptr = &new_result;
 >     result_ptr->obj_ptr = client_data->result_obj[0];
 >     result_ptr->flags = GDBTK_TO_RESULT;
 > --- 2773,2779 ----
 >     /* Preserve the current Tcl result object, print out what we need, and then
 >        suck it out of the result, and replace... */
 >   
 > !   old_chain = make_cleanup (gdbtk_restore_result_ptr, (void *) result_ptr);
 >     result_ptr = &new_result;
 >     result_ptr->obj_ptr = client_data->result_obj[0];
 >     result_ptr->flags = GDBTK_TO_RESULT;
 > ***************
 > *** 2833,2839 ****
 >         
 >       }
 >     
 > !   result_ptr = old_result_ptr;
 >       
 >     return pc;
 >   }
 > --- 2835,2841 ----
 >         
 >       }
 >     
 > !   do_cleanups (old_chain);
 >       
 >     return pc;
 >   }
 > Index: gdb/gdbtk/generic/gdbtk-hooks.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-hooks.c,v
 > retrieving revision 1.2
 > diff -c -r1.2 gdbtk-hooks.c
 > *** gdb/gdbtk/generic/gdbtk-hooks.c	2000/02/24 03:11:47	1.2
 > --- gdb/gdbtk/generic/gdbtk-hooks.c	2000/04/01 23:19:21
 > ***************
 > *** 183,188 ****
 > --- 183,198 ----
 >    */
 >   
 >   gdbtk_result *result_ptr = NULL;
 > + 
 > + /* If you want to restore an old value of result_ptr whenever cleanups
 > +    are run, pass this function to make_cleanup, along with the value
 > +    of result_ptr you'd like to reinstate.  */
 > + void
 > + gdbtk_restore_result_ptr (void *old_result_ptr)
 > + {
 > +   result_ptr = (gdbtk_result *) old_result_ptr;
 > + }
 > + 
 >   
 >   
 >   /* This allows you to Tcl_Eval a tcl command which takes
 > Index: gdb/gdbtk/generic/gdbtk.h
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk.h,v
 > retrieving revision 1.1.1.1
 > diff -c -r1.1.1.1 gdbtk.h
 > *** gdb/gdbtk/generic/gdbtk.h	2000/02/07 00:19:42	1.1.1.1
 > --- gdb/gdbtk/generic/gdbtk.h	2000/04/01 23:19:21
 > ***************
 > *** 133,138 ****
 > --- 133,143 ----
 >   
 >   extern gdbtk_result *result_ptr;
 >   
 > + /* If you want to restore an old value of result_ptr whenever cleanups
 > +    are run, pass this function to make_cleanup, along with the value
 > +    of result_ptr you'd like to reinstate.  */
 > + extern void gdbtk_restore_result_ptr (void *);
 > + 
 >   /* GDB context identifier */
 >   extern int gdb_context;
 >   
 > 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]