comparison src/xmenu.c @ 9725:98d374d51f4d

(set_frame_menubar): Don't copy string during GC risk.
author Karl Heuer <kwzh@gnu.org>
date Thu, 27 Oct 1994 18:44:47 +0000
parents 910da93766c8
children 358d48409854
comparison
equal deleted inserted replaced
9724:193eeb5e78aa 9725:98d374d51f4d
1375 int first_time; 1375 int first_time;
1376 { 1376 {
1377 Widget menubar_widget = f->display.x->menubar_widget; 1377 Widget menubar_widget = f->display.x->menubar_widget;
1378 int id = (int) f; 1378 int id = (int) f;
1379 Lisp_Object tail, items; 1379 Lisp_Object tail, items;
1380 widget_value *wv, *save_wv, *first_wv, *prev_wv = 0; 1380 widget_value *wv, *first_wv, *prev_wv = 0;
1381 int i; 1381 int i;
1382 1382
1383 BLOCK_INPUT; 1383 BLOCK_INPUT;
1384 1384
1385 wv = malloc_widget_value (); 1385 wv = malloc_widget_value ();
1386 wv->name = "menubar"; 1386 wv->name = "menubar";
1387 wv->value = 0; 1387 wv->value = 0;
1388 wv->enabled = 1; 1388 wv->enabled = 1;
1389 save_wv = first_wv = wv; 1389 first_wv = wv;
1390 items = FRAME_MENU_BAR_ITEMS (f); 1390 items = FRAME_MENU_BAR_ITEMS (f);
1391 menu_items = f->menu_bar_vector; 1391 menu_items = f->menu_bar_vector;
1392 menu_items_allocated = XVECTOR (menu_items)->size; 1392 menu_items_allocated = XVECTOR (menu_items)->size;
1393 init_menu_items (); 1393 init_menu_items ();
1394 1394
1403 break; 1403 break;
1404 1404
1405 wv = single_submenu (key, string, maps); 1405 wv = single_submenu (key, string, maps);
1406 if (prev_wv) 1406 if (prev_wv)
1407 prev_wv->next = wv; 1407 prev_wv->next = wv;
1408 else 1408 else
1409 save_wv->contents = wv; 1409 first_wv->contents = wv;
1410 wv->name = (char *) XSTRING (string)->data; 1410 /* Don't set wv->name here; GC during the loop might relocate it. */
1411 wv->enabled = 1; 1411 wv->enabled = 1;
1412 prev_wv = wv; 1412 prev_wv = wv;
1413 }
1414
1415 /* Now GC cannot happen during the lifetime of the widget_value,
1416 so it's safe to store data from a Lisp_String. */
1417 wv = first_wv->contents;
1418 for (i = 0; i < XVECTOR (items)->size; i += 3)
1419 {
1420 Lisp_Object string;
1421 string = XVECTOR (items)->contents[i + 1];
1422 if (NILP (string))
1423 break;
1424 wv->name = (char *) XSTRING (string)->data;
1425 wv = wv->next;
1413 } 1426 }
1414 1427
1415 finish_menu_items (); 1428 finish_menu_items ();
1416 1429
1417 f->menu_bar_vector = menu_items; 1430 f->menu_bar_vector = menu_items;