Commit 95573cac authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

kconfig: cache expression values



Cache expression values to avoid recalculating them repeatedly.

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent f93d6bfb
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -396,6 +396,8 @@ int conf_read_simple(const char *name, int def)
		}
	}

	expr_invalidate_all();

	while (getline_stripped(&line, &line_asize, in) != -1) {
		struct menu *choice;

+30 −4
Original line number Diff line number Diff line
@@ -887,7 +887,7 @@ static enum string_value_kind expr_parse_string(const char *str,
	       ? kind : k_string;
}

tristate expr_calc_value(struct expr *e)
static tristate __expr_calc_value(struct expr *e)
{
	tristate val1, val2;
	const char *str1, *str2;
@@ -895,9 +895,6 @@ tristate expr_calc_value(struct expr *e)
	union string_value lval = {}, rval = {};
	int res;

	if (!e)
		return yes;

	switch (e->type) {
	case E_SYMBOL:
		sym_calc_value(e->left.sym);
@@ -961,6 +958,35 @@ tristate expr_calc_value(struct expr *e)
	}
}

/**
 * expr_calc_value - return the tristate value of the given expression
 * @e: expression
 * return: tristate value of the expression
 */
tristate expr_calc_value(struct expr *e)
{
	if (!e)
		return yes;

	if (!e->val_is_valid) {
		e->val = __expr_calc_value(e);
		e->val_is_valid = true;
	}

	return e->val;
}

/**
 * expr_invalidate_all - invalidate all cached expression values
 */
void expr_invalidate_all(void)
{
	struct expr *e;

	hash_for_each(expr_hashtable, e, node)
		e->val_is_valid = false;
}

static int expr_compare_type(enum expr_type t1, enum expr_type t2)
{
	if (t1 == t2)
+4 −0
Original line number Diff line number Diff line
@@ -39,12 +39,16 @@ union expr_data {
 *
 * @node:  link node for the hash table
 * @type:  expressoin type
 * @val: calculated tristate value
 * @val_is_valid: indicate whether the value is valid
 * @left:  left node
 * @right: right node
 */
struct expr {
	struct hlist_node node;
	enum expr_type type;
	tristate val;
	bool val_is_valid;
	union expr_data left, right;
};

+2 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE);

extern HASHTABLE_DECLARE(expr_hashtable, EXPR_HASHSIZE);

void expr_invalidate_all(void);

struct menu;

extern struct menu *current_menu, *current_entry;
+1 −0
Original line number Diff line number Diff line
@@ -519,6 +519,7 @@ void sym_clear_all_valid(void)

	for_all_symbols(sym)
		sym->flags &= ~SYMBOL_VALID;
	expr_invalidate_all();
	conf_set_changed(true);
	sym_calc_value(modules_sym);
}