aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-08-03 21:55:43 +0200
committerLars Knoll <lars.knoll@qt.io>2018-08-06 10:00:32 +0000
commit6a85ec63a3a905e638b4f2e1e7cd92c17ad1a9f5 (patch)
treedac811bd672e1d9d13d22e99dd2b46eb20bb6226
parent7d183691a9ad95e1e1fafb611f83f42ba607bf5d (diff)
Implement String.raw
Change-Id: I331fd4d114f68fb5cb71186813f851af25539ffa Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp42
-rw-r--r--src/qml/jsruntime/qv4stringobject_p.h1
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations20
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