kconfig: cache expression values
Cache expression values to avoid recalculating them repeatedly. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
f93d6bfbd2
commit
95573cac25
@ -396,6 +396,8 @@ load:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expr_invalidate_all();
|
||||||
|
|
||||||
while (getline_stripped(&line, &line_asize, in) != -1) {
|
while (getline_stripped(&line, &line_asize, in) != -1) {
|
||||||
struct menu *choice;
|
struct menu *choice;
|
||||||
|
|
||||||
|
@ -887,7 +887,7 @@ static enum string_value_kind expr_parse_string(const char *str,
|
|||||||
? kind : k_string;
|
? kind : k_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
tristate expr_calc_value(struct expr *e)
|
static tristate __expr_calc_value(struct expr *e)
|
||||||
{
|
{
|
||||||
tristate val1, val2;
|
tristate val1, val2;
|
||||||
const char *str1, *str2;
|
const char *str1, *str2;
|
||||||
@ -895,9 +895,6 @@ tristate expr_calc_value(struct expr *e)
|
|||||||
union string_value lval = {}, rval = {};
|
union string_value lval = {}, rval = {};
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (!e)
|
|
||||||
return yes;
|
|
||||||
|
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
case E_SYMBOL:
|
case E_SYMBOL:
|
||||||
sym_calc_value(e->left.sym);
|
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)
|
static int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
||||||
{
|
{
|
||||||
if (t1 == t2)
|
if (t1 == t2)
|
||||||
|
@ -39,12 +39,16 @@ union expr_data {
|
|||||||
*
|
*
|
||||||
* @node: link node for the hash table
|
* @node: link node for the hash table
|
||||||
* @type: expressoin type
|
* @type: expressoin type
|
||||||
|
* @val: calculated tristate value
|
||||||
|
* @val_is_valid: indicate whether the value is valid
|
||||||
* @left: left node
|
* @left: left node
|
||||||
* @right: right node
|
* @right: right node
|
||||||
*/
|
*/
|
||||||
struct expr {
|
struct expr {
|
||||||
struct hlist_node node;
|
struct hlist_node node;
|
||||||
enum expr_type type;
|
enum expr_type type;
|
||||||
|
tristate val;
|
||||||
|
bool val_is_valid;
|
||||||
union expr_data left, right;
|
union expr_data left, right;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@ extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE);
|
|||||||
|
|
||||||
extern HASHTABLE_DECLARE(expr_hashtable, EXPR_HASHSIZE);
|
extern HASHTABLE_DECLARE(expr_hashtable, EXPR_HASHSIZE);
|
||||||
|
|
||||||
|
void expr_invalidate_all(void);
|
||||||
|
|
||||||
struct menu;
|
struct menu;
|
||||||
|
|
||||||
extern struct menu *current_menu, *current_entry;
|
extern struct menu *current_menu, *current_entry;
|
||||||
|
@ -519,6 +519,7 @@ void sym_clear_all_valid(void)
|
|||||||
|
|
||||||
for_all_symbols(sym)
|
for_all_symbols(sym)
|
||||||
sym->flags &= ~SYMBOL_VALID;
|
sym->flags &= ~SYMBOL_VALID;
|
||||||
|
expr_invalidate_all();
|
||||||
conf_set_changed(true);
|
conf_set_changed(true);
|
||||||
sym_calc_value(modules_sym);
|
sym_calc_value(modules_sym);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user