Store a Heap::String pointer in StringObject
authorLars Knoll <lars.knoll@theqtcompany.com>
Thu, 30 Apr 2015 22:08:55 +0000 (00:08 +0200)
committerSimon Hausmann <simon.hausmann@theqtcompany.com>
Wed, 17 Jun 2015 09:03:48 +0000 (09:03 +0000)
Change-Id: I926c5bb2dd4f1613af6737d4200e568f0ec13d58
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
src/qml/jsruntime/qv4engine.cpp
src/qml/jsruntime/qv4engine_p.h
src/qml/jsruntime/qv4jsonobject.cpp
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4stringobject.cpp
src/qml/jsruntime/qv4stringobject_p.h

index 37b5964bd3b556ef4a308530f1af01d8cd6fe61a..2ac56f52c50b119a2487772709e5b6eb0db9d922 100644 (file)
@@ -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();
 }
 
index 04a99d844de463c764fbe2e90b27230445595be3..c2d3183e35925e61c2fdcdd8c2349bd865eca013 100644 (file)
@@ -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);
 
index 87de6a6abae5dcd81cf0138d89fa4f0760423a69..d634e783bd77dcebdddef4d1aff60069b291cfc1 100644 (file)
@@ -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()), ' ');
index a5ec07006e3fbce144a01ce58c4e1283c89bf492..b4ad477e89a61aab48302f289137f2fc2e1f3b1e 100644 (file)
@@ -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;
index ad5b27b45618e8480933e005f44e0c352b3dd64e..4026be75e49c5016db47f98e26676bc9f8563cf4 100644 (file)
@@ -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());
index 08b078f8c5ec119326a955a065874796f7b041bc..46cef39ea553c4f0cfc3e2e6c96d21f3a615bdbe 100644 (file)
@@ -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();
 
index 8b05cfd3dcf4976fed95db991e35256a110b9ab5..709b73f0bb123822cc351af86ce5a35281a0999a 100644 (file)
@@ -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;