Skip to content

Commit 17ede1a

Browse files
committed
SMV: stack-based expression type checking
To address #17, this replaces the recusion in the SMV expression type checker by exprt::visit_post. Closes #17
1 parent dc998f6 commit 17ede1a

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

src/smvlang/smv_typecheck.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class smv_typecheckt:public typecheckt
8686

8787
void convert(smv_parse_treet::modulet::itemt &);
8888
void typecheck(smv_parse_treet::modulet::itemt &);
89-
void typecheck_expr_rec(exprt &, modet);
89+
void typecheck_expr_node(exprt &, modet);
9090
void convert_expr_to(exprt &, const typet &dest);
9191

9292
smv_parse_treet::modulet *modulep;
@@ -614,7 +614,10 @@ Function: smv_typecheckt::typecheck
614614

615615
void smv_typecheckt::typecheck(exprt &expr, modet mode)
616616
{
617-
typecheck_expr_rec(expr, mode);
617+
// We use visit_post instead of recursion to avoid
618+
// stack overflows on very deep nestings of DEFINE definitions.
619+
expr.visit_post([this, mode](exprt &expr)
620+
{ typecheck_expr_node(expr, mode); });
618621
}
619622

620623
/*******************************************************************\
@@ -629,12 +632,8 @@ Function: smv_typecheckt::typecheck_expr_rec
629632
630633
\*******************************************************************/
631634

632-
void smv_typecheckt::typecheck_expr_rec(exprt &expr, modet mode)
635+
void smv_typecheckt::typecheck_expr_node(exprt &expr, modet mode)
633636
{
634-
// Do the operands
635-
for(auto &op : expr.operands())
636-
typecheck_expr_rec(op, mode);
637-
638637
// now post-traversal
639638

640639
if(expr.id()==ID_symbol ||

0 commit comments

Comments
 (0)