aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4engine.cpp3
-rw-r--r--src/qml/jsruntime/qv4function.cpp4
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp2
-rw-r--r--src/qml/jsruntime/qv4object.cpp4
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp18
-rw-r--r--src/qml/jsruntime/qv4string.cpp77
-rw-r--r--src/qml/jsruntime/qv4string_p.h35
-rw-r--r--src/qml/qml/ftw/qhashedstring_p.h2
-rw-r--r--src/qml/qml/qqmllocale.cpp4
9 files changed, 74 insertions, 75 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 719223f549..a9cbdaea56 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -497,7 +497,8 @@ Returned<Object> *ExecutionEngine::newObject(InternalClass *internalClass)
Returned<String> *ExecutionEngine::newString(const QString &s)
{
- return (new (memoryManager) String(this, s))->asReturned<String>();
+ Scope scope(this);
+ return ScopedString(scope, new (this) String::Data(this, s))->asReturned<String>();
}
String *ExecutionEngine::newIdentifier(const QString &text)
diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp
index 6fdf61f2c3..89646ec755 100644
--- a/src/qml/jsruntime/qv4function.cpp
+++ b/src/qml/jsruntime/qv4function.cpp
@@ -62,6 +62,8 @@ Function::Function(ExecutionEngine *engine, CompiledData::CompilationUnit *unit,
internalClass = engine->emptyClass;
const quint32 *formalsIndices = compiledFunction->formalsTable();
// iterate backwards, so we get the right ordering for duplicate names
+ Scope scope(engine);
+ ScopedString s(scope);
for (int i = static_cast<int>(compiledFunction->nFormals - 1); i >= 0; --i) {
String *arg = compilationUnit->runtimeStrings[formalsIndices[i]].asString();
while (1) {
@@ -71,7 +73,7 @@ Function::Function(ExecutionEngine *engine, CompiledData::CompilationUnit *unit,
break;
}
// duplicate arguments, need some trick to store them
- arg = new (engine->memoryManager) String(engine, arg, engine->newString(QString(0xfffe))->getPointer());
+ arg = (s = new (engine) String::Data(engine, arg, engine->newString(QString(0xfffe))->getPointer())).getPointer();
}
}
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp
index d2ddec560b..57154c4779 100644
--- a/src/qml/jsruntime/qv4lookup.cpp
+++ b/src/qml/jsruntime/qv4lookup.cpp
@@ -563,7 +563,7 @@ ReturnedValue Lookup::primitiveGetterAccessor1(Lookup *l, const ValueRef object)
ReturnedValue Lookup::stringLengthGetter(Lookup *l, const ValueRef object)
{
if (String *s = object->asString())
- return Encode(s->length());
+ return Encode(s->d()->length());
l->getter = getterGeneric;
return getterGeneric(l, object);
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index b8993d3bde..d8570758df 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -384,7 +384,7 @@ bool Object::hasOwnProperty(uint index) const
return true;
if (isStringObject()) {
String *s = static_cast<const StringObject *>(this)->d()->value.asString();
- if (index < (uint)s->length())
+ if (index < (uint)s->d()->length())
return true;
}
if (!queryIndexed(index).isEmpty())
@@ -444,7 +444,7 @@ PropertyAttributes Object::queryIndexed(const Managed *m, uint index)
if (o->isStringObject()) {
String *s = static_cast<const StringObject *>(o)->d()->value.asString();
- if (index < (uint)s->length())
+ if (index < (uint)s->d()->length())
return (Attr_NotWritable|Attr_NotConfigurable);
}
return Attr_Invalid;
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 400ee69e69..e84e85c149 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -510,11 +510,11 @@ QV4::ReturnedValue RuntimeHelpers::addHelper(ExecutionContext *ctx, const ValueR
pright = convert_to_string_add(ctx, pright);
if (scope.engine->hasException)
return Encode::undefined();
- if (!pleft->stringValue()->length())
+ if (!pleft->stringValue()->d()->length())
return pright->asReturnedValue();
- if (!pright->stringValue()->length())
+ if (!pright->stringValue()->d()->length())
return pleft->asReturnedValue();
- return (new (ctx->engine()->memoryManager) String(ctx->d()->engine, pleft->stringValue(), pright->stringValue()))->asReturnedValue();
+ return (new (ctx->engine()) String::Data(ctx->d()->engine, pleft->stringValue(), pright->stringValue()))->asReturnedValue();
}
double x = RuntimeHelpers::toNumber(pleft);
double y = RuntimeHelpers::toNumber(pright);
@@ -526,11 +526,11 @@ QV4::ReturnedValue Runtime::addString(QV4::ExecutionContext *ctx, const QV4::Val
Q_ASSERT(left->isString() || right->isString());
if (left->isString() && right->isString()) {
- if (!left->stringValue()->length())
+ if (!left->stringValue()->d()->length())
return right->asReturnedValue();
- if (!right->stringValue()->length())
+ if (!right->stringValue()->d()->length())
return left->asReturnedValue();
- return (new (ctx->engine()->memoryManager) String(ctx->d()->engine, left->stringValue(), right->stringValue()))->asReturnedValue();
+ return (new (ctx->engine()) String::Data(ctx->d()->engine, left->stringValue(), right->stringValue()))->asReturnedValue();
}
Scope scope(ctx);
@@ -543,11 +543,11 @@ QV4::ReturnedValue Runtime::addString(QV4::ExecutionContext *ctx, const QV4::Val
pright = convert_to_string_add(ctx, right);
if (scope.engine->hasException)
return Encode::undefined();
- if (!pleft->stringValue()->length())
+ if (!pleft->stringValue()->d()->length())
return pright->asReturnedValue();
- if (!pright->stringValue()->length())
+ if (!pright->stringValue()->d()->length())
return pleft->asReturnedValue();
- return (new (ctx->engine()->memoryManager) String(ctx->d()->engine, pleft->stringValue(), pright->stringValue()))->asReturnedValue();
+ return (new (ctx->engine()) String::Data(ctx->d()->engine, pleft->stringValue(), pright->stringValue()))->asReturnedValue();
}
void Runtime::setProperty(ExecutionContext *ctx, const ValueRef object, String *name, const ValueRef value)
diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp
index 588c79496c..1cdd439ab2 100644
--- a/src/qml/jsruntime/qv4string.cpp
+++ b/src/qml/jsruntime/qv4string.cpp
@@ -251,38 +251,37 @@ bool String::isEqualTo(Managed *t, Managed *o)
}
-String::String(ExecutionEngine *engine, const QString &text)
- : Managed(engine->stringClass)
+String::Data::Data(ExecutionEngine *engine, const QString &t)
+ : Managed::Data(engine->stringClass)
{
- Data *data = d();
- data->text = const_cast<QString &>(text).data_ptr();
- data->text->ref.ref();
- data->identifier = 0;
- data->stringHash = UINT_MAX;
- data->largestSubLength = 0;
- data->len = d()->text->size;
- setSubtype(StringType_Unknown);
+ subtype = StringType_Unknown;
+
+ text = const_cast<QString &>(t).data_ptr();
+ text->ref.ref();
+ identifier = 0;
+ stringHash = UINT_MAX;
+ largestSubLength = 0;
+ len = text->size;
}
-String::String(ExecutionEngine *engine, String *l, String *r)
- : Managed(engine->stringClass)
+String::Data::Data(ExecutionEngine *engine, String *l, String *r)
+ : Managed::Data(engine->stringClass)
{
- setSubtype(StringType_Unknown);
+ subtype = StringType_Unknown;
- Data *data = d();
- data->left = l;
- data->right = r;
- data->stringHash = UINT_MAX;
- data->largestSubLength = qMax(l->d()->largestSubLength, r->d()->largestSubLength);
- data->len = l->d()->len + r->d()->len;
+ left = l;
+ right = r;
+ stringHash = UINT_MAX;
+ largestSubLength = qMax(l->d()->largestSubLength, r->d()->largestSubLength);
+ len = l->d()->len + r->d()->len;
- if (!l->d()->largestSubLength && l->d()->len > d()->largestSubLength)
- d()->largestSubLength = l->d()->len;
- if (!r->d()->largestSubLength && r->d()->len > d()->largestSubLength)
- d()->largestSubLength = r->d()->len;
+ if (!l->d()->largestSubLength && l->d()->len > largestSubLength)
+ largestSubLength = l->d()->len;
+ if (!r->d()->largestSubLength && r->d()->len > largestSubLength)
+ largestSubLength = r->d()->len;
// make sure we don't get excessive depth in our strings
- if (d()->len > 256 && d()->len >= 2*d()->largestSubLength)
+ if (len > 256 && len >= 2*largestSubLength)
simplifyString();
}
@@ -321,33 +320,33 @@ bool String::equals(String *other) const
void String::makeIdentifierImpl() const
{
if (d()->largestSubLength)
- simplifyString();
+ d()->simplifyString();
Q_ASSERT(!d()->largestSubLength);
engine()->identifierTable->identifier(this);
}
-void String::simplifyString() const
+void String::Data::simplifyString() const
{
- Q_ASSERT(d()->largestSubLength);
+ Q_ASSERT(largestSubLength);
int l = length();
QString result(l, Qt::Uninitialized);
QChar *ch = const_cast<QChar *>(result.constData());
recursiveAppend(ch);
- d()->text = result.data_ptr();
- d()->text->ref.ref();
- d()->identifier = 0;
- d()->largestSubLength = 0;
+ text = result.data_ptr();
+ text->ref.ref();
+ identifier = 0;
+ largestSubLength = 0;
}
-QChar *String::recursiveAppend(QChar *ch) const
+QChar *String::Data::recursiveAppend(QChar *ch) const
{
- if (d()->largestSubLength) {
- ch = d()->left->recursiveAppend(ch);
- ch = d()->right->recursiveAppend(ch);
+ if (largestSubLength) {
+ ch = left->d()->recursiveAppend(ch);
+ ch = right->d()->recursiveAppend(ch);
} else {
- memcpy(ch, d()->text->data(), d()->text->size*sizeof(QChar));
- ch += d()->text->size;
+ memcpy(ch, text->data(), text->size*sizeof(QChar));
+ ch += text->size;
}
return ch;
}
@@ -356,7 +355,7 @@ QChar *String::recursiveAppend(QChar *ch) const
void String::createHashValue() const
{
if (d()->largestSubLength)
- simplifyString();
+ d()->simplifyString();
Q_ASSERT(!d()->largestSubLength);
const QChar *ch = reinterpret_cast<const QChar *>(d()->text->data());
const QChar *end = ch + d()->text->size;
@@ -421,7 +420,7 @@ uint String::createHashValue(const char *ch, int length)
uint String::getLength(const Managed *m)
{
- return static_cast<const String *>(m)->length();
+ return static_cast<const String *>(m)->d()->length();
}
#endif // V4_BOOTSTRAP
diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h
index 7af6ff5947..3578c0378e 100644
--- a/src/qml/jsruntime/qv4string_p.h
+++ b/src/qml/jsruntime/qv4string_p.h
@@ -54,6 +54,19 @@ struct Identifier;
struct Q_QML_PRIVATE_EXPORT String : public Managed {
#ifndef V4_BOOTSTRAP
struct Data : Managed::Data {
+ Data(ExecutionEngine *engine, const QString &text);
+ Data(ExecutionEngine *engine, String *l, String *n);
+ ~Data() {
+ if (!largestSubLength && !text->ref.deref())
+ QStringData::deallocate(text);
+ }
+ void simplifyString() const;
+ int length() const {
+ Q_ASSERT((largestSubLength &&
+ (len == left->d()->len + right->d()->len)) ||
+ len == (uint)text->size);
+ return len;
+ }
union {
mutable QStringData *text;
mutable String *left;
@@ -65,6 +78,8 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed {
mutable uint stringHash;
mutable uint largestSubLength;
uint len;
+ private:
+ QChar *recursiveAppend(QChar *ch) const;
};
struct {
union {
@@ -93,13 +108,6 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed {
StringType_ArrayIndex
};
- String(ExecutionEngine *engine, const QString &text);
- String(ExecutionEngine *engine, String *l, String *n);
- ~String() {
- if (!d()->largestSubLength && !d()->text->ref.deref())
- QStringData::deallocate(d()->text);
- }
-
bool equals(String *other) const;
inline bool isEqualTo(const String *other) const {
if (this == other)
@@ -121,14 +129,12 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed {
inline QString toQString() const {
if (d()->largestSubLength)
- simplifyString();
+ d()->simplifyString();
QStringDataPtr ptr = { d()->text };
d()->text->ref.ref();
return QString(ptr);
}
- void simplifyString() const;
-
inline unsigned hashValue() const {
if (subtype() == StringType_Unknown)
createHashValue();
@@ -164,12 +170,6 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed {
l = l->d()->left;
return l->d()->text->size && QChar::isUpper(l->d()->text->data()[0]);
}
- int length() const {
- Q_ASSERT((d()->largestSubLength &&
- (d()->len == d()->left->d()->len + d()->right->d()->len)) ||
- d()->len == (uint)d()->text->size);
- return d()->len;
- }
Identifier *identifier() const { return d()->identifier; }
@@ -186,9 +186,6 @@ protected:
static bool deleteIndexedProperty(Managed *m, uint index);
static bool isEqualTo(Managed *that, Managed *o);
static uint getLength(const Managed *m);
-
-private:
- QChar *recursiveAppend(QChar *ch) const;
#endif
public:
diff --git a/src/qml/qml/ftw/qhashedstring_p.h b/src/qml/qml/ftw/qhashedstring_p.h
index 61a492013d..57217a6bf8 100644
--- a/src/qml/qml/ftw/qhashedstring_p.h
+++ b/src/qml/qml/ftw/qhashedstring_p.h
@@ -245,7 +245,7 @@ public:
}
inline bool equals(const QV4::String *string) const {
- if (length != string->length() || hash != string->hashValue())
+ if (length != string->d()->length() || hash != string->hashValue())
return false;
if (isQString()) {
QStringDataPtr dd;
diff --git a/src/qml/qml/qqmllocale.cpp b/src/qml/qml/qqmllocale.cpp
index 7687c17e82..0d67b3a319 100644
--- a/src/qml/qml/qqmllocale.cpp
+++ b/src/qml/qml/qqmllocale.cpp
@@ -383,7 +383,7 @@ QV4::ReturnedValue QQmlNumberExtension::method_toLocaleString(QV4::CallContext *
if (!ctx->d()->callData->args[1].isString())
V4THROW_ERROR("Locale: Number.toLocaleString(): Invalid arguments");
QV4::String *fs = ctx->d()->callData->args[1].toString(ctx);
- if (fs->length())
+ if (fs->d()->length())
format = fs->toQString().at(0).unicode();
}
int prec = 2;
@@ -447,7 +447,7 @@ QV4::ReturnedValue QQmlNumberExtension::method_fromLocaleString(QV4::CallContext
}
QV4::String *ns = ctx->d()->callData->args[numberIdx].toString(ctx);
- if (!ns->length())
+ if (!ns->d()->length())
return QV4::Encode(Q_QNAN);
bool ok = false;