Fix JSON stringification to work with heap objects
authorLars Knoll <lars.knoll@digia.com>
Tue, 2 Dec 2014 11:54:53 +0000 (12:54 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Sat, 20 Dec 2014 09:07:47 +0000 (10:07 +0100)
Change-Id: Ifbd7332602d67daa945da5ebbca797d0045aff68
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4jsonobject.cpp

index 6b38c79..26cfe10 100644 (file)
@@ -641,11 +641,13 @@ struct Stringify
 {
     ExecutionContext *ctx;
     FunctionObject *replacerFunction;
-    QVector<String *> propertyList;
+    // ### GC
+    QVector<Heap::String *> propertyList;
     QString gap;
     QString indent;
 
-    QStack<Object *> stack;
+    // ### GC
+    QStack<Heap::Object *> stack;
 
     Stringify(ExecutionContext *ctx) : ctx(ctx), replacerFunction(0) {}
 
@@ -776,7 +778,7 @@ QString Stringify::makeMember(const QString &key, ValueRef v)
 
 QString Stringify::JO(Object *o)
 {
-    if (stack.contains(o)) {
+    if (stack.contains(o->d())) {
         ctx->engine()->throwTypeError();
         return QString();
     }
@@ -784,7 +786,7 @@ QString Stringify::JO(Object *o)
     Scope scope(ctx);
 
     QString result;
-    stack.push(o);
+    stack.push(o->d());
     QString stepback = indent;
     indent += gap;
 
@@ -833,7 +835,7 @@ QString Stringify::JO(Object *o)
 
 QString Stringify::JA(ArrayObject *a)
 {
-    if (stack.contains(a)) {
+    if (stack.contains(a->d())) {
         ctx->engine()->throwTypeError();
         return QString();
     }
@@ -841,7 +843,7 @@ QString Stringify::JA(ArrayObject *a)
     Scope scope(a->engine());
 
     QString result;
-    stack.push(a);
+    stack.push(a->d());
     QString stepback = indent;
     indent += gap;
 
@@ -924,8 +926,8 @@ ReturnedValue JsonObject::method_stringify(CallContext *ctx)
                     v = RuntimeHelpers::toString(scope.engine, v);
                 if (v->isString()) {
                     String *s = v->stringValue();
-                    if (!stringify.propertyList.contains(s))
-                    stringify.propertyList.append(s);
+                    if (!stringify.propertyList.contains(s->d()))
+                    stringify.propertyList.append(s->d());
                 }
             }
         }