diff options
-rw-r--r-- | src/qml/jsruntime/qv4stringobject.cpp | 54 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4stringobject_p.h | 4 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 9 |
3 files changed, 45 insertions, 22 deletions
diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp index ae8a8508fe..6ba2b5b227 100644 --- a/src/qml/jsruntime/qv4stringobject.cpp +++ b/src/qml/jsruntime/qv4stringobject.cpp @@ -168,6 +168,46 @@ ReturnedValue StringCtor::call(const FunctionObject *m, const Value *, const Val return argv[0].toString(v4)->asReturnedValue(); } +ReturnedValue StringCtor::method_fromCharCode(const FunctionObject *b, const Value *, const Value *argv, int argc) +{ + QString str(argc, Qt::Uninitialized); + QChar *ch = str.data(); + for (int i = 0, ei = argc; i < ei; ++i) { + *ch = QChar(argv[i].toUInt16()); + ++ch; + } + *ch = 0; + return Encode(b->engine()->newString(str)); +} + + + +ReturnedValue StringCtor::method_fromCodePoint(const FunctionObject *f, const Value *, const Value *argv, int argc) +{ + ExecutionEngine *e = f->engine(); + QString result(argc*2, Qt::Uninitialized); // assume worst case + QChar *ch = result.data(); + for (int i = 0; i < argc; ++i) { + double num = argv[i].toNumber(); + if (e->hasException) + return Encode::undefined(); + int cp = static_cast<int>(num); + if (cp != num || cp < 0 || cp > 0x10ffff) + return e->throwRangeError(QStringLiteral("String.fromCodePoint: argument out of range.")); + if (cp > 0xffff) { + *ch = QChar::highSurrogate(cp); + ++ch; + *ch = QChar::lowSurrogate(cp); + } else { + *ch = cp; + } + ++ch; + } + *ch = 0; + result.truncate(ch - result.constData()); + return e->newString(result)->asReturnedValue(); +} + void StringPrototype::init(ExecutionEngine *engine, Object *ctor) { Scope scope(engine); @@ -181,7 +221,8 @@ void StringPrototype::init(ExecutionEngine *engine, Object *ctor) ctor->defineReadonlyProperty(engine->id_prototype(), (o = this)); ctor->defineReadonlyProperty(engine->id_length(), Primitive::fromInt32(1)); - ctor->defineDefaultProperty(QStringLiteral("fromCharCode"), method_fromCharCode, 1); + ctor->defineDefaultProperty(QStringLiteral("fromCharCode"), StringCtor::method_fromCharCode, 1); + ctor->defineDefaultProperty(QStringLiteral("fromCodePoint"), StringCtor::method_fromCodePoint, 1); defineDefaultProperty(QStringLiteral("constructor"), (o = ctor)); defineDefaultProperty(engine->id_toString(), method_toString); @@ -924,17 +965,6 @@ ReturnedValue StringPrototype::method_toLocaleUpperCase(const FunctionObject *b, return method_toUpperCase(b, thisObject, argv, argc); } -ReturnedValue StringPrototype::method_fromCharCode(const FunctionObject *b, const Value *, const Value *argv, int argc) -{ - QString str(argc, Qt::Uninitialized); - QChar *ch = str.data(); - for (int i = 0, ei = argc; i < ei; ++i) { - *ch = QChar(argv[i].toUInt16()); - ++ch; - } - return Encode(b->engine()->newString(str)); -} - ReturnedValue StringPrototype::method_trim(const FunctionObject *b, const Value *thisObject, const Value *, int) { ExecutionEngine *v4 = b->engine(); diff --git a/src/qml/jsruntime/qv4stringobject_p.h b/src/qml/jsruntime/qv4stringobject_p.h index 13efec7271..d9e9c16146 100644 --- a/src/qml/jsruntime/qv4stringobject_p.h +++ b/src/qml/jsruntime/qv4stringobject_p.h @@ -110,6 +110,9 @@ struct StringCtor: FunctionObject static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc); static ReturnedValue call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + + 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); }; struct StringPrototype: StringObject @@ -140,7 +143,6 @@ struct StringPrototype: StringObject static ReturnedValue method_toLocaleLowerCase(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_toUpperCase(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_toLocaleUpperCase(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); - static ReturnedValue method_fromCharCode(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_trim(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_iterator(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); }; diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 929caf4d43..40c9988292 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -2071,15 +2071,6 @@ built-ins/SharedArrayBuffer/return-abrupt-from-length.js fails built-ins/SharedArrayBuffer/toindex-length.js fails built-ins/SharedArrayBuffer/undefined-newtarget-throws.js fails built-ins/SharedArrayBuffer/zero-length.js fails -built-ins/String/fromCodePoint/argument-is-not-integer.js fails -built-ins/String/fromCodePoint/argument-not-coercible.js fails -built-ins/String/fromCodePoint/arguments-is-empty.js fails -built-ins/String/fromCodePoint/fromCodePoint.js fails -built-ins/String/fromCodePoint/length.js fails -built-ins/String/fromCodePoint/name.js fails -built-ins/String/fromCodePoint/number-is-out-of-range.js fails -built-ins/String/fromCodePoint/return-string-value.js fails -built-ins/String/fromCodePoint/to-number-conversions.js fails built-ins/String/proto-from-ctor-realm.js fails built-ins/String/prototype/endsWith/return-abrupt-from-searchstring-regexp-test.js fails built-ins/String/prototype/includes/return-abrupt-from-searchstring-regexp-test.js fails |