aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-10-15 15:00:24 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-15 20:57:37 +0200
commitb538231cb2409d9d6eb87161930b53b004aed3ac (patch)
tree7a8bc0d0a2d4349f963459325294ea49a6b1b1fb /src
parente20253ed7a11ac65594ca88c933739d6c01b446d (diff)
Fix GC issues with usage of raw RegExp pointers
Properly protect them through Scoped values. Change-Id: I5a0a1d5580d55ecff493419baa8959751a65f1d3 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp6
-rw-r--r--src/qml/jsruntime/qv4engine_p.h2
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp7
-rw-r--r--src/qml/jsruntime/qv4regexpobject_p.h2
4 files changed, 10 insertions, 7 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 6257d8bac9..2ddc07d63c 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -464,10 +464,12 @@ Returned<RegExpObject> *ExecutionEngine::newRegExpObject(const QString &pattern,
if (flags & QQmlJS::V4IR::RegExp::RegExp_Multiline)
multiline = true;
- return newRegExpObject(RegExp::create(this, pattern, ignoreCase, multiline), global);
+ Scope scope(this);
+ Scoped<RegExp> re(scope, RegExp::create(this, pattern, ignoreCase, multiline));
+ return newRegExpObject(re, global);
}
-Returned<RegExpObject> *ExecutionEngine::newRegExpObject(RegExp* re, bool global)
+Returned<RegExpObject> *ExecutionEngine::newRegExpObject(Referenced<RegExp> re, bool global)
{
RegExpObject *object = new (memoryManager) RegExpObject(this, re, global);
return object->asReturned<RegExpObject>();
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index e70ac7b24f..5da556452e 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -286,7 +286,7 @@ struct Q_QML_EXPORT ExecutionEngine
Returned<DateObject> *newDateObject(const QDateTime &dt);
Returned<RegExpObject> *newRegExpObject(const QString &pattern, int flags);
- Returned<RegExpObject> *newRegExpObject(RegExp* re, bool global);
+ Returned<RegExpObject> *newRegExpObject(Referenced<RegExp> re, bool global);
Returned<RegExpObject> *newRegExpObject(const QRegExp &re);
Returned<Object> *newErrorObject(const ValueRef value);
diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp
index 4adee433aa..6eaa8c387d 100644
--- a/src/qml/jsruntime/qv4regexpobject.cpp
+++ b/src/qml/jsruntime/qv4regexpobject.cpp
@@ -79,7 +79,7 @@ RegExpObject::RegExpObject(InternalClass *ic)
init(ic->engine);
}
-RegExpObject::RegExpObject(ExecutionEngine *engine, RegExp* value, bool global)
+RegExpObject::RegExpObject(ExecutionEngine *engine, Referenced<RegExp> value, bool global)
: Object(engine->regExpClass)
, value(value)
, global(global)
@@ -251,7 +251,8 @@ ReturnedValue RegExpCtor::construct(Managed *m, CallData *callData)
if (!f->isUndefined())
ctx->throwTypeError();
- return Encode(ctx->engine->newRegExpObject(re->value, re->global));
+ Scoped<RegExp> newRe(scope, re->value);
+ return Encode(ctx->engine->newRegExpObject(newRe, re->global));
}
QString pattern;
@@ -277,7 +278,7 @@ ReturnedValue RegExpCtor::construct(Managed *m, CallData *callData)
}
}
- RegExp *regexp = RegExp::create(ctx->engine, pattern, ignoreCase, multiLine);
+ Scoped<RegExp> regexp(scope, RegExp::create(ctx->engine, pattern, ignoreCase, multiLine));
if (!regexp->isValid())
ctx->throwSyntaxError(0);
diff --git a/src/qml/jsruntime/qv4regexpobject_p.h b/src/qml/jsruntime/qv4regexpobject_p.h
index 764470e776..0ef95a36e2 100644
--- a/src/qml/jsruntime/qv4regexpobject_p.h
+++ b/src/qml/jsruntime/qv4regexpobject_p.h
@@ -83,7 +83,7 @@ struct RegExpObject: Object {
Property *lastIndexProperty(ExecutionContext *ctx);
bool global;
- RegExpObject(ExecutionEngine *engine, RegExp* value, bool global);
+ RegExpObject(ExecutionEngine *engine, Referenced<RegExp> value, bool global);
RegExpObject(ExecutionEngine *engine, const QRegExp &re);
~RegExpObject() {}