don't write invisible choice values
diff mbox

Message ID 4C2B50750200007800008CFC@vpn.id2.novell.com
State Accepted
Headers show

Commit Message

Jan Beulich June 30, 2010, 12:11 p.m. UTC
None

Patch
diff mbox

--- linux-2.6.35-rc3/scripts/kconfig/symbol.c
+++ 2.6.35-rc3-kconfig-invisible-choice-values/scripts/kconfig/symbol.c
@@ -222,13 +222,15 @@  static struct symbol *sym_calc_choice(st
 	struct property *prop;
 	struct expr *e;
 
+	/* first calculate all choice values' visibilities */
+	prop = sym_get_choice_prop(sym);
+	expr_list_for_each_sym(prop->expr, e, def_sym)
+		sym_calc_visibility(def_sym);
+
 	/* is the user choice visible? */
 	def_sym = sym->def[S_DEF_USER].val;
-	if (def_sym) {
-		sym_calc_visibility(def_sym);
-		if (def_sym->visible != no)
-			return def_sym;
-	}
+	if (def_sym && def_sym->visible != no)
+		return def_sym;
 
 	/* any of the defaults visible? */
 	for_all_defaults(sym, prop) {
@@ -236,18 +238,15 @@  static struct symbol *sym_calc_choice(st
 		if (prop->visible.tri == no)
 			continue;
 		def_sym = prop_get_symbol(prop);
-		sym_calc_visibility(def_sym);
 		if (def_sym->visible != no)
 			return def_sym;
 	}
 
 	/* just get the first visible value */
 	prop = sym_get_choice_prop(sym);
-	expr_list_for_each_sym(prop->expr, e, def_sym) {
-		sym_calc_visibility(def_sym);
+	expr_list_for_each_sym(prop->expr, e, def_sym)
 		if (def_sym->visible != no)
 			return def_sym;
-	}
 
 	/* no choice? reset tristate value */
 	sym->curr.tri = no;
@@ -365,12 +364,13 @@  void sym_calc_value(struct symbol *sym)
 
 	if (sym_is_choice(sym)) {
 		struct symbol *choice_sym;
-		int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
 
 		prop = sym_get_choice_prop(sym);
 		expr_list_for_each_sym(prop->expr, e, choice_sym) {
-			choice_sym->flags |= flags;
-			if (flags & SYMBOL_CHANGED)
+			if ((sym->flags & SYMBOL_WRITE) &&
+			    choice_sym->visible != no)
+				choice_sym->flags |= SYMBOL_WRITE;
+			if (sym->flags & SYMBOL_CHANGED)
 				sym_set_changed(choice_sym);
 		}
 	}