Pass a NULL expression when parameter expression elaboration fails
When elaborating a parameter expression fails we need to set the expression to 0 since it has already been partially allocated. Doing this allows us to not evaluate the dummy expression later.
This commit is contained in:
parent
b1f1c11441
commit
1f8ff7ff8d
|
|
@ -53,7 +53,7 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur,
|
||||||
assert(ex);
|
assert(ex);
|
||||||
|
|
||||||
NetExpr*val = ex->elaborate_pexpr(des, scope);
|
NetExpr*val = ex->elaborate_pexpr(des, scope);
|
||||||
if (val == 0) return;
|
|
||||||
NetExpr*msb = 0;
|
NetExpr*msb = 0;
|
||||||
NetExpr*lsb = 0;
|
NetExpr*lsb = 0;
|
||||||
bool signed_flag = cur.signed_flag;
|
bool signed_flag = cur.signed_flag;
|
||||||
|
|
@ -71,19 +71,6 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur,
|
||||||
assert(lsb);
|
assert(lsb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signed_flag) {
|
|
||||||
/* If explicitly signed, then say so. */
|
|
||||||
val->cast_signed(true);
|
|
||||||
} else if (cur.msb) {
|
|
||||||
/* If there is a range, then the signedness comes
|
|
||||||
from the type and not the expression. */
|
|
||||||
val->cast_signed(signed_flag);
|
|
||||||
} else {
|
|
||||||
/* otherwise, let the expression describe
|
|
||||||
itself. */
|
|
||||||
signed_flag = val->has_sign();
|
|
||||||
}
|
|
||||||
|
|
||||||
NetScope::range_t*range_list = 0;
|
NetScope::range_t*range_list = 0;
|
||||||
for (Module::range_t*range = cur.range ; range ; range = range->next) {
|
for (Module::range_t*range = cur.range ; range ; range = range->next) {
|
||||||
NetScope::range_t*tmp = new NetScope::range_t;
|
NetScope::range_t*tmp = new NetScope::range_t;
|
||||||
|
|
@ -118,8 +105,29 @@ void Module::elaborate_parm_item_(perm_string name, const param_expr_t&cur,
|
||||||
range_list = tmp;
|
range_list = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = scope->set_parameter(name, val, cur.type, msb, lsb, signed_flag, range_list, cur);
|
/* Set the parameter expression to 0 if the evaluation failed. */
|
||||||
assert(val);
|
if (val == 0) {
|
||||||
|
val = scope->set_parameter(name, val, cur.type, msb, lsb,
|
||||||
|
signed_flag, range_list, cur);
|
||||||
|
delete val;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signed_flag) {
|
||||||
|
/* If explicitly signed, then say so. */
|
||||||
|
val->cast_signed(true);
|
||||||
|
} else if (cur.msb) {
|
||||||
|
/* If there is a range, then the signedness comes
|
||||||
|
from the type and not the expression. */
|
||||||
|
val->cast_signed(signed_flag);
|
||||||
|
} else {
|
||||||
|
/* otherwise, let the expression describe
|
||||||
|
itself. */
|
||||||
|
signed_flag = val->has_sign();
|
||||||
|
}
|
||||||
|
|
||||||
|
val = scope->set_parameter(name, val, cur.type, msb, lsb, signed_flag,
|
||||||
|
range_list, cur);
|
||||||
delete val;
|
delete val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -357,11 +357,11 @@ void NetScope::evaluate_parameter_logic_(Design*des, param_ref_t cur)
|
||||||
|
|
||||||
/* Evaluate the parameter expression, if necessary. */
|
/* Evaluate the parameter expression, if necessary. */
|
||||||
NetExpr*expr = (*cur).second.expr;
|
NetExpr*expr = (*cur).second.expr;
|
||||||
assert(expr);
|
if (expr == NULL) return; // This is an invalid parameter so return.
|
||||||
|
|
||||||
eval_expr(expr);
|
eval_expr(expr);
|
||||||
|
|
||||||
/* The eval_expr may delete any replace the expr pointer, so the
|
/* The eval_expr may delete and replace the expr pointer, so the
|
||||||
second.expr value cannot be relied on. Might as well replace
|
second.expr value cannot be relied on. Might as well replace
|
||||||
it now with the expression that we evaluated. */
|
it now with the expression that we evaluated. */
|
||||||
(*cur).second.expr = expr;
|
(*cur).second.expr = expr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue