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:
Cary R 2008-08-08 19:15:05 -07:00 committed by Stephen Williams
parent b1f1c11441
commit 1f8ff7ff8d
2 changed files with 26 additions and 18 deletions

View File

@ -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;
} }

View File

@ -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;