Fix GC errors with Error object
authorSimon Hausmann <simon.hausmann@digia.com>
Fri, 21 Jun 2013 19:27:33 +0000 (21:27 +0200)
committerLars Knoll <lars.knoll@digia.com>
Fri, 21 Jun 2013 19:46:47 +0000 (21:46 +0200)
Don't forget to properly mark the stack value we're keeping

Change-Id: Ifb002a5e8519e40cd1a4c7f7845171452a585562
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/qml/v4/qv4errorobject.cpp
src/qml/qml/v4/qv4errorobject_p.h

index 0f77b54..6df3ffe 100644 (file)
@@ -75,8 +75,10 @@ using namespace QV4;
 
 ErrorObject::ErrorObject(ExecutionEngine *engine, const Value &message, ErrorType t)
     : Object(engine)
+    , stack(0)
 {
     type = Type_ErrorObject;
+    vtbl = &static_vtbl;
     subtype = t;
     defineAccessorProperty(engine, QStringLiteral("stack"), ErrorObject::method_get_stack, 0);
 
@@ -89,8 +91,6 @@ ErrorObject::ErrorObject(ExecutionEngine *engine, const Value &message, ErrorTyp
         defineDefaultProperty(engine, QStringLiteral("fileName"), Value::fromString(engine, stackTrace.at(0).source));
         defineDefaultProperty(engine, QStringLiteral("lineNumber"), Value::fromInt32(stackTrace.at(0).line));
     }
-
-    stack = Value::emptyValue();
 }
 
 Value ErrorObject::method_get_stack(SimpleCallContext *ctx)
@@ -98,7 +98,7 @@ Value ErrorObject::method_get_stack(SimpleCallContext *ctx)
     ErrorObject *This = ctx->thisObject.asErrorObject();
     if (!This)
         ctx->throwTypeError();
-    if (This->stack.isEmpty()) {
+    if (!This->stack) {
         QString trace;
         for (int i = 0; i < This->stackTrace.count(); ++i) {
             if (i > 0)
@@ -112,11 +112,21 @@ Value ErrorObject::method_get_stack(SimpleCallContext *ctx)
                 trace += QString::number(frame.line);
             }
         }
-        This->stack = Value::fromString(ctx, trace);
+        This->stack = ctx->engine->newString(trace);
     }
-    return This->stack;
+    return Value::fromString(This->stack);
+}
+
+void ErrorObject::markObjects(Managed *that)
+{
+    ErrorObject *This = that->asErrorObject();
+    if (This->stack)
+        This->stack->mark();
+    Object::markObjects(that);
 }
 
+DEFINE_MANAGED_VTABLE(ErrorObject);
+
 DEFINE_MANAGED_VTABLE(SyntaxErrorObject);
 
 SyntaxErrorObject::SyntaxErrorObject(ExecutionEngine *engine, const Value &msg)
index 7cc8804..a5a6bba 100644 (file)
@@ -51,6 +51,8 @@ namespace QV4 {
 struct SyntaxErrorObject;
 
 struct ErrorObject: Object {
+    Q_MANAGED
+
     enum ErrorType {
         Error,
         EvalError,
@@ -66,9 +68,11 @@ struct ErrorObject: Object {
     SyntaxErrorObject *asSyntaxError();
 
     ExecutionEngine::StackTrace stackTrace;
-    Value stack;
+    String *stack;
 
     static Value method_get_stack(SimpleCallContext *ctx);
+    static void markObjects(Managed *that);
+    static void destroy(Managed *that) { static_cast<ErrorObject *>(that)->~ErrorObject(); }
 };
 
 struct EvalErrorObject: ErrorObject {