Use a smart pointer for Object::members.
authorJędrzej Nowacki <jedrzej.nowacki@digia.com>
Thu, 13 Dec 2012 09:19:14 +0000 (10:19 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Thu, 13 Dec 2012 11:44:29 +0000 (12:44 +0100)
Change-Id: I070c00281a5b92de82568d4d4e0bb35700233a21
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
qmljs_objects.cpp
qmljs_objects.h
qv4ecmaobjects.cpp

index b282332..5116282 100644 (file)
@@ -87,7 +87,6 @@ void Managed::operator delete(void *ptr)
 //
 Object::~Object()
 {
-    delete members;
 }
 
 void Object::__put__(ExecutionContext *ctx, const QString &name, const Value &value)
@@ -126,7 +125,7 @@ bool Object::inplaceBinOp(Value rhs, Value index, BinOp op, ExecutionContext *ct
 void Object::defineDefaultProperty(String *name, Value value)
 {
     if (!members)
-        members = new PropertyTable();
+        members.reset(new PropertyTable());
     PropertyDescriptor *pd = members->insert(name);
     pd->type = PropertyDescriptor::Data;
     pd->writable = PropertyDescriptor::Set;
@@ -151,7 +150,7 @@ void Object::defineDefaultProperty(ExecutionContext *context, const QString &nam
 void Object::defineReadonlyProperty(ExecutionEngine *engine, const QString &name, Value value)
 {
     if (!members)
-        members = new PropertyTable();
+        members.reset(new PropertyTable());
     PropertyDescriptor *pd = members->insert(engine->identifier(name));
     pd->type = PropertyDescriptor::Data;
     pd->writable = PropertyDescriptor::Unset;
@@ -239,7 +238,7 @@ void Object::__put__(ExecutionContext *ctx, String *name, Value value)
         goto reject;
 
     if (!members)
-        members = new PropertyTable();
+        members.reset(new PropertyTable());
 
     {
         // Clause 2
@@ -312,7 +311,7 @@ bool Object::__delete__(ExecutionContext *ctx, String *name)
 bool Object::__defineOwnProperty__(ExecutionContext *ctx, String *name, PropertyDescriptor *desc)
 {
     if (!members)
-        members = new PropertyTable();
+        members.reset(new PropertyTable());
 
     // Clause 1
     PropertyDescriptor *current = __getOwnProperty__(ctx, name);
index 384c693..99e29fe 100644 (file)
@@ -51,6 +51,7 @@
 #include <QtCore/QString>
 #include <QtCore/QHash>
 #include <QtCore/QRegularExpression>
+#include <QtCore/QScopedPointer>
 #include <cstdio>
 #include <cassert>
 
@@ -418,12 +419,11 @@ private:
 
 struct Object: Managed {
     Object *prototype;
-    PropertyTable *members;
+    QScopedPointer<PropertyTable> members;
     bool extensible;
 
     Object()
         : prototype(0)
-        , members(0)
         , extensible(true) {}
 
     virtual ~Object();
index 6bf661c..3090a3e 100644 (file)
@@ -605,7 +605,7 @@ Value ObjectPrototype::method_getOwnPropertyNames(ExecutionContext *ctx)
 
     ArrayObject *array = ctx->engine->newArrayObject()->asArrayObject();
     Array &a = array->value;
-    if (PropertyTable *members = O.objectValue()->members) {
+    if (PropertyTable *members = O.objectValue()->members.data()) {
         for (PropertyTableEntry **it = members->begin(), **end = members->end(); it != end; ++it) {
             if (PropertyTableEntry *prop = *it) {
                 a.push(Value::fromString(prop->name));