From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dan Nicolaescu Newsgroups: gmane.emacs.devel Subject: Re: Problem report #18 PENDING Date: Sat, 13 May 2006 13:21:17 -0700 Message-ID: <200605132021.k4DKLHKL031275@amrm2.ics.uci.edu> References: <200604101859.k3AIx3In005649@scanner2.ics.uci.edu> <443B5378.5070902@swipnet.se> <200605131901.k4DJ1xSb030866@amrm2.ics.uci.edu> <44663A5D.3070700@swipnet.se> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1147551703 22120 80.91.229.2 (13 May 2006 20:21:43 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sat, 13 May 2006 20:21:43 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat May 13 22:21:36 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1Ff0cH-0002oC-PA for ged-emacs-devel@m.gmane.org; Sat, 13 May 2006 22:21:34 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ff0cG-00041S-Th for ged-emacs-devel@m.gmane.org; Sat, 13 May 2006 16:21:32 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Ff0c5-00041D-HY for emacs-devel@gnu.org; Sat, 13 May 2006 16:21:21 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Ff0c3-000411-Uu for emacs-devel@gnu.org; Sat, 13 May 2006 16:21:20 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ff0c3-00040y-PG for emacs-devel@gnu.org; Sat, 13 May 2006 16:21:19 -0400 Original-Received: from [128.195.11.178] (helo=amrm2.ics.uci.edu) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32) (Exim 4.52) id 1Ff0e5-0006Ts-It for emacs-devel@gnu.org; Sat, 13 May 2006 16:23:26 -0400 Original-Received: from amrm2.ics.uci.edu (amrm2.ics.uci.edu [127.0.0.1]) by amrm2.ics.uci.edu (8.13.6/8.13.6) with ESMTP id k4DKLHJg031276; Sat, 13 May 2006 13:21:17 -0700 Original-Received: (from dann@localhost) by amrm2.ics.uci.edu (8.13.6/8.13.6/Submit) id k4DKLHKL031275; Sat, 13 May 2006 13:21:17 -0700 Original-To: "Jan D." In-Reply-To: <44663A5D.3070700@swipnet.se> (Jan D.'s message of "Sat, 13 May 2006 21:58:21 +0200") Original-Lines: 256 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:54398 Archived-At: "Jan D." writes: > Dan Nicolaescu wrote: > > "Jan D." writes: > > > > > The thing is that the code assumes menu descriptions first have panes > > > and then items. In that case save_wv will always be != NULL (the /* > > > Create a new pane. */ branch). I don't know if it is possible to give > > > a description (in lisp) that only contains items. Maybe it is. > > > > Has anybody reached a conclusion about this issue? > > Richard installed a change in this code that fixed crashes people had > seen. I guess it was related to this. Anyway, the code now looks > different so I guess it is solved. The code does an abort now if an > item is not in a pane. Thanks. It seems that the report has changed too. Could you please look it over just to make sure that it's not pointing to a different issue? How about #26 and #27? You said they are the same as #18, are they OK now too? #19 is not reported anymore. 1759 static widget_value * 1760 digest_single_submenu (start, end, top_level_items) 1761 int start, end, top_level_items; 1762 { 1763 widget_value *wv, *prev_wv, *save_wv, *first_wv; 1764 int i; 1765 int submenu_depth = 0; 1766 widget_value **submenu_stack; 1767 int panes_seen = 0; 1768 1769 submenu_stack 1770 = (widget_value **) alloca (menu_items_used * sizeof (widget_value *)); 1771 wv = xmalloc_widget_value (); 1772 wv->name = "menu"; 1773 wv->value = 0; 1774 wv->enabled = 1; 1775 wv->button_type = BUTTON_TYPE_NONE; 1776 wv->help = Qnil; 1777 first_wv = wv; 1778 save_wv = 0; 1779 prev_wv = 0; 1780 1781 /* Loop over all panes and items made by the preceding call 1782 to parse_single_submenu and construct a tree of widget_value objects. 1783 Ignore the panes and items used by previous calls to 1784 digest_single_submenu, even though those are also in menu_items. */ 1785 i = start; At conditional (1): "i < end" taking true path At conditional (3): "i < end" taking true path 1786 while (i < end) 1787 { At conditional (2): "((0), (menu_items & -8))->contents[i] == Qnil" taking true path At conditional (4): "((0), (menu_items & -8))->contents[i] == Qnil" taking false path 1788 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) 1789 { 1790 submenu_stack[submenu_depth++] = save_wv; Event alias_transfer: Variable "save_wv" tracked as NULL because of assignment to "prev_wv" Also see events: [assign_zero][var_deref_op] 1791 save_wv = prev_wv; 1792 prev_wv = 0; 1793 i++; 1794 } At conditional (5): "((0), (menu_items & -8))->contents[i] == Qlambda" taking false path 1795 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) 1796 { 1797 prev_wv = save_wv; 1798 save_wv = submenu_stack[--submenu_depth]; 1799 i++; 1800 } At conditional (6): "((0), (menu_items & -8))->contents[i] == Qt" taking false path 1801 else if (EQ (XVECTOR (menu_items)->contents[i], Qt) 1802 && submenu_depth != 0) 1803 i += MENU_ITEMS_PANE_LENGTH; 1804 /* Ignore a nil in the item list. 1805 It's meaningful only for dialog boxes. */ At conditional (7): "((0), (menu_items & -8))->contents[i] == Qquote" taking false path 1806 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) 1807 i += 1; At conditional (8): "((0), (menu_items & -8))->contents[i] == Qt" taking false path 1808 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) 1809 { 1810 /* Create a new pane. */ 1811 Lisp_Object pane_name, prefix; 1812 char *pane_string; 1813 1814 panes_seen++; 1815 1816 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; 1817 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; 1818 1819 #ifndef HAVE_MULTILINGUAL_MENU 1820 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) 1821 { 1822 pane_name = ENCODE_MENU_STRING (pane_name); 1823 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; 1824 } 1825 #endif 1826 pane_string = (NILP (pane_name) 1827 ? "" : (char *) SDATA (pane_name)); 1828 /* If there is just one top-level pane, put all its items directly 1829 under the top-level menu. */ 1830 if (menu_items_n_panes == 1) 1831 pane_string = ""; 1832 1833 /* If the pane has a meaningful name, 1834 make the pane a top-level menu item 1835 with its items as a submenu beneath it. */ 1836 if (strcmp (pane_string, "")) 1837 { 1838 wv = xmalloc_widget_value (); 1839 if (save_wv) 1840 save_wv->next = wv; 1841 else 1842 first_wv->contents = wv; 1843 wv->lname = pane_name; 1844 /* Set value to 1 so update_submenu_strings can handle '@' */ 1845 wv->value = (char *)1; 1846 wv->enabled = 1; 1847 wv->button_type = BUTTON_TYPE_NONE; 1848 wv->help = Qnil; 1849 save_wv = wv; 1850 } 1851 else 1852 save_wv = first_wv; 1853 Event assign_zero: Variable "prev_wv" assigned value 0. Also see events: [alias_transfer][var_deref_op] 1854 prev_wv = 0; 1855 i += MENU_ITEMS_PANE_LENGTH; 1856 } 1857 else 1858 { 1859 /* Create a new item within current pane. */ 1860 Lisp_Object item_name, enable, descrip, def, type, selected; 1861 Lisp_Object help; 1862 1863 /* All items should be contained in panes. */ At conditional (9): "panes_seen == 0" taking false path 1864 if (panes_seen == 0) 1865 abort (); 1866 1867 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); 1868 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); 1869 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); 1870 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); 1871 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); 1872 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); 1873 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); 1874 1875 #ifndef HAVE_MULTILINGUAL_MENU At conditional (10): "((0), (item_name & -8))->size_byte >= 0" taking true path 1876 if (STRING_MULTIBYTE (item_name)) 1877 { At conditional (11): "Vlocale_coding_system != Qnil" taking true path At conditional (12): "Vlocale_coding_system != 0" taking true path 1878 item_name = ENCODE_MENU_STRING (item_name); 1879 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; 1880 } 1881 At conditional (13): "descrip & 7 == 3" taking true path At conditional (14): "((0), (descrip & -8))->size_byte >= 0" taking true path 1882 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) 1883 { At conditional (15): "Vlocale_coding_system != Qnil" taking true path At conditional (16): "Vlocale_coding_system != 0" taking true path 1884 descrip = ENCODE_MENU_STRING (descrip); 1885 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; 1886 } 1887 #endif /* not HAVE_MULTILINGUAL_MENU */ 1888 1889 wv = xmalloc_widget_value (); At conditional (17): "prev_wv != 0" taking false path 1890 if (prev_wv) 1891 prev_wv->next = wv; 1892 else Event var_deref_op: Variable "save_wv" tracked as NULL was dereferenced. Also see events: [assign_zero][alias_transfer] 1893 save_wv->contents = wv; 1894 1895 wv->lname = item_name; 1896 if (!NILP (descrip)) 1897 wv->lkey = descrip; 1898 wv->value = 0; 1899 /* The EMACS_INT cast avoids a warning. There's no problem 1900 as long as pointers have enough bits to hold small integers. */ 1901 wv->call_data = (!NILP (def) ? (void *) (EMACS_INT) i : 0); 1902 wv->enabled = !NILP (enable); 1903 1904 if (NILP (type)) 1905 wv->button_type = BUTTON_TYPE_NONE; 1906 else if (EQ (type, QCradio)) 1907 wv->button_type = BUTTON_TYPE_RADIO; 1908 else if (EQ (type, QCtoggle)) 1909 wv->button_type = BUTTON_TYPE_TOGGLE; 1910 else 1911 abort (); 1912 1913 wv->selected = !NILP (selected); 1914 if (! STRINGP (help)) 1915 help = Qnil; 1916 1917 wv->help = help; 1918 1919 prev_wv = wv; 1920 1921 i += MENU_ITEMS_ITEM_LENGTH; 1922 } 1923 } 1924 1925 /* If we have just one "menu item" 1926 that was originally a button, return it by itself. */ 1927 if (top_level_items && first_wv->contents && first_wv->contents->next == 0) 1928 { 1929 wv = first_wv->contents; 1930 free_widget_value (first_wv); 1931 return wv; 1932 } 1933 1934 return first_wv; 1935 }