aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-05-01 00:08:55 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-06-17 09:03:48 +0000
commit64199b0a5842b6b57f694c14d7f1327cf5f2344f (patch)
tree5846b6e7866a5abb10bafcdefafe5fc0ceff171f /src
parent81d8e36c1732854a0c6b0312c0bf42804d30192e (diff)
Store a Heap::String pointer in StringObject
Change-Id: I926c5bb2dd4f1613af6737d4200e568f0ec13d58 Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp4
-rw-r--r--src/qml/jsruntime/qv4engine_p.h2
-rw-r--r--src/qml/jsruntime/qv4jsonobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4object.cpp6
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp2
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp27
-rw-r--r--src/qml/jsruntime/qv4stringobject_p.h4
7 files changed, 23 insertions, 26 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 37b5964bd3..2ac56f52c5 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -548,10 +548,10 @@ Heap::String *ExecutionEngine::newIdentifier(const QString &text)
return identifierTable->insertString(text);
}
-Heap::Object *ExecutionEngine::newStringObject(const Value &value)
+Heap::Object *ExecutionEngine::newStringObject(const String *string)
{
Scope scope(this);
- Scoped<StringObject> object(scope, memoryManager->alloc<StringObject>(this, value));
+ Scoped<StringObject> object(scope, memoryManager->alloc<StringObject>(this, string));
return object->d();
}
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index 04a99d844d..c2d3183e35 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -356,7 +356,7 @@ public:
Heap::String *newString(const QString &s = QString());
Heap::String *newIdentifier(const QString &text);
- Heap::Object *newStringObject(const Value &value);
+ Heap::Object *newStringObject(const String *string);
Heap::Object *newNumberObject(double value);
Heap::Object *newBooleanObject(bool b);
diff --git a/src/qml/jsruntime/qv4jsonobject.cpp b/src/qml/jsruntime/qv4jsonobject.cpp
index 87de6a6aba..d634e783bd 100644
--- a/src/qml/jsruntime/qv4jsonobject.cpp
+++ b/src/qml/jsruntime/qv4jsonobject.cpp
@@ -709,7 +709,7 @@ QString Stringify::Str(const QString &key, const Value &v)
if (NumberObject *n = o->as<NumberObject>())
value = Encode(n->value());
else if (StringObject *so = o->as<StringObject>())
- value = so->d()->value;
+ value = so->d()->string;
else if (BooleanObject *b = o->as<BooleanObject>())
value = Encode(b->value());
}
@@ -922,7 +922,7 @@ ReturnedValue JsonObject::method_stringify(CallContext *ctx)
if (NumberObject *n = s->as<NumberObject>())
s = Encode(n->value());
else if (StringObject *so = s->as<StringObject>())
- s = so->d()->value;
+ s = so->d()->string;
if (s->isNumber()) {
stringify.gap = QString(qMin(10, (int)s->toInteger()), ' ');
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index a5ec07006e..b4ad477e89 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -356,8 +356,7 @@ bool Object::hasOwnProperty(uint index) const
return true;
if (isStringObject()) {
- String *s = static_cast<const StringObject *>(this)->d()->value.as<String>();
- if (index < (uint)s->d()->length())
+ if (index < static_cast<const StringObject *>(this)->length())
return true;
}
if (!queryIndexed(index).isEmpty())
@@ -416,8 +415,7 @@ PropertyAttributes Object::queryIndexed(const Managed *m, uint index)
return o->arrayData()->attributes(index);
if (o->isStringObject()) {
- String *s = static_cast<const StringObject *>(o)->d()->value.as<String>();
- if (index < (uint)s->d()->length())
+ if (index < static_cast<const StringObject *>(o)->length())
return (Attr_NotWritable|Attr_NotConfigurable);
}
return Attr_Invalid;
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index ad5b27b456..4026be75e4 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -438,7 +438,7 @@ Heap::Object *RuntimeHelpers::convertToObject(ExecutionEngine *engine, const Val
return engine->newBooleanObject(value.booleanValue());
case Value::Managed_Type:
Q_ASSERT(value.isString());
- return engine->newStringObject(value);
+ return engine->newStringObject(value.stringValue());
case Value::Integer_Type:
default: // double
return engine->newNumberObject(value.asDouble());
diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp
index 08b078f8c5..46cef39ea5 100644
--- a/src/qml/jsruntime/qv4stringobject.cpp
+++ b/src/qml/jsruntime/qv4stringobject.cpp
@@ -71,27 +71,26 @@ Heap::StringObject::StringObject(InternalClass *ic, QV4::Object *prototype)
: Heap::Object(ic, prototype)
{
Q_ASSERT(vtable == QV4::StringObject::staticVTable());
- value = ic->engine->newString()->asReturnedValue();
+ string = ic->engine->newString();
Scope scope(ic->engine);
ScopedObject s(scope, this);
s->defineReadonlyProperty(ic->engine->id_length(), Primitive::fromInt32(0));
}
-Heap::StringObject::StringObject(ExecutionEngine *engine, const Value &val)
+Heap::StringObject::StringObject(ExecutionEngine *engine, const QV4::String *str)
: Heap::Object(engine->emptyClass, engine->stringPrototype())
{
- value = val;
- Q_ASSERT(value.isString());
+ string = str->d();
Scope scope(engine);
ScopedObject s(scope, this);
- s->defineReadonlyProperty(engine->id_length(), Primitive::fromUInt32(value.stringValue()->toQString().length()));
+ s->defineReadonlyProperty(engine->id_length(), Primitive::fromUInt32(length()));
}
Heap::String *Heap::StringObject::getIndex(uint index) const
{
- QString str = value.stringValue()->toQString();
+ QString str = string->toQString();
if (index >= (uint)str.length())
return 0;
return internalClass->engine->newString(str.mid(index, 1));
@@ -99,7 +98,7 @@ Heap::String *Heap::StringObject::getIndex(uint index) const
uint Heap::StringObject::length() const
{
- return value.stringValue()->toQString().length();
+ return string->toQString().length();
}
bool StringObject::deleteIndexedProperty(Managed *m, uint index)
@@ -109,7 +108,7 @@ bool StringObject::deleteIndexedProperty(Managed *m, uint index)
Scoped<StringObject> o(scope, m->as<StringObject>());
Q_ASSERT(!!o);
- if (index < static_cast<uint>(o->d()->value.stringValue()->toQString().length())) {
+ if (index < static_cast<uint>(o->d()->string->toQString().length())) {
if (v4->currentContext()->strictMode)
v4->throwTypeError();
return false;
@@ -121,7 +120,7 @@ void StringObject::advanceIterator(Managed *m, ObjectIterator *it, Heap::String
{
*name = (Heap::String *)0;
StringObject *s = static_cast<StringObject *>(m);
- uint slen = s->d()->value.stringValue()->toQString().length();
+ uint slen = s->d()->string->toQString().length();
if (it->arrayIndex <= slen) {
while (it->arrayIndex < slen) {
*index = it->arrayIndex;
@@ -149,7 +148,7 @@ void StringObject::advanceIterator(Managed *m, ObjectIterator *it, Heap::String
void StringObject::markObjects(Heap::Base *that, ExecutionEngine *e)
{
StringObject::Data *o = static_cast<StringObject::Data *>(that);
- o->value.stringValue()->mark(e);
+ o->string->mark(e);
Object::markObjects(that, e);
}
@@ -164,7 +163,7 @@ ReturnedValue StringCtor::construct(const Managed *m, CallData *callData)
{
ExecutionEngine *v4 = static_cast<const Object *>(m)->engine();
Scope scope(v4);
- ScopedValue value(scope);
+ ScopedString value(scope);
if (callData->argc)
value = callData->args[0].toString(v4);
else
@@ -223,7 +222,7 @@ static QString getThisString(ExecutionContext *ctx)
if (t->isString())
return t->stringValue()->toQString();
if (StringObject *thisString = t->as<StringObject>())
- return thisString->d()->value.stringValue()->toQString();
+ return thisString->d()->string->toQString();
if (t->isUndefined() || t->isNull()) {
scope.engine->throwTypeError();
return QString();
@@ -239,7 +238,7 @@ ReturnedValue StringPrototype::method_toString(CallContext *context)
StringObject *o = context->thisObject().as<StringObject>();
if (!o)
return context->engine()->throwTypeError();
- return o->d()->value.asReturnedValue();
+ return Encode(o->d()->string);
}
ReturnedValue StringPrototype::method_charAt(CallContext *context)
@@ -473,7 +472,7 @@ ReturnedValue StringPrototype::method_replace(CallContext *ctx)
Scope scope(ctx);
QString string;
if (StringObject *thisString = ctx->thisObject().as<StringObject>())
- string = thisString->d()->value.stringValue()->toQString();
+ string = thisString->d()->string->toQString();
else
string = ctx->thisObject().toQString();
diff --git a/src/qml/jsruntime/qv4stringobject_p.h b/src/qml/jsruntime/qv4stringobject_p.h
index 8b05cfd3dc..709b73f0bb 100644
--- a/src/qml/jsruntime/qv4stringobject_p.h
+++ b/src/qml/jsruntime/qv4stringobject_p.h
@@ -45,8 +45,8 @@ namespace Heap {
struct StringObject : Object {
StringObject(InternalClass *ic, QV4::Object *prototype);
- StringObject(ExecutionEngine *engine, const Value &value);
- Value value;
+ StringObject(ExecutionEngine *engine, const QV4::String *string);
+ String *string;
Heap::String *getIndex(uint index) const;
uint length() const;