From b538231cb2409d9d6eb87161930b53b004aed3ac Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 15 Oct 2013 15:00:24 +0200 Subject: Fix GC issues with usage of raw RegExp pointers Properly protect them through Scoped values. Change-Id: I5a0a1d5580d55ecff493419baa8959751a65f1d3 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4engine.cpp | 6 ++++-- src/qml/jsruntime/qv4engine_p.h | 2 +- src/qml/jsruntime/qv4regexpobject.cpp | 7 ++++--- src/qml/jsruntime/qv4regexpobject_p.h | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) (limited to 'src/qml/jsruntime') 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 *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 re(scope, RegExp::create(this, pattern, ignoreCase, multiline)); + return newRegExpObject(re, global); } -Returned *ExecutionEngine::newRegExpObject(RegExp* re, bool global) +Returned *ExecutionEngine::newRegExpObject(Referenced re, bool global) { RegExpObject *object = new (memoryManager) RegExpObject(this, re, global); return object->asReturned(); 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 *newDateObject(const QDateTime &dt); Returned *newRegExpObject(const QString &pattern, int flags); - Returned *newRegExpObject(RegExp* re, bool global); + Returned *newRegExpObject(Referenced re, bool global); Returned *newRegExpObject(const QRegExp &re); Returned *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 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 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(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 value, bool global); RegExpObject(ExecutionEngine *engine, const QRegExp &re); ~RegExpObject() {} -- cgit v1.2.3