From ea0ea907edbe7dd0c65f10752d7df1de6f0fd63b Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 2 Sep 2013 14:25:15 +0200 Subject: Optimize String.replace and RegExp.exec This speeds up the v8 regexp benchmark by a factor 2.5 :) Change-Id: Ibd6b18ee28181aa712429cbec4598984e0c69820 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4regexpobject.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'src/qml/jsruntime/qv4regexpobject.cpp') diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp index cd104c0a71..c213c78aeb 100644 --- a/src/qml/jsruntime/qv4regexpobject.cpp +++ b/src/qml/jsruntime/qv4regexpobject.cpp @@ -177,7 +177,7 @@ void RegExpObject::markObjects(Managed *that) Property *RegExpObject::lastIndexProperty(ExecutionContext *ctx) { - assert(0 == internalClass->find(ctx->engine->newIdentifier(QStringLiteral("lastIndex")))); + Q_ASSERT(0 == internalClass->find(ctx->engine->newIdentifier(QStringLiteral("lastIndex")))); return &memberData[0]; } @@ -317,18 +317,19 @@ Value RegExpPrototype::method_exec(SimpleCallContext *ctx) } // fill in result data - ArrayObject *array = ctx->engine->newArrayObject(); - for (int i = 0; i < r->value->captureCount(); ++i) { + ArrayObject *array = ctx->engine->newArrayObject(ctx->engine->regExpExecArrayClass); + int len = r->value->captureCount(); + array->arrayReserve(len); + for (int i = 0; i < len; ++i) { int start = matchOffsets[i * 2]; int end = matchOffsets[i * 2 + 1]; - Value entry = Value::undefinedValue(); - if (start != -1 && end != -1) - entry = Value::fromString(ctx, s.mid(start, end - start)); - array->push_back(entry); + array->arrayData[i].value = (start != -1 && end != -1) ? Value::fromString(ctx, s.mid(start, end - start)) : Value::undefinedValue(); } + array->arrayDataLen = len; + array->setArrayLengthUnchecked(len); - array->put(ctx, QLatin1String("index"), Value::fromInt32(result)); - array->put(ctx, QLatin1String("input"), arg); + array->memberData[Index_ArrayIndex].value = Value::fromInt32(result); + array->memberData[Index_ArrayInput].value = arg; if (r->global) r->lastIndexProperty(ctx)->value = Value::fromInt32(matchOffsets[1]); -- cgit v1.2.3