# HG changeset patch # User james # Date 1077158960 0 # Node ID 59bf16be00bfd7484ab715a9794706a46b04af8a # Parent a84a8743f195143a91588b24f14ec2c0f06207e6 [xemacs-hg @ 2004-02-19 02:49:18 by james] Protect against menubar computations within redisplay. diff -r a84a8743f195 -r 59bf16be00bf src/ChangeLog --- a/src/ChangeLog Wed Feb 18 22:50:49 2004 +0000 +++ b/src/ChangeLog Thu Feb 19 02:49:20 2004 +0000 @@ -1,3 +1,11 @@ +2004-02-17 Jerry James + + * menubar-x.c (protected_menu_item_descriptor_to_widget_value_1): + Move begin_gc_forbidden() here so it affects all callers. + * menubar-x.c (menu_item_descriptor_to_widget_value): Call + protected_menu_item_descriptor_to_widget_value_1 with + call_trapping_problems. + 2004-02-16 Jerry James * gui-x.c (wv_set_evalable_slot): Check for eval within redisplay. diff -r a84a8743f195 -r 59bf16be00bf src/menubar-x.c --- a/src/menubar-x.c Wed Feb 18 22:50:49 2004 +0000 +++ b/src/menubar-x.c Thu Feb 19 02:49:20 2004 +0000 @@ -336,23 +336,6 @@ return wv; } -static widget_value * -menu_item_descriptor_to_widget_value (Lisp_Object desc, - int menu_type, /* if this is a menubar, - popup or sub menu */ - int deep_p, /* */ - int filter_p) /* if :filter forms - should run now */ -{ - widget_value *wv; - int count = begin_gc_forbidden (); - /* Can't GC! */ - wv = menu_item_descriptor_to_widget_value_1 (desc, menu_type, deep_p, - filter_p, 0); - unbind_to (count); - return wv; -} - struct menu_item_descriptor_to_widget_value { Lisp_Object desc; @@ -365,11 +348,14 @@ { struct menu_item_descriptor_to_widget_value *midtwv = (struct menu_item_descriptor_to_widget_value *) gack; - - midtwv->wv = menu_item_descriptor_to_widget_value (midtwv->desc, - midtwv->menu_type, - midtwv->deep_p, - midtwv->filter_p); + int count = begin_gc_forbidden (); + /* Can't GC! */ + midtwv->wv = menu_item_descriptor_to_widget_value_1 (midtwv->desc, + midtwv->menu_type, + midtwv->deep_p, + midtwv->filter_p, + 0); + unbind_to (count); return Qnil; } @@ -405,6 +391,36 @@ return midtwv.wv; } +/* The two callers of menu_item_descriptor_to_widget_value may both run while + in redisplay. Some descriptor to widget value conversions call Feval, and + at least one calls QUIT. Hence, we have to establish protection here.. */ + +static widget_value * +menu_item_descriptor_to_widget_value (Lisp_Object desc, + int menu_type, /* if this is a menubar, + popup or sub menu */ + int deep_p, /* */ + int filter_p) /* if :filter forms + should run now */ +{ + struct menu_item_descriptor_to_widget_value midtwv; + Lisp_Object retval; + + midtwv.desc = desc; + midtwv.menu_type = menu_type; + midtwv.deep_p = deep_p; + midtwv.filter_p = filter_p; + + retval = call_trapping_problems + (Qevent, "Error during menu construction", 0, NULL, + protected_menu_item_descriptor_to_widget_value_1, &midtwv); + + if (UNBOUNDP (retval)) + return NULL; + + return midtwv.wv; +} + /* The order in which callbacks are run is funny to say the least. It's sometimes tricky to avoid running a callback twice, and to avoid returning prematurely. So, this function returns true