aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-08-06 11:05:43 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2014-08-08 10:45:28 +0200
commitead3da17e7a91a5e6adf7b03e651950378d1326c (patch)
tree12ba9236a822d817eae408a4d5231a91df8f3664 /src/qml
parent068e3609945496ede8ce3aa6cc21a41c2df0b41c (diff)
V4: change string flattening to be iterative and use a worklist.
And not recursive, because that might blow out of stack space. Task-number: QTBUG-39520 Change-Id: Id961d4af03a543d3efa173f976626cf2dae4f483 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml')
-rw-r--r--src/qml/jsruntime/qv4string.cpp26
-rw-r--r--src/qml/jsruntime/qv4string_p.h2
2 files changed, 18 insertions, 10 deletions
diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp
index 123d1648c2..86995e48f9 100644
--- a/src/qml/jsruntime/qv4string.cpp
+++ b/src/qml/jsruntime/qv4string.cpp
@@ -332,23 +332,31 @@ void String::Data::simplifyString() const
int l = length();
QString result(l, Qt::Uninitialized);
QChar *ch = const_cast<QChar *>(result.constData());
- recursiveAppend(ch);
+ append(this, ch);
text = result.data_ptr();
text->ref.ref();
identifier = 0;
largestSubLength = 0;
}
-QChar *String::Data::recursiveAppend(QChar *ch) const
+void String::Data::append(const String::Data *data, QChar *ch)
{
- if (largestSubLength) {
- ch = left->d()->recursiveAppend(ch);
- ch = right->d()->recursiveAppend(ch);
- } else {
- memcpy(ch, text->data(), text->size*sizeof(QChar));
- ch += text->size;
+ std::vector<const String::Data *> worklist;
+ worklist.reserve(32);
+ worklist.push_back(data);
+
+ while (!worklist.empty()) {
+ const String::Data *item = worklist.back();
+ worklist.pop_back();
+
+ if (item->largestSubLength) {
+ worklist.push_back(item->right->d());
+ worklist.push_back(item->left->d());
+ } else {
+ memcpy(ch, item->text->data(), item->text->size * sizeof(QChar));
+ ch += item->text->size;
+ }
}
- return ch;
}
diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h
index f9d3cd1cc0..082f296f48 100644
--- a/src/qml/jsruntime/qv4string_p.h
+++ b/src/qml/jsruntime/qv4string_p.h
@@ -79,7 +79,7 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed {
mutable uint largestSubLength;
uint len;
private:
- QChar *recursiveAppend(QChar *ch) const;
+ static void append(const Data *data, QChar *ch);
};
// ### FIXME: Should this be a V4_OBJECT
V4_OBJECT(QV4::Managed)