aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Jian <jianliang79@gmail.com>2014-05-28 15:46:51 +0800
committerjian liang <jianliang79@gmail.com>2014-06-13 15:50:06 +0200
commit030635a554511669baa09445cc9b11cb18e40539 (patch)
tree8794e4473ec42ae11960db5bededf50d302cdd3b
parent7eb4e701dd361f58edcdf9a74770938d6ffa75b0 (diff)
Fix Stmt:Data object leak
call Stmt::destroyData() whenever a Stmt object is to be removed in BasicBlock to delete the Stmt::Data object hold in the Stmt object. Change-Id: I59c939d79b935153e6f8613e54f149120f5198f5 Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
-rw-r--r--src/qml/compiler/qv4jsir.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp
index 5d30d6e3b9..f81985c07d 100644
--- a/src/qml/compiler/qv4jsir.cpp
+++ b/src/qml/compiler/qv4jsir.cpp
@@ -1049,6 +1049,11 @@ void BasicBlock::setStatements(const QVector<Stmt *> &newStatements)
{
Q_ASSERT(!isRemoved());
Q_ASSERT(newStatements.size() >= _statements.size());
+ // FIXME: this gets quite inefficient for large basic-blocks, so this function/case should be re-worked.
+ foreach (Stmt *s, _statements) {
+ if (!newStatements.contains(s))
+ s->destroyData();
+ }
_statements = newStatements;
}
@@ -1088,18 +1093,21 @@ void BasicBlock::insertStatementBeforeTerminator(Stmt *stmt)
void BasicBlock::replaceStatement(int index, Stmt *newStmt)
{
Q_ASSERT(!isRemoved());
+ _statements[index]->destroyData();
_statements[index] = newStmt;
}
void BasicBlock::removeStatement(Stmt *stmt)
{
Q_ASSERT(!isRemoved());
+ stmt->destroyData();
_statements.remove(_statements.indexOf(stmt));
}
void BasicBlock::removeStatement(int idx)
{
Q_ASSERT(!isRemoved());
+ _statements[idx]->destroyData();
_statements.remove(idx);
}