1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2018 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtQml module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #include "qv4propertykey_p.h" 41 42 #include <QtCore/qstring.h> 43 #include <qv4string_p.h> 44 #include <qv4engine_p.h> 45 #include <qv4scopedvalue_p.h> 46 toStringOrSymbol(QV4::ExecutionEngine * e)47QV4::Heap::StringOrSymbol *QV4::PropertyKey::toStringOrSymbol(QV4::ExecutionEngine *e) 48 { 49 if (isArrayIndex()) 50 return Value::fromUInt32(asArrayIndex()).toString(e); 51 return static_cast<Heap::StringOrSymbol *>(asStringOrSymbol()); 52 } 53 isString() const54bool QV4::PropertyKey::isString() const { 55 Heap::StringOrSymbol *s = asStringOrSymbol(); 56 return s && s->internalClass->vtable->isString; 57 } 58 isSymbol() const59bool QV4::PropertyKey::isSymbol() const { 60 Heap::Base *s = asStringOrSymbol(); 61 return s && !s->internalClass->vtable->isString && s->internalClass->vtable->isStringOrSymbol; 62 } 63 isCanonicalNumericIndexString() const64bool QV4::PropertyKey::isCanonicalNumericIndexString() const 65 { 66 if (isArrayIndex()) 67 return true; 68 if (isSymbol()) 69 return false; 70 Heap::String *s = static_cast<Heap::String *>(asStringOrSymbol()); 71 Scope scope(s->internalClass->engine); 72 ScopedString str(scope, s); 73 double d = str->toNumber(); 74 if (d == 0. && std::signbit(d)) 75 return true; 76 ScopedString converted(scope, Value::fromDouble(d).toString(scope.engine)); 77 if (converted->equals(str)) 78 return true; 79 return false; 80 } 81 toQString() const82QString QV4::PropertyKey::toQString() const 83 { 84 if (isArrayIndex()) 85 return QString::number(asArrayIndex()); 86 Heap::StringOrSymbol *s = asStringOrSymbol(); 87 Q_ASSERT(s->internalClass->vtable->isStringOrSymbol); 88 return s->toQString(); 89 } 90 asFunctionName(ExecutionEngine * engine,FunctionNamePrefix prefix) const91QV4::Heap::String *QV4::PropertyKey::asFunctionName(ExecutionEngine *engine, FunctionNamePrefix prefix) const 92 { 93 QString n; 94 if (prefix == Getter) 95 n = QStringLiteral("get "); 96 else if (prefix == Setter) 97 n = QStringLiteral("set "); 98 if (isArrayIndex()) 99 n += QString::number(asArrayIndex()); 100 else { 101 Heap::StringOrSymbol *s = asStringOrSymbol(); 102 QString str = s->toQString(); 103 if (s->internalClass->vtable->isString) 104 n += s->toQString(); 105 else if (str.length() > 1) 106 n += QChar::fromLatin1('[') + str.midRef(1) + QChar::fromLatin1(']'); 107 } 108 return engine->newString(n); 109 } 110