From 419ed1be5afce1d507916e6f52656c35a67cfe8a Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 21 Jan 2013 13:46:44 +0100 Subject: [PATCH] Implement String.prototype.search Change-Id: Id151161bda4ab5012af33a49fac11a9b7e82ec0e Reviewed-by: Lars Knoll --- qv4ecmaobjects.cpp | 20 +++++++++++++++++--- tests/TestExpectations | 24 +----------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/qv4ecmaobjects.cpp b/qv4ecmaobjects.cpp index 8ce8bce..e330f7d 100644 --- a/qv4ecmaobjects.cpp +++ b/qv4ecmaobjects.cpp @@ -929,9 +929,23 @@ Value StringPrototype::method_replace(ExecutionContext *ctx) Value StringPrototype::method_search(ExecutionContext *ctx) { - // requires Regexp - ctx->throwUnimplemented(QStringLiteral("String.prototype.search")); - return Value::undefinedValue(); + QString string; + if (StringObject *thisString = ctx->thisObject.asStringObject()) + string = thisString->value.stringValue()->toQString(); + else + string = ctx->thisObject.toString(ctx)->toQString(); + + Value regExpValue = ctx->argument(0); + RegExpObject *regExp = regExpValue.asRegExpObject(); + if (!regExp) { + regExpValue = ctx->engine->regExpCtor.asFunctionObject()->construct(ctx, ®ExpValue, 1); + regExp = regExpValue.asRegExpObject(); + } + uint* matchOffsets = (uint*)alloca(regExp->value->captureCount() * 2 * sizeof(uint)); + uint result = regExp->value->match(string, /*offset*/0, matchOffsets); + if (result == JSC::Yarr::offsetNoMatch) + return Value::fromInt32(-1); + return Value::fromUInt32(result); } Value StringPrototype::method_slice(ExecutionContext *ctx) diff --git a/tests/TestExpectations b/tests/TestExpectations index 87f9f96..fd6a566 100644 --- a/tests/TestExpectations +++ b/tests/TestExpectations @@ -624,29 +624,7 @@ S15.4.4.7_A4_T3 failing S15.5.4.10_A1_T10 failing S15.5.4.11_A1_T10 failing S15.5.4.11_A5_T1 failing -S15.5.4.12_A1.1_T1 failing -S15.5.4.12_A1_T1 failing S15.5.4.12_A1_T10 failing -S15.5.4.12_A1_T11 failing -S15.5.4.12_A1_T12 failing -S15.5.4.12_A1_T13 failing -S15.5.4.12_A1_T14 failing -S15.5.4.12_A1_T2 failing -S15.5.4.12_A1_T4 failing -S15.5.4.12_A1_T5 failing -S15.5.4.12_A1_T6 failing -S15.5.4.12_A1_T7 failing -S15.5.4.12_A1_T8 failing -S15.5.4.12_A1_T9 failing -S15.5.4.12_A2_T1 failing -S15.5.4.12_A2_T2 failing -S15.5.4.12_A2_T3 failing -S15.5.4.12_A2_T4 failing -S15.5.4.12_A2_T5 failing -S15.5.4.12_A2_T6 failing -S15.5.4.12_A2_T7 failing -S15.5.4.12_A3_T1 failing -S15.5.4.12_A3_T2 failing S15.5.4.13_A1_T10 failing S15.4.4.8_A1_T1 failing S15.4.4.8_A1_T2 failing @@ -968,4 +946,4 @@ S15.4.4.4_A1_T2 failing 15.4.4.21-8-b-iii-1-6 failing 15.12.3_4-1-1 -15.12.3_4-1-3 \ No newline at end of file +15.12.3_4-1-3 -- 2.7.4