Implement String.prototype.search
authorSimon Hausmann <simon.hausmann@digia.com>
Mon, 21 Jan 2013 12:46:44 +0000 (13:46 +0100)
committerLars Knoll <lars.knoll@digia.com>
Mon, 21 Jan 2013 13:11:47 +0000 (14:11 +0100)
Change-Id: Id151161bda4ab5012af33a49fac11a9b7e82ec0e
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
qv4ecmaobjects.cpp
tests/TestExpectations

index 8ce8bce..e330f7d 100644 (file)
@@ -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, &regExpValue, 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)
index 87f9f96..fd6a566 100644 (file)
@@ -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