diff options
author | Lars Knoll <[email protected]> | 2018-08-03 21:55:43 +0200 |
---|---|---|
committer | Lars Knoll <[email protected]> | 2018-08-06 10:00:32 +0000 |
commit | 6a85ec63a3a905e638b4f2e1e7cd92c17ad1a9f5 (patch) | |
tree | dac811bd672e1d9d13d22e99dd2b46eb20bb6226 | |
parent | 7d183691a9ad95e1e1fafb611f83f42ba607bf5d (diff) |
Implement String.raw
Change-Id: I331fd4d114f68fb5cb71186813f851af25539ffa
Reviewed-by: Simon Hausmann <[email protected]>
-rw-r--r-- | src/qml/jsruntime/qv4stringobject.cpp | 42 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4stringobject_p.h | 1 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 20 |
3 files changed, 43 insertions, 20 deletions
diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp index a48ff0b00d..fd2d297d55 100644 --- a/src/qml/jsruntime/qv4stringobject.cpp +++ b/src/qml/jsruntime/qv4stringobject.cpp @@ -232,6 +232,47 @@ ReturnedValue StringCtor::method_fromCodePoint(const FunctionObject *f, const Va return e->newString(result)->asReturnedValue(); } +ReturnedValue StringCtor::method_raw(const FunctionObject *f, const Value *, const Value *argv, int argc) +{ + Scope scope(f); + if (!argc) + return scope.engine->throwTypeError(); + + ScopedObject cooked(scope, argv[0].toObject(scope.engine)); + if (!cooked) + return scope.engine->throwTypeError(); + ScopedString rawString(scope, scope.engine->newIdentifier(QStringLiteral("raw"))); + ScopedValue rawValue(scope, cooked->get(rawString)); + ScopedObject raw(scope, rawValue->toObject(scope.engine)); + if (scope.hasException()) + return Encode::undefined(); + + ++argv; + --argc; + + QString result; + uint literalSegments = raw->getLength(); + if (!literalSegments) + return scope.engine->id_empty()->asReturnedValue(); + + uint nextIndex = 0; + ScopedValue val(scope); + while (1) { + val = raw->get(nextIndex); + result += val->toQString(); + if (scope.engine->hasException) + return Encode::undefined(); + if (nextIndex + 1 == literalSegments) + return scope.engine->newString(result)->asReturnedValue(); + + if (nextIndex < static_cast<uint>(argc)) + result += argv[nextIndex].toQString(); + if (scope.engine->hasException) + return Encode::undefined(); + ++nextIndex; + } +} + void StringPrototype::init(ExecutionEngine *engine, Object *ctor) { Scope scope(engine); @@ -247,6 +288,7 @@ void StringPrototype::init(ExecutionEngine *engine, Object *ctor) ctor->defineReadonlyConfigurableProperty(engine->id_length(), Primitive::fromInt32(1)); ctor->defineDefaultProperty(QStringLiteral("fromCharCode"), StringCtor::method_fromCharCode, 1); ctor->defineDefaultProperty(QStringLiteral("fromCodePoint"), StringCtor::method_fromCodePoint, 1); + ctor->defineDefaultProperty(QStringLiteral("raw"), StringCtor::method_raw, 1); defineDefaultProperty(QStringLiteral("constructor"), (o = ctor)); defineDefaultProperty(engine->id_toString(), method_toString); diff --git a/src/qml/jsruntime/qv4stringobject_p.h b/src/qml/jsruntime/qv4stringobject_p.h index 20d8cf3fd4..4d89c802b6 100644 --- a/src/qml/jsruntime/qv4stringobject_p.h +++ b/src/qml/jsruntime/qv4stringobject_p.h @@ -114,6 +114,7 @@ struct StringCtor: FunctionObject static ReturnedValue method_fromCharCode(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_fromCodePoint(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_raw(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); }; struct StringPrototype: StringObject diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 014de6ca4a..b8243db29e 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -1023,28 +1023,8 @@ built-ins/String/prototype/toLocaleLowerCase/Final_Sigma_U180E.js fails built-ins/String/prototype/toLocaleLowerCase/special_casing_conditional.js fails built-ins/String/prototype/toLowerCase/Final_Sigma_U180E.js fails built-ins/String/prototype/toLowerCase/special_casing_conditional.js fails -built-ins/String/raw/length.js fails -built-ins/String/raw/name.js fails -built-ins/String/raw/raw.js fails -built-ins/String/raw/return-empty-string-from-empty-array-length.js fails -built-ins/String/raw/return-empty-string-if-length-is-negative-infinity.js fails -built-ins/String/raw/return-empty-string-if-length-is-not-defined.js fails -built-ins/String/raw/return-empty-string-if-length-is-undefined.js fails -built-ins/String/raw/return-empty-string-if-length-is-zero-NaN.js fails -built-ins/String/raw/return-empty-string-if-length-is-zero-boolean.js fails -built-ins/String/raw/return-empty-string-if-length-is-zero-null.js fails -built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-number.js fails -built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-string.js fails built-ins/String/raw/return-the-string-value-from-template.js fails -built-ins/String/raw/return-the-string-value.js fails -built-ins/String/raw/returns-abrupt-from-next-key-toString.js fails -built-ins/String/raw/returns-abrupt-from-next-key.js fails -built-ins/String/raw/returns-abrupt-from-substitution.js fails built-ins/String/raw/special-characters.js fails -built-ins/String/raw/substitutions-are-appended-on-same-index.js fails -built-ins/String/raw/substitutions-are-limited-to-template-raw-length.js fails -built-ins/String/raw/template-length-throws.js fails -built-ins/String/raw/template-raw-throws.js fails built-ins/String/raw/template-substitutions-are-appended-on-same-index.js fails built-ins/String/raw/zero-literal-segments.js fails built-ins/Symbol/for/cross-realm.js fails |