diff options
author | Liang Jian <jianliang79@gmail.com> | 2014-05-28 15:46:51 +0800 |
---|---|---|
committer | jian liang <jianliang79@gmail.com> | 2014-06-13 15:50:06 +0200 |
commit | 030635a554511669baa09445cc9b11cb18e40539 (patch) | |
tree | 8794e4473ec42ae11960db5bededf50d302cdd3b | |
parent | 7eb4e701dd361f58edcdf9a74770938d6ffa75b0 (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.cpp | 8 |
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); } |