Switch some Stmt transform/reduce logic to use IntrusivePtr

This commit is contained in:
Jon Siwek 2021-01-13 22:57:48 -08:00
parent b799665c1a
commit 177b723a60
2 changed files with 18 additions and 19 deletions

View file

@ -156,9 +156,8 @@ protected:
explicit Stmt(StmtTag arg_tag); explicit Stmt(StmtTag arg_tag);
// Helper function called after reductions to perform canonical // Helper function called after reductions to perform canonical
// actions. Takes a bare pointer for new_me because usually // actions.
// it's been newly new'd, so this keeps down code clutter. StmtPtr TransformMe(StmtPtr new_me, Reducer* c);
StmtPtr TransformMe(Stmt* new_me, Reducer* c);
void AddTag(ODesc* d) const; void AddTag(ODesc* d) const;
virtual void StmtDescribe(ODesc* d) const; virtual void StmtDescribe(ODesc* d) const;

View file

@ -37,7 +37,7 @@ StmtPtr Stmt::Reduce(Reducer* c)
return DoReduce(c); return DoReduce(c);
} }
StmtPtr Stmt::TransformMe(Stmt* new_me, Reducer* c) StmtPtr Stmt::TransformMe(StmtPtr new_me, Reducer* c)
{ {
ASSERT(new_me != this); ASSERT(new_me != this);
@ -71,7 +71,7 @@ StmtPtr ExprListStmt::DoReduce(Reducer* c)
return ThisPtr(); return ThisPtr();
auto new_l = make_intrusive<ListExpr>(); auto new_l = make_intrusive<ListExpr>();
auto s = new StmtList; auto s = make_intrusive<StmtList>();
ExprPList& e = l->Exprs(); ExprPList& e = l->Exprs();
for ( auto& expr : e ) for ( auto& expr : e )
@ -143,12 +143,12 @@ StmtPtr ExprStmt::DoReduce(Reducer* c)
{ {
if ( ! e ) if ( ! e )
// e can be nil for our derived classes (like ReturnStmt). // e can be nil for our derived classes (like ReturnStmt).
return TransformMe(new NullStmt, c); return TransformMe(make_intrusive<NullStmt>(), c);
auto t = e->Tag(); auto t = e->Tag();
if ( t == EXPR_NOP ) if ( t == EXPR_NOP )
return TransformMe(new NullStmt, c); return TransformMe(make_intrusive<NullStmt>(), c);
if ( c->Optimizing() ) if ( c->Optimizing() )
{ {
@ -158,7 +158,7 @@ StmtPtr ExprStmt::DoReduce(Reducer* c)
if ( e->IsSingleton(c) ) if ( e->IsSingleton(c) )
// No point evaluating. // No point evaluating.
return TransformMe(new NullStmt, c); return TransformMe(make_intrusive<NullStmt>(), c);
if ( (t == EXPR_ASSIGN || t == EXPR_CALL || if ( (t == EXPR_ASSIGN || t == EXPR_CALL ||
t == EXPR_INDEX_ASSIGN || t == EXPR_FIELD_LHS_ASSIGN || t == EXPR_INDEX_ASSIGN || t == EXPR_FIELD_LHS_ASSIGN ||
@ -178,7 +178,7 @@ StmtPtr ExprStmt::DoReduce(Reducer* c)
if ( red_e_stmt ) if ( red_e_stmt )
{ {
auto s = new StmtList(red_e_stmt, ThisPtr()); auto s = make_intrusive<StmtList>(red_e_stmt, ThisPtr());
return TransformMe(s, c); return TransformMe(s, c);
} }
@ -268,7 +268,7 @@ StmtPtr IfStmt::DoReduce(Reducer* c)
s2 = s2->Reduce(c); s2 = s2->Reduce(c);
if ( s1->Tag() == STMT_NULL && s2->Tag() == STMT_NULL ) if ( s1->Tag() == STMT_NULL && s2->Tag() == STMT_NULL )
return TransformMe(new NullStmt, c); return TransformMe(make_intrusive<NullStmt>(), c);
if ( c->Optimizing() ) if ( c->Optimizing() )
e = c->OptExpr(e); e = c->OptExpr(e);
@ -293,13 +293,13 @@ StmtPtr IfStmt::DoReduce(Reducer* c)
return t ? s1 : s2; return t ? s1 : s2;
if ( t ) if ( t )
return TransformMe(new StmtList(red_e_stmt, s1), c); return TransformMe(make_intrusive<StmtList>(red_e_stmt, s1), c);
else else
return TransformMe(new StmtList(red_e_stmt, s2), c); return TransformMe(make_intrusive<StmtList>(red_e_stmt, s2), c);
} }
if ( red_e_stmt ) if ( red_e_stmt )
return TransformMe(new StmtList(red_e_stmt, this), c); return TransformMe(make_intrusive<StmtList>(red_e_stmt, this), c);
return ThisPtr(); return ThisPtr();
} }
@ -415,7 +415,7 @@ StmtPtr SwitchStmt::DoReduce(Reducer* rc)
if ( s->Stmts().length() > 0 ) if ( s->Stmts().length() > 0 )
{ {
StmtPtr me = ThisPtr(); StmtPtr me = ThisPtr();
auto pre_and_me = new StmtList(s, me); auto pre_and_me = make_intrusive<StmtList>(s, me);
return TransformMe(pre_and_me, rc); return TransformMe(pre_and_me, rc);
} }
@ -465,7 +465,7 @@ StmtPtr AddDelStmt::DoReduce(Reducer* c)
if ( red_e_stmt ) if ( red_e_stmt )
{ {
auto s = new StmtList(red_e_stmt, ThisPtr()); auto s = make_intrusive<StmtList>(red_e_stmt, ThisPtr());
return TransformMe(s, c); return TransformMe(s, c);
} }
@ -509,7 +509,7 @@ StmtPtr EventStmt::DoReduce(Reducer* c)
if ( red_e_stmt ) if ( red_e_stmt )
{ {
auto s = new StmtList(red_e_stmt, ThisPtr()); auto s = make_intrusive<StmtList>(red_e_stmt, ThisPtr());
return TransformMe(s, c); return TransformMe(s, c);
} }
} }
@ -642,7 +642,7 @@ StmtPtr ForStmt::DoReduce(Reducer* c)
Error("empty \"for\" body leaves loop variables in indeterminant state"); Error("empty \"for\" body leaves loop variables in indeterminant state");
if ( red_e_stmt ) if ( red_e_stmt )
return TransformMe(new StmtList(red_e_stmt, this), c); return TransformMe(make_intrusive<StmtList>(red_e_stmt, this), c);
return ThisPtr(); return ThisPtr();
} }
@ -676,7 +676,7 @@ StmtPtr ReturnStmt::DoReduce(Reducer* c)
if ( red_e_stmt ) if ( red_e_stmt )
{ {
auto s = new StmtList(red_e_stmt, ThisPtr()); auto s = make_intrusive<StmtList>(red_e_stmt, ThisPtr());
return TransformMe(s, c); return TransformMe(s, c);
} }
} }
@ -770,7 +770,7 @@ StmtPtr StmtList::DoReduce(Reducer* c)
} }
if ( f_stmts->length() == 0 ) if ( f_stmts->length() == 0 )
return TransformMe(new NullStmt, c); return TransformMe(make_intrusive<NullStmt>(), c);
if ( f_stmts->length() == 1 ) if ( f_stmts->length() == 1 )
return (*f_stmts)[0]->Reduce(c); return (*f_stmts)[0]->Reduce(c);