diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-09-08 09:13:22 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-09-08 16:50:47 +0000 |
commit | 321d1d3f9d6338d2f536d58492bb3e4a5dfb808e (patch) | |
tree | e6bd39b7b6211f9fa075acfbc1727e32962290d4 /src/qml | |
parent | 45f9eaae461bcf6aad79c3957334990771b5caf4 (diff) |
Fix toNumber conversions for hex, octal and binary strings
Change-Id: Ifb7159a3307c96b27530e001ab13bcd6ddd03d09
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 39a451e941..6ada8b64f1 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -377,9 +377,24 @@ QV4::ReturnedValue Runtime::method_in(ExecutionEngine *engine, const Value &left double RuntimeHelpers::stringToNumber(const QString &string) { const QStringRef s = QStringRef(&string).trimmed(); - if (s.startsWith(QLatin1String("0x")) || s.startsWith(QLatin1String("0X"))) - return s.toLong(nullptr, 16); - bool ok; + if (s.startsWith(QLatin1Char('0'))) { + int base = -1; + if (s.startsWith(QLatin1String("0x")) || s.startsWith(QLatin1String("0X"))) + base = 16; + else if (s.startsWith(QLatin1String("0o")) || s.startsWith(QLatin1String("0O"))) + base = 8; + else if (s.startsWith(QLatin1String("0b")) || s.startsWith(QLatin1String("0B"))) + base = 2; + if (base > 0) { + bool ok = true; + qlonglong num; + num = s.mid(2).toLongLong(&ok, base); + if (!ok) + return qQNaN(); + return num; + } + } + bool ok = false; QByteArray ba = s.toLatin1(); const char *begin = ba.constData(); const char *end = nullptr; |