From e37a9eb4a47eb3e5cb9f4dedccec6b69e8509625 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 24 Jan 2014 15:07:34 +0100 Subject: [PATCH] Rename some files Rename qv4value_def_p.h -> qv4value_p.h and qv4value_p.h to qv4value_inl_p.h. It makes more sense to have the class definition in the file that is named after the class and move the inline methods into a _inl file. Doing this now, as I expect we'll be needing a few more _inl files soon. Change-Id: Ib59e9380e9e976254c6b4369574157f39b1b5f51 Reviewed-by: Simon Hausmann --- src/imports/xmllistmodel/qqmlxmllistmodel.cpp | 2 +- src/particles/qquickv4particledata_p.h | 2 +- src/qml/compiler/qv4compileddata_p.h | 2 +- src/qml/compiler/qv4instr_moth_p.h | 2 +- src/qml/compiler/qv4isel_masm_p.h | 2 +- src/qml/compiler/qv4isel_moth_p.h | 2 +- src/qml/compiler/qv4isel_util_p.h | 2 +- src/qml/compiler/qv4regalloc.cpp | 2 +- src/qml/jsapi/qjsvalue.cpp | 2 +- src/qml/jsapi/qjsvalue_p.h | 2 +- src/qml/jsruntime/jsruntime.pri | 2 +- src/qml/jsruntime/qv4context_p.h | 2 +- src/qml/jsruntime/qv4engine.cpp | 2 +- src/qml/jsruntime/qv4function.cpp | 2 +- src/qml/jsruntime/qv4function_p.h | 2 +- src/qml/jsruntime/qv4globalobject.cpp | 2 +- src/qml/jsruntime/qv4include_p.h | 2 +- src/qml/jsruntime/qv4managed_p.h | 2 +- src/qml/jsruntime/qv4mm_p.h | 2 +- src/qml/jsruntime/qv4property_p.h | 2 +- src/qml/jsruntime/qv4qobjectwrapper_p.h | 2 +- src/qml/jsruntime/qv4runtime_p.h | 2 +- src/qml/jsruntime/qv4scopedvalue_p.h | 2 +- src/qml/jsruntime/qv4sequenceobject_p.h | 2 +- src/qml/jsruntime/qv4serialize.cpp | 2 +- src/qml/jsruntime/qv4serialize_p.h | 2 +- src/qml/jsruntime/qv4sparsearray_p.h | 2 +- src/qml/jsruntime/qv4value_def_p.h | 476 ------------- src/qml/jsruntime/qv4value_inl_p.h | 397 +++++++++++ src/qml/jsruntime/qv4value_p.h | 647 ++++++++++-------- src/qml/jsruntime/qv4variantobject_p.h | 2 +- src/qml/jsruntime/qv4vme_moth.cpp | 2 +- src/qml/qml/qqmlboundsignal.cpp | 2 +- src/qml/qml/qqmlcontextwrapper.cpp | 2 +- src/qml/qml/qqmlcontextwrapper_p.h | 2 +- src/qml/qml/qqmldata_p.h | 2 +- src/qml/qml/qqmljavascriptexpression.cpp | 2 +- src/qml/qml/qqmllistwrapper_p.h | 2 +- src/qml/qml/qqmlpropertycache.cpp | 2 +- src/qml/qml/qqmlpropertycache_p.h | 2 +- src/qml/qml/qqmltypeloader_p.h | 2 +- src/qml/qml/qqmltypewrapper_p.h | 2 +- src/qml/qml/qqmlvaluetypewrapper_p.h | 2 +- src/qml/qml/qqmlvmemetaobject_p.h | 2 +- src/qml/qml/v8/qv8engine.cpp | 2 +- src/qml/qml/v8/qv8engine_p.h | 2 +- src/qml/types/qqmldelegatemodel.cpp | 2 +- src/qml/types/qquickworkerscript.cpp | 2 +- src/qml/util/qqmladaptormodel.cpp | 2 +- .../items/context2d/qquickcanvasitem.cpp | 2 +- src/quick/items/context2d/qquickcontext2d.cpp | 2 +- src/quick/items/context2d/qquickcontext2d_p.h | 2 +- src/quick/items/qquickloader_p_p.h | 2 +- 53 files changed, 810 insertions(+), 810 deletions(-) delete mode 100644 src/qml/jsruntime/qv4value_def_p.h create mode 100644 src/qml/jsruntime/qv4value_inl_p.h diff --git a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp index ebfdad5cb..0b9be3105 100644 --- a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp +++ b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/particles/qquickv4particledata_p.h b/src/particles/qquickv4particledata_p.h index b3614f94f..10e9ecacc 100644 --- a/src/particles/qquickv4particledata_p.h +++ b/src/particles/qquickv4particledata_p.h @@ -44,7 +44,7 @@ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 451bf4216..385a650d8 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -45,7 +45,7 @@ #include #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h index a2cc05100..e010e6e90 100644 --- a/src/qml/compiler/qv4instr_moth_p.h +++ b/src/qml/compiler/qv4instr_moth_p.h @@ -43,7 +43,7 @@ #define QV4INSTR_MOTH_P_H #include -#include +#include #include #include diff --git a/src/qml/compiler/qv4isel_masm_p.h b/src/qml/compiler/qv4isel_masm_p.h index f22e0930e..eb4a2b9cb 100644 --- a/src/qml/compiler/qv4isel_masm_p.h +++ b/src/qml/compiler/qv4isel_masm_p.h @@ -45,7 +45,7 @@ #include "qv4jsir_p.h" #include "qv4isel_p.h" #include "qv4isel_util_p.h" -#include "private/qv4value_def_p.h" +#include "private/qv4value_p.h" #include "private/qv4lookup_p.h" #include diff --git a/src/qml/compiler/qv4isel_moth_p.h b/src/qml/compiler/qv4isel_moth_p.h index d8a85ff24..65c706a7b 100644 --- a/src/qml/compiler/qv4isel_moth_p.h +++ b/src/qml/compiler/qv4isel_moth_p.h @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include "qv4instr_moth_p.h" QT_BEGIN_NAMESPACE diff --git a/src/qml/compiler/qv4isel_util_p.h b/src/qml/compiler/qv4isel_util_p.h index 38ea682d3..1d7a99941 100644 --- a/src/qml/compiler/qv4isel_util_p.h +++ b/src/qml/compiler/qv4isel_util_p.h @@ -42,7 +42,7 @@ #ifndef QV4ISEL_UTIL_P_H #define QV4ISEL_UTIL_P_H -#include "private/qv4value_def_p.h" +#include "private/qv4value_p.h" #include "qv4jsir_p.h" QT_BEGIN_NAMESPACE diff --git a/src/qml/compiler/qv4regalloc.cpp b/src/qml/compiler/qv4regalloc.cpp index 2f1f64e52..bc88d5849 100644 --- a/src/qml/compiler/qv4regalloc.cpp +++ b/src/qml/compiler/qv4regalloc.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include "qv4regalloc_p.h" -#include +#include #include diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index c8de31ef7..38a8e40cb 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -45,7 +45,7 @@ #include "qjsengine.h" #include "qjsvalue.h" #include "qjsvalue_p.h" -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4object_p.h" #include "qv4functionobject_p.h" #include "qv4dateobject_p.h" diff --git a/src/qml/jsapi/qjsvalue_p.h b/src/qml/jsapi/qjsvalue_p.h index d8da664cc..41856b1e9 100644 --- a/src/qml/jsapi/qjsvalue_p.h +++ b/src/qml/jsapi/qjsvalue_p.h @@ -55,7 +55,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/jsruntime/jsruntime.pri b/src/qml/jsruntime/jsruntime.pri index a90cea96c..6afcc77f4 100644 --- a/src/qml/jsruntime/jsruntime.pri +++ b/src/qml/jsruntime/jsruntime.pri @@ -49,8 +49,8 @@ HEADERS += \ $$PWD/qv4context_p.h \ $$PWD/qv4runtime_p.h \ $$PWD/qv4math_p.h \ + $$PWD/qv4value_inl_p.h \ $$PWD/qv4value_p.h \ - $$PWD/qv4value_def_p.h \ $$PWD/qv4debugging_p.h \ $$PWD/qv4lookup_p.h \ $$PWD/qv4identifier_p.h \ diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h index b794c2858..2d782f9a3 100644 --- a/src/qml/jsruntime/qv4context_p.h +++ b/src/qml/jsruntime/qv4context_p.h @@ -42,7 +42,7 @@ #define QMLJS_ENVIRONMENT_H #include "qv4global_p.h" -#include "qv4value_def_p.h" +#include "qv4value_p.h" #include "qv4managed_p.h" #include "qv4engine_p.h" diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 093fe96dd..66216e6d8 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include #include -#include +#include #include #include #include diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp index 0e90e213c..811b445f9 100644 --- a/src/qml/jsruntime/qv4function.cpp +++ b/src/qml/jsruntime/qv4function.cpp @@ -42,7 +42,7 @@ #include "qv4function_p.h" #include "qv4managed_p.h" #include "qv4string_p.h" -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4engine_p.h" #include "qv4lookup_p.h" diff --git a/src/qml/jsruntime/qv4function_p.h b/src/qml/jsruntime/qv4function_p.h index 8d07853b4..8a14665e4 100644 --- a/src/qml/jsruntime/qv4function_p.h +++ b/src/qml/jsruntime/qv4function_p.h @@ -47,7 +47,7 @@ #include #include -#include "qv4value_def_p.h" +#include "qv4value_p.h" #include #include diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp index 224d38361..76a8b0c25 100644 --- a/src/qml/jsruntime/qv4globalobject.cpp +++ b/src/qml/jsruntime/qv4globalobject.cpp @@ -41,7 +41,7 @@ #include "qv4globalobject_p.h" #include "qv4mm_p.h" -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4context_p.h" #include "qv4function_p.h" #include "qv4debugging_p.h" diff --git a/src/qml/jsruntime/qv4include_p.h b/src/qml/jsruntime/qv4include_p.h index c4c72f3a8..d1cadb3aa 100644 --- a/src/qml/jsruntime/qv4include_p.h +++ b/src/qml/jsruntime/qv4include_p.h @@ -58,7 +58,7 @@ #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index da2aab627..fa78ce5a6 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -45,7 +45,7 @@ #include #include #include "qv4global_p.h" -#include "qv4value_def_p.h" +#include "qv4value_p.h" #include "qv4internalclass_p.h" QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4mm_p.h b/src/qml/jsruntime/qv4mm_p.h index 7d2831953..a8fd58533 100644 --- a/src/qml/jsruntime/qv4mm_p.h +++ b/src/qml/jsruntime/qv4mm_p.h @@ -44,7 +44,7 @@ #include "qv4global_p.h" #include "qv4context_p.h" -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include diff --git a/src/qml/jsruntime/qv4property_p.h b/src/qml/jsruntime/qv4property_p.h index 6381fe768..bc2b961d2 100644 --- a/src/qml/jsruntime/qv4property_p.h +++ b/src/qml/jsruntime/qv4property_p.h @@ -42,7 +42,7 @@ #define QV4PROPERTYDESCRIPTOR_H #include "qv4global_p.h" -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4internalclass_p.h" QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h index f6d1ac079..75cfa26cd 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper_p.h +++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h @@ -62,7 +62,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h index 2e252b106..4437198a7 100644 --- a/src/qml/jsruntime/qv4runtime_p.h +++ b/src/qml/jsruntime/qv4runtime_p.h @@ -42,7 +42,7 @@ #define QMLJS_RUNTIME_H #include "qv4global_p.h" -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4math_p.h" #include "qv4scopedvalue_p.h" diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index 2c71a36a3..38431d2c4 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -42,7 +42,7 @@ #define QV4SCOPEDVALUE_P_H #include "qv4context_p.h" -#include "qv4value_def_p.h" +#include "qv4value_p.h" QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4sequenceobject_p.h b/src/qml/jsruntime/qv4sequenceobject_p.h index 54a96863d..4a5e82b68 100644 --- a/src/qml/jsruntime/qv4sequenceobject_p.h +++ b/src/qml/jsruntime/qv4sequenceobject_p.h @@ -56,7 +56,7 @@ #include #include -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4object_p.h" QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4serialize.cpp b/src/qml/jsruntime/qv4serialize.cpp index 50899c389..3d754389a 100644 --- a/src/qml/jsruntime/qv4serialize.cpp +++ b/src/qml/jsruntime/qv4serialize.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/jsruntime/qv4serialize_p.h b/src/qml/jsruntime/qv4serialize_p.h index a9f40e43c..5ab8ae925 100644 --- a/src/qml/jsruntime/qv4serialize_p.h +++ b/src/qml/jsruntime/qv4serialize_p.h @@ -54,7 +54,7 @@ // #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4sparsearray_p.h b/src/qml/jsruntime/qv4sparsearray_p.h index 6c2808b6b..648fc9ac7 100644 --- a/src/qml/jsruntime/qv4sparsearray_p.h +++ b/src/qml/jsruntime/qv4sparsearray_p.h @@ -44,7 +44,7 @@ #include "qv4global_p.h" #include -#include "qv4value_p.h" +#include "qv4value_inl_p.h" #include "qv4scopedvalue_p.h" #include "qv4property_p.h" #include diff --git a/src/qml/jsruntime/qv4value_def_p.h b/src/qml/jsruntime/qv4value_def_p.h deleted file mode 100644 index cf351c125..000000000 --- a/src/qml/jsruntime/qv4value_def_p.h +++ /dev/null @@ -1,476 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef QV4VALUE_DEF_P_H -#define QV4VALUE_DEF_P_H - -#include -#include "qv4global_p.h" - -QT_BEGIN_NAMESPACE - -namespace QV4 { - -typedef uint Bool; - -template -struct Returned : private T -{ - static Returned *create(T *t) { return static_cast *>(t); } - T *getPointer() { return this; } - template - static T *getPointer(Returned *x) { return x->getPointer(); } - template - Returned *as() { return Returned::create(Returned::getPointer(this)); } - using T::asReturnedValue; -}; - -struct Q_QML_EXPORT Value -{ - /* - We use two different ways of encoding JS values. One for 32bit and one for 64bit systems. - - In both cases, we 8 bytes for a value and different variant of NaN boxing. A Double NaN (actually -qNaN) - is indicated by a number that has the top 13 bits set. THe other values are usually set to 0 by the - processor, and are thus free for us to store other data. We keep pointers in there for managed objects, - and encode the other types using the free space given to use by the unused bits for NaN values. This also - works for pointers on 64 bit systems, as they all currently only have 48 bits of addressable memory. - - On 32bit, we store doubles as doubles. All other values, have the high 32bits set to a value that - will make the number a NaN. The Masks below are used for encoding the other types. - - On 64 bit, we xor Doubles with (0xffff8000 << 32). Thas has the effect that no doubles will get encoded - with the 13 highest bits all 0. We are now using special values for bits 14-17 to encode our values. These - can be used, as the highest valid pointer on a 64 bit system is 2^48-1. - - If they are all 0, we have a pointer to a Managed object. If bit 14 is set we have an integer. - This makes testing for pointers and numbers very fast (we have a number if any of the highest 14 bits is set). - - Bit 15-17 is then used to encode other immediates. - */ - - - union { - quint64 val; -#if QT_POINTER_SIZE == 8 - Managed *m; - Object *o; - String *s; -#else - double dbl; -#endif - struct { -#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN - uint tag; -#endif - union { - uint uint_32; - int int_32; -#if QT_POINTER_SIZE == 4 - Managed *m; - Object *o; - String *s; -#endif - }; -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - uint tag; -#endif - }; - }; - -#if QT_POINTER_SIZE == 4 - enum Masks { - NaN_Mask = 0x7ff80000, - NotDouble_Mask = 0x7ffc0000, - Type_Mask = 0xffff8000, - Immediate_Mask = NotDouble_Mask | 0x00008000, - IsNullOrUndefined_Mask = Immediate_Mask | 0x20000, - Tag_Shift = 32 - }; - enum ValueType { - Undefined_Type = Immediate_Mask | 0x00000, - Null_Type = Immediate_Mask | 0x10000, - Boolean_Type = Immediate_Mask | 0x20000, - Integer_Type = Immediate_Mask | 0x30000, - Managed_Type = NotDouble_Mask | 0x00000, - Empty_Type = NotDouble_Mask | 0x30000 - }; - - enum ImmediateFlags { - ConvertibleToInt = Immediate_Mask | 0x1 - }; - - enum ValueTypeInternal { - _Null_Type = Null_Type | ConvertibleToInt, - _Boolean_Type = Boolean_Type | ConvertibleToInt, - _Integer_Type = Integer_Type | ConvertibleToInt, - - }; -#else - static const quint64 NaNEncodeMask = 0xffff800000000000ll; - static const quint64 IsInt32Mask = 0x0002000000000000ll; - static const quint64 IsDoubleMask = 0xfffc000000000000ll; - static const quint64 IsNumberMask = IsInt32Mask|IsDoubleMask; - static const quint64 IsNullOrUndefinedMask = 0x0000800000000000ll; - static const quint64 IsNullOrBooleanMask = 0x0001000000000000ll; - static const quint64 IsConvertibleToIntMask = IsInt32Mask|IsNullOrBooleanMask; - - enum Masks { - NaN_Mask = 0x7ff80000, - Type_Mask = 0xffff8000, - IsDouble_Mask = 0xfffc0000, - Immediate_Mask = 0x00018000, - IsNullOrUndefined_Mask = 0x00008000, - IsNullOrBoolean_Mask = 0x00010000, - Tag_Shift = 32 - }; - enum ValueType { - Undefined_Type = IsNullOrUndefined_Mask, - Null_Type = IsNullOrUndefined_Mask|IsNullOrBoolean_Mask, - Boolean_Type = IsNullOrBoolean_Mask, - Integer_Type = 0x20000|IsNullOrBoolean_Mask, - Managed_Type = 0, - Empty_Type = Undefined_Type | 0x4000 - }; - enum { - IsDouble_Shift = 64-14, - IsNumber_Shift = 64-15, - IsConvertibleToInt_Shift = 64-16, - IsManaged_Shift = 64-17 - }; - - - enum ValueTypeInternal { - _Null_Type = Null_Type, - _Boolean_Type = Boolean_Type, - _Integer_Type = Integer_Type - }; -#endif - - inline unsigned type() const { - return tag & Type_Mask; - } - - // used internally in property - inline bool isEmpty() const { return tag == Empty_Type; } - - inline bool isUndefined() const { return tag == Undefined_Type; } - inline bool isNull() const { return tag == _Null_Type; } - inline bool isBoolean() const { return tag == _Boolean_Type; } -#if QT_POINTER_SIZE == 8 - inline bool isInteger() const { return (val >> IsNumber_Shift) == 1; } - inline bool isDouble() const { return (val >> IsDouble_Shift); } - inline bool isNumber() const { return (val >> IsNumber_Shift); } - inline bool isManaged() const { return !(val >> IsManaged_Shift); } - inline bool isNullOrUndefined() const { return ((val >> IsManaged_Shift) & ~2) == 1; } - inline bool integerCompatible() const { return ((val >> IsConvertibleToInt_Shift) & ~2) == 1; } - static inline bool integerCompatible(Value a, Value b) { - return a.integerCompatible() && b.integerCompatible(); - } - static inline bool bothDouble(Value a, Value b) { - return a.isDouble() && b.isDouble(); - } - double doubleValue() const { - Q_ASSERT(isDouble()); - union { - quint64 i; - double d; - } v; - v.i = val ^ NaNEncodeMask; - return v.d; - } - void setDouble(double d) { - union { - quint64 i; - double d; - } v; - v.d = d; - val = v.i ^ NaNEncodeMask; - Q_ASSERT(isDouble()); - } - bool isNaN() const { return (tag & 0x7fff8000) == 0x00078000; } -#else - inline bool isInteger() const { return tag == _Integer_Type; } - inline bool isDouble() const { return (tag & NotDouble_Mask) != NotDouble_Mask; } - inline bool isNumber() const { return tag == _Integer_Type || (tag & NotDouble_Mask) != NotDouble_Mask; } - inline bool isManaged() const { return tag == Managed_Type; } - inline bool isNullOrUndefined() const { return (tag & IsNullOrUndefined_Mask) == Undefined_Type; } - inline bool integerCompatible() const { return (tag & ConvertibleToInt) == ConvertibleToInt; } - static inline bool integerCompatible(Value a, Value b) { - return ((a.tag & b.tag) & ConvertibleToInt) == ConvertibleToInt; - } - static inline bool bothDouble(Value a, Value b) { - return ((a.tag | b.tag) & NotDouble_Mask) != NotDouble_Mask; - } - double doubleValue() const { return dbl; } - void setDouble(double d) { dbl = d; } - bool isNaN() const { return (tag & QV4::Value::NotDouble_Mask) == QV4::Value::NaN_Mask; } -#endif - inline bool isString() const; - inline bool isObject() const; - inline bool isInt32() { - if (tag == _Integer_Type) - return true; - if (isDouble()) { - double d = doubleValue(); - int i = (int)d; - if (i == d) { - int_32 = i; - tag = _Integer_Type; - return true; - } - } - return false; - } - double asDouble() const { - if (tag == _Integer_Type) - return int_32; - return doubleValue(); - } - - bool booleanValue() const { - return int_32; - } - int integerValue() const { - return int_32; - } - - String *stringValue() const { - return s; - } - Object *objectValue() const { - return o; - } - Managed *managed() const { - return m; - } - - quint64 rawValue() const { - return val; - } - - static inline Value fromManaged(Managed *o); - - int toUInt16() const; - inline int toInt32() const; - inline unsigned int toUInt32() const; - - inline bool toBoolean() const; - double toInteger() const; - inline double toNumber() const; - double toNumberImpl() const; - QString toQStringNoThrow() const; - QString toQString() const; - String *toString(ExecutionContext *ctx) const; - Object *toObject(ExecutionContext *ctx) const; - - inline bool isPrimitive() const; - inline bool tryIntegerConversion() { - bool b = integerCompatible(); - if (b) - tag = _Integer_Type; - return b; - } - - inline String *asString() const; - inline Managed *asManaged() const; - inline Object *asObject() const; - inline FunctionObject *asFunctionObject() const; - inline NumberObject *asNumberObject() const; - inline StringObject *asStringObject() const; - inline DateObject *asDateObject() const; - inline ArrayObject *asArrayObject() const; - inline ErrorObject *asErrorObject() const; - - template inline T *as() const; - - inline uint asArrayIndex() const; - inline uint asArrayLength(bool *ok) const; - - inline ExecutionEngine *engine() const; - - ReturnedValue asReturnedValue() const { return val; } - static Value fromReturnedValue(ReturnedValue val) { Value v; v.val = val; return v; } - Value &operator=(ReturnedValue v) { val = v; return *this; } - template - inline Value &operator=(Returned *t); - - // Section 9.12 - bool sameValue(Value other) const; - - inline void mark(ExecutionEngine *e) const; -}; - -inline Managed *Value::asManaged() const -{ - if (isManaged()) - return managed(); - return 0; -} - -inline String *Value::asString() const -{ - if (isString()) - return stringValue(); - return 0; -} - -struct Q_QML_EXPORT Primitive : public Value -{ - inline static Primitive emptyValue(); - static inline Primitive fromBoolean(bool b); - static inline Primitive fromInt32(int i); - inline static Primitive undefinedValue(); - static inline Primitive nullValue(); - static inline Primitive fromDouble(double d); - static inline Primitive fromUInt32(uint i); - - static double toInteger(double fromNumber); - static int toInt32(double value); - static unsigned int toUInt32(double value); - - inline operator ValueRef(); - Value asValue() const { return *this; } -}; - -inline Primitive Primitive::undefinedValue() -{ - Primitive v; -#if QT_POINTER_SIZE == 8 - v.val = quint64(Undefined_Type) << Tag_Shift; -#else - v.tag = Undefined_Type; - v.int_32 = 0; -#endif - return v; -} - -inline Primitive Primitive::emptyValue() -{ - Primitive v; - v.tag = Value::Empty_Type; - v.uint_32 = 0; - return v; -} - -inline Value Value::fromManaged(Managed *m) -{ - if (!m) - return QV4::Primitive::undefinedValue(); - Value v; -#if QT_POINTER_SIZE == 8 - v.m = m; -#else - v.tag = Managed_Type; - v.m = m; -#endif - return v; -} - -struct SafeValue : public Value -{ - SafeValue &operator =(const ScopedValue &v); - template - SafeValue &operator=(Returned *t); - SafeValue &operator=(ReturnedValue v) { - val = v; - return *this; - } - template - SafeValue &operator=(T *t) { - val = Value::fromManaged(t).val; - return *this; - } - - template - SafeValue &operator=(const Scoped &t); - SafeValue &operator=(const ValueRef v); - SafeValue &operator=(const Value &v) { - val = v.val; - return *this; - } - template - inline Returned *as(); - template - inline Referenced asRef(); -}; - -template -struct Safe : public SafeValue -{ - template - Safe &operator =(X *x) { - val = Value::fromManaged(x).val; - } - Safe &operator =(T *t); - Safe &operator =(const Scoped &v); - Safe &operator =(const Referenced &v); - Safe &operator =(Returned *t); - - Safe &operator =(const Safe &t); - - bool operator!() const { return !managed(); } - - T *operator->() { return static_cast(managed()); } - const T *operator->() const { return static_cast(managed()); } - T *getPointer() const { return static_cast(managed()); } - Returned *ret() const; - - void mark(ExecutionEngine *e) { if (managed()) managed()->mark(e); } -}; -typedef Safe SafeString; -typedef Safe SafeObject; - -template -T *value_cast(const Value &v) -{ - return v.as(); -} - -template -ReturnedValue value_convert(ExecutionContext *ctx, const Value &v); - - - -} - -QT_END_NAMESPACE - -#endif // QV4VALUE_DEF_P_H diff --git a/src/qml/jsruntime/qv4value_inl_p.h b/src/qml/jsruntime/qv4value_inl_p.h new file mode 100644 index 000000000..2618ef3fa --- /dev/null +++ b/src/qml/jsruntime/qv4value_inl_p.h @@ -0,0 +1,397 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QV4VALUE_INL_H +#define QV4VALUE_INL_H + +#include // this HAS to come + +#include +#include +#include "qv4global_p.h" +#include "qv4string_p.h" +#include +#include "qv4managed_p.h" +#include "qv4engine_p.h" +#include + +//#include + +#include "qv4value_p.h" + +QT_BEGIN_NAMESPACE + +namespace QV4 { + +inline bool Value::isString() const +{ + if (!isManaged()) + return false; + return managed() && managed()->internalClass->vtable->isString; +} +inline bool Value::isObject() const +{ + if (!isManaged()) + return false; + return managed() && managed()->internalClass->vtable->isObject; +} + +inline bool Value::isPrimitive() const +{ + return !isObject(); +} + +inline ExecutionEngine *Value::engine() const +{ + Managed *m = asManaged(); + return m ? m->engine() : 0; +} + +inline void Value::mark(ExecutionEngine *e) const +{ + if (!val) + return; + Managed *m = asManaged(); + if (m) + m->mark(e); +} + +inline Primitive Primitive::nullValue() +{ + Primitive v; +#if QT_POINTER_SIZE == 8 + v.val = quint64(_Null_Type) << Tag_Shift; +#else + v.tag = _Null_Type; + v.int_32 = 0; +#endif + return v; +} + +inline Primitive Primitive::fromBoolean(bool b) +{ + Primitive v; + v.tag = _Boolean_Type; + v.int_32 = (bool)b; + return v; +} + +inline Primitive Primitive::fromDouble(double d) +{ + Primitive v; + v.setDouble(d); + return v; +} + +inline Primitive Primitive::fromInt32(int i) +{ + Primitive v; + v.tag = _Integer_Type; + v.int_32 = i; + return v; +} + +inline Primitive Primitive::fromUInt32(uint i) +{ + Primitive v; + if (i < INT_MAX) { + v.tag = _Integer_Type; + v.int_32 = (int)i; + } else { + v.setDouble(i); + } + return v; +} + +inline double Value::toNumber() const +{ + if (integerCompatible()) + return int_32; + if (isDouble()) + return doubleValue(); + return toNumberImpl(); +} + +inline int Value::toInt32() const +{ + if (integerCompatible()) + return int_32; + double d; + if (isDouble()) + d = doubleValue(); + else + d = toNumberImpl(); + + const double D32 = 4294967296.0; + const double D31 = D32 / 2.0; + + if ((d >= -D31 && d < D31)) + return static_cast(d); + + return Primitive::toInt32(d); +} + +inline unsigned int Value::toUInt32() const +{ + return (unsigned int)toInt32(); +} + + +inline bool Value::toBoolean() const +{ + switch (type()) { + case Value::Undefined_Type: + case Value::Null_Type: + return false; + case Value::Boolean_Type: + case Value::Integer_Type: + return (bool)int_32; + case Value::Managed_Type: + if (isString()) + return stringValue()->toQString().length() > 0; + return true; + default: // double + return doubleValue() && !std::isnan(doubleValue()); + } +} + +inline uint Value::asArrayIndex() const +{ +#if QT_POINTER_SIZE == 8 + if (!isNumber()) + return UINT_MAX; + if (isInteger()) + return int_32 >= 0 ? (uint)int_32 : UINT_MAX; +#else + if (isInteger() && int_32 >= 0) + return (uint)int_32; + if (!isDouble()) + return UINT_MAX; +#endif + double d = doubleValue(); + uint idx = (uint)d; + if (idx != d) + return UINT_MAX; + return idx; +} + +inline uint Value::asArrayLength(bool *ok) const +{ + *ok = true; + if (integerCompatible() && int_32 >= 0) + return (uint)int_32; + if (isDouble()) { + double d = doubleValue(); + uint idx = (uint)d; + if (idx != d) { + *ok = false; + return UINT_MAX; + } + return idx; + } + if (isString()) + return stringValue()->toUInt(ok); + + uint idx = toUInt32(); + double d = toNumber(); + if (d != idx) { + *ok = false; + return UINT_MAX; + } + return idx; +} + +inline Object *Value::asObject() const +{ + return isObject() ? objectValue() : 0; +} + +inline FunctionObject *Value::asFunctionObject() const +{ + return isObject() ? managed()->asFunctionObject() : 0; +} + +inline NumberObject *Value::asNumberObject() const +{ + return isObject() ? managed()->asNumberObject() : 0; +} + +inline StringObject *Value::asStringObject() const +{ + return isObject() ? managed()->asStringObject() : 0; +} + +inline DateObject *Value::asDateObject() const +{ + return isObject() ? managed()->asDateObject() : 0; +} + +inline ArrayObject *Value::asArrayObject() const +{ + return isObject() ? managed()->asArrayObject() : 0; +} + +inline ErrorObject *Value::asErrorObject() const +{ + return isObject() ? managed()->asErrorObject() : 0; +} + +template +inline T *Value::as() const { Managed *m = isObject() ? managed() : 0; return m ? m->as() : 0; } + +struct Q_QML_PRIVATE_EXPORT PersistentValuePrivate +{ + PersistentValuePrivate(ReturnedValue v, ExecutionEngine *engine = 0, bool weak = false); + virtual ~PersistentValuePrivate(); + SafeValue value; + uint refcount; + bool weak; + QV4::ExecutionEngine *engine; + PersistentValuePrivate **prev; + PersistentValuePrivate *next; + + void init(); + void removeFromList(); + void ref() { ++refcount; } + void deref(); + PersistentValuePrivate *detach(const ReturnedValue value, bool weak = false); + + bool checkEngine(QV4::ExecutionEngine *otherEngine) { + if (!engine) { + Q_ASSERT(!value.isObject()); + engine = otherEngine; + } + return (engine == otherEngine); + } +}; + +class Q_QML_EXPORT PersistentValue +{ +public: + PersistentValue() : d(0) {} + PersistentValue(const PersistentValue &other); + PersistentValue &operator=(const PersistentValue &other); + + PersistentValue(const ValueRef val); + PersistentValue(ReturnedValue val); + template + PersistentValue(Returned *obj); + template + PersistentValue(const Referenced obj); + PersistentValue &operator=(const ValueRef other); + PersistentValue &operator =(ReturnedValue other); + template + PersistentValue &operator=(Returned *obj); + template + PersistentValue &operator=(const Referenced obj); + ~PersistentValue(); + + ReturnedValue value() const { + return (d ? d->value.asReturnedValue() : Primitive::undefinedValue().asReturnedValue()); + } + + ExecutionEngine *engine() { + if (!d) + return 0; + if (d->engine) + return d->engine; + Managed *m = d->value.asManaged(); + return m ? m->engine() : 0; + } + + bool isUndefined() const { return !d || d->value.isUndefined(); } + bool isNullOrUndefined() const { return !d || d->value.isNullOrUndefined(); } + void clear() { + *this = PersistentValue(); + } + +private: + friend struct ValueRef; + PersistentValuePrivate *d; +}; + +class Q_QML_EXPORT WeakValue +{ +public: + WeakValue() : d(0) {} + WeakValue(const ValueRef val); + WeakValue(const WeakValue &other); + WeakValue(ReturnedValue val); + template + WeakValue(Returned *obj); + WeakValue &operator=(const WeakValue &other); + WeakValue &operator=(const ValueRef other); + WeakValue &operator =(const ReturnedValue &other); + template + WeakValue &operator=(Returned *obj); + + ~WeakValue(); + + ReturnedValue value() const { + return (d ? d->value.asReturnedValue() : Primitive::undefinedValue().asReturnedValue()); + } + + ExecutionEngine *engine() { + if (!d) + return 0; + if (d->engine) + return d->engine; + Managed *m = d->value.asManaged(); + return m ? m->engine() : 0; + } + + bool isUndefined() const { return !d || d->value.isUndefined(); } + bool isNullOrUndefined() const { return !d || d->value.isNullOrUndefined(); } + void clear() { + *this = WeakValue(); + } + + void markOnce(ExecutionEngine *e); + +private: + friend struct ValueRef; + PersistentValuePrivate *d; +}; + +} // namespace QV4 + +QT_END_NAMESPACE + +#endif diff --git a/src/qml/jsruntime/qv4value_p.h b/src/qml/jsruntime/qv4value_p.h index b93fcbe4b..4b1611417 100644 --- a/src/qml/jsruntime/qv4value_p.h +++ b/src/qml/jsruntime/qv4value_p.h @@ -38,360 +38,439 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef QMLJS_VALUE_H -#define QMLJS_VALUE_H - -#include // this HAS to come +#ifndef QV4VALUE_P_H +#define QV4VALUE_P_H #include -#include #include "qv4global_p.h" -#include "qv4string_p.h" -#include -#include "qv4managed_p.h" -#include "qv4engine_p.h" -#include - -//#include - -#include "qv4value_def_p.h" QT_BEGIN_NAMESPACE namespace QV4 { -inline bool Value::isString() const -{ - if (!isManaged()) - return false; - return managed() && managed()->internalClass->vtable->isString; -} -inline bool Value::isObject() const -{ - if (!isManaged()) - return false; - return managed() && managed()->internalClass->vtable->isObject; -} +typedef uint Bool; -inline bool Value::isPrimitive() const +template +struct Returned : private T { - return !isObject(); -} + static Returned *create(T *t) { return static_cast *>(t); } + T *getPointer() { return this; } + template + static T *getPointer(Returned *x) { return x->getPointer(); } + template + Returned *as() { return Returned::create(Returned::getPointer(this)); } + using T::asReturnedValue; +}; -inline ExecutionEngine *Value::engine() const +struct Q_QML_EXPORT Value { - Managed *m = asManaged(); - return m ? m->engine() : 0; -} + /* + We use two different ways of encoding JS values. One for 32bit and one for 64bit systems. -inline void Value::mark(ExecutionEngine *e) const -{ - if (!val) - return; - Managed *m = asManaged(); - if (m) - m->mark(e); -} + In both cases, we 8 bytes for a value and different variant of NaN boxing. A Double NaN (actually -qNaN) + is indicated by a number that has the top 13 bits set. THe other values are usually set to 0 by the + processor, and are thus free for us to store other data. We keep pointers in there for managed objects, + and encode the other types using the free space given to use by the unused bits for NaN values. This also + works for pointers on 64 bit systems, as they all currently only have 48 bits of addressable memory. -inline Primitive Primitive::nullValue() -{ - Primitive v; + On 32bit, we store doubles as doubles. All other values, have the high 32bits set to a value that + will make the number a NaN. The Masks below are used for encoding the other types. + + On 64 bit, we xor Doubles with (0xffff8000 << 32). Thas has the effect that no doubles will get encoded + with the 13 highest bits all 0. We are now using special values for bits 14-17 to encode our values. These + can be used, as the highest valid pointer on a 64 bit system is 2^48-1. + + If they are all 0, we have a pointer to a Managed object. If bit 14 is set we have an integer. + This makes testing for pointers and numbers very fast (we have a number if any of the highest 14 bits is set). + + Bit 15-17 is then used to encode other immediates. + */ + + + union { + quint64 val; #if QT_POINTER_SIZE == 8 - v.val = quint64(_Null_Type) << Tag_Shift; + Managed *m; + Object *o; + String *s; #else - v.tag = _Null_Type; - v.int_32 = 0; + double dbl; +#endif + struct { +#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN + uint tag; +#endif + union { + uint uint_32; + int int_32; +#if QT_POINTER_SIZE == 4 + Managed *m; + Object *o; + String *s; +#endif + }; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + uint tag; +#endif + }; + }; + +#if QT_POINTER_SIZE == 4 + enum Masks { + NaN_Mask = 0x7ff80000, + NotDouble_Mask = 0x7ffc0000, + Type_Mask = 0xffff8000, + Immediate_Mask = NotDouble_Mask | 0x00008000, + IsNullOrUndefined_Mask = Immediate_Mask | 0x20000, + Tag_Shift = 32 + }; + enum ValueType { + Undefined_Type = Immediate_Mask | 0x00000, + Null_Type = Immediate_Mask | 0x10000, + Boolean_Type = Immediate_Mask | 0x20000, + Integer_Type = Immediate_Mask | 0x30000, + Managed_Type = NotDouble_Mask | 0x00000, + Empty_Type = NotDouble_Mask | 0x30000 + }; + + enum ImmediateFlags { + ConvertibleToInt = Immediate_Mask | 0x1 + }; + + enum ValueTypeInternal { + _Null_Type = Null_Type | ConvertibleToInt, + _Boolean_Type = Boolean_Type | ConvertibleToInt, + _Integer_Type = Integer_Type | ConvertibleToInt, + + }; +#else + static const quint64 NaNEncodeMask = 0xffff800000000000ll; + static const quint64 IsInt32Mask = 0x0002000000000000ll; + static const quint64 IsDoubleMask = 0xfffc000000000000ll; + static const quint64 IsNumberMask = IsInt32Mask|IsDoubleMask; + static const quint64 IsNullOrUndefinedMask = 0x0000800000000000ll; + static const quint64 IsNullOrBooleanMask = 0x0001000000000000ll; + static const quint64 IsConvertibleToIntMask = IsInt32Mask|IsNullOrBooleanMask; + + enum Masks { + NaN_Mask = 0x7ff80000, + Type_Mask = 0xffff8000, + IsDouble_Mask = 0xfffc0000, + Immediate_Mask = 0x00018000, + IsNullOrUndefined_Mask = 0x00008000, + IsNullOrBoolean_Mask = 0x00010000, + Tag_Shift = 32 + }; + enum ValueType { + Undefined_Type = IsNullOrUndefined_Mask, + Null_Type = IsNullOrUndefined_Mask|IsNullOrBoolean_Mask, + Boolean_Type = IsNullOrBoolean_Mask, + Integer_Type = 0x20000|IsNullOrBoolean_Mask, + Managed_Type = 0, + Empty_Type = Undefined_Type | 0x4000 + }; + enum { + IsDouble_Shift = 64-14, + IsNumber_Shift = 64-15, + IsConvertibleToInt_Shift = 64-16, + IsManaged_Shift = 64-17 + }; + + + enum ValueTypeInternal { + _Null_Type = Null_Type, + _Boolean_Type = Boolean_Type, + _Integer_Type = Integer_Type + }; #endif - return v; -} - -inline Primitive Primitive::fromBoolean(bool b) -{ - Primitive v; - v.tag = _Boolean_Type; - v.int_32 = (bool)b; - return v; -} -inline Primitive Primitive::fromDouble(double d) -{ - Primitive v; - v.setDouble(d); - return v; -} + inline unsigned type() const { + return tag & Type_Mask; + } -inline Primitive Primitive::fromInt32(int i) -{ - Primitive v; - v.tag = _Integer_Type; - v.int_32 = i; - return v; -} + // used internally in property + inline bool isEmpty() const { return tag == Empty_Type; } -inline Primitive Primitive::fromUInt32(uint i) -{ - Primitive v; - if (i < INT_MAX) { - v.tag = _Integer_Type; - v.int_32 = (int)i; - } else { - v.setDouble(i); + inline bool isUndefined() const { return tag == Undefined_Type; } + inline bool isNull() const { return tag == _Null_Type; } + inline bool isBoolean() const { return tag == _Boolean_Type; } +#if QT_POINTER_SIZE == 8 + inline bool isInteger() const { return (val >> IsNumber_Shift) == 1; } + inline bool isDouble() const { return (val >> IsDouble_Shift); } + inline bool isNumber() const { return (val >> IsNumber_Shift); } + inline bool isManaged() const { return !(val >> IsManaged_Shift); } + inline bool isNullOrUndefined() const { return ((val >> IsManaged_Shift) & ~2) == 1; } + inline bool integerCompatible() const { return ((val >> IsConvertibleToInt_Shift) & ~2) == 1; } + static inline bool integerCompatible(Value a, Value b) { + return a.integerCompatible() && b.integerCompatible(); } - return v; -} - -inline double Value::toNumber() const -{ - if (integerCompatible()) - return int_32; - if (isDouble()) + static inline bool bothDouble(Value a, Value b) { + return a.isDouble() && b.isDouble(); + } + double doubleValue() const { + Q_ASSERT(isDouble()); + union { + quint64 i; + double d; + } v; + v.i = val ^ NaNEncodeMask; + return v.d; + } + void setDouble(double d) { + union { + quint64 i; + double d; + } v; + v.d = d; + val = v.i ^ NaNEncodeMask; + Q_ASSERT(isDouble()); + } + bool isNaN() const { return (tag & 0x7fff8000) == 0x00078000; } +#else + inline bool isInteger() const { return tag == _Integer_Type; } + inline bool isDouble() const { return (tag & NotDouble_Mask) != NotDouble_Mask; } + inline bool isNumber() const { return tag == _Integer_Type || (tag & NotDouble_Mask) != NotDouble_Mask; } + inline bool isManaged() const { return tag == Managed_Type; } + inline bool isNullOrUndefined() const { return (tag & IsNullOrUndefined_Mask) == Undefined_Type; } + inline bool integerCompatible() const { return (tag & ConvertibleToInt) == ConvertibleToInt; } + static inline bool integerCompatible(Value a, Value b) { + return ((a.tag & b.tag) & ConvertibleToInt) == ConvertibleToInt; + } + static inline bool bothDouble(Value a, Value b) { + return ((a.tag | b.tag) & NotDouble_Mask) != NotDouble_Mask; + } + double doubleValue() const { return dbl; } + void setDouble(double d) { dbl = d; } + bool isNaN() const { return (tag & QV4::Value::NotDouble_Mask) == QV4::Value::NaN_Mask; } +#endif + inline bool isString() const; + inline bool isObject() const; + inline bool isInt32() { + if (tag == _Integer_Type) + return true; + if (isDouble()) { + double d = doubleValue(); + int i = (int)d; + if (i == d) { + int_32 = i; + tag = _Integer_Type; + return true; + } + } + return false; + } + double asDouble() const { + if (tag == _Integer_Type) + return int_32; return doubleValue(); - return toNumberImpl(); -} + } -inline int Value::toInt32() const -{ - if (integerCompatible()) + bool booleanValue() const { + return int_32; + } + int integerValue() const { return int_32; - double d; - if (isDouble()) - d = doubleValue(); - else - d = toNumberImpl(); + } - const double D32 = 4294967296.0; - const double D31 = D32 / 2.0; + String *stringValue() const { + return s; + } + Object *objectValue() const { + return o; + } + Managed *managed() const { + return m; + } - if ((d >= -D31 && d < D31)) - return static_cast(d); + quint64 rawValue() const { + return val; + } - return Primitive::toInt32(d); -} + static inline Value fromManaged(Managed *o); + + int toUInt16() const; + inline int toInt32() const; + inline unsigned int toUInt32() const; + + inline bool toBoolean() const; + double toInteger() const; + inline double toNumber() const; + double toNumberImpl() const; + QString toQStringNoThrow() const; + QString toQString() const; + String *toString(ExecutionContext *ctx) const; + Object *toObject(ExecutionContext *ctx) const; + + inline bool isPrimitive() const; + inline bool tryIntegerConversion() { + bool b = integerCompatible(); + if (b) + tag = _Integer_Type; + return b; + } -inline unsigned int Value::toUInt32() const -{ - return (unsigned int)toInt32(); -} + inline String *asString() const; + inline Managed *asManaged() const; + inline Object *asObject() const; + inline FunctionObject *asFunctionObject() const; + inline NumberObject *asNumberObject() const; + inline StringObject *asStringObject() const; + inline DateObject *asDateObject() const; + inline ArrayObject *asArrayObject() const; + inline ErrorObject *asErrorObject() const; + template inline T *as() const; -inline bool Value::toBoolean() const -{ - switch (type()) { - case Value::Undefined_Type: - case Value::Null_Type: - return false; - case Value::Boolean_Type: - case Value::Integer_Type: - return (bool)int_32; - case Value::Managed_Type: - if (isString()) - return stringValue()->toQString().length() > 0; - return true; - default: // double - return doubleValue() && !std::isnan(doubleValue()); - } -} + inline uint asArrayIndex() const; + inline uint asArrayLength(bool *ok) const; -inline uint Value::asArrayIndex() const -{ -#if QT_POINTER_SIZE == 8 - if (!isNumber()) - return UINT_MAX; - if (isInteger()) - return int_32 >= 0 ? (uint)int_32 : UINT_MAX; -#else - if (isInteger() && int_32 >= 0) - return (uint)int_32; - if (!isDouble()) - return UINT_MAX; -#endif - double d = doubleValue(); - uint idx = (uint)d; - if (idx != d) - return UINT_MAX; - return idx; -} + inline ExecutionEngine *engine() const; -inline uint Value::asArrayLength(bool *ok) const -{ - *ok = true; - if (integerCompatible() && int_32 >= 0) - return (uint)int_32; - if (isDouble()) { - double d = doubleValue(); - uint idx = (uint)d; - if (idx != d) { - *ok = false; - return UINT_MAX; - } - return idx; - } - if (isString()) - return stringValue()->toUInt(ok); + ReturnedValue asReturnedValue() const { return val; } + static Value fromReturnedValue(ReturnedValue val) { Value v; v.val = val; return v; } + Value &operator=(ReturnedValue v) { val = v; return *this; } + template + inline Value &operator=(Returned *t); - uint idx = toUInt32(); - double d = toNumber(); - if (d != idx) { - *ok = false; - return UINT_MAX; - } - return idx; -} + // Section 9.12 + bool sameValue(Value other) const; -inline Object *Value::asObject() const -{ - return isObject() ? objectValue() : 0; -} + inline void mark(ExecutionEngine *e) const; +}; -inline FunctionObject *Value::asFunctionObject() const +inline Managed *Value::asManaged() const { - return isObject() ? managed()->asFunctionObject() : 0; + if (isManaged()) + return managed(); + return 0; } -inline NumberObject *Value::asNumberObject() const +inline String *Value::asString() const { - return isObject() ? managed()->asNumberObject() : 0; + if (isString()) + return stringValue(); + return 0; } -inline StringObject *Value::asStringObject() const +struct Q_QML_EXPORT Primitive : public Value { - return isObject() ? managed()->asStringObject() : 0; -} + inline static Primitive emptyValue(); + static inline Primitive fromBoolean(bool b); + static inline Primitive fromInt32(int i); + inline static Primitive undefinedValue(); + static inline Primitive nullValue(); + static inline Primitive fromDouble(double d); + static inline Primitive fromUInt32(uint i); + + static double toInteger(double fromNumber); + static int toInt32(double value); + static unsigned int toUInt32(double value); + + inline operator ValueRef(); + Value asValue() const { return *this; } +}; -inline DateObject *Value::asDateObject() const +inline Primitive Primitive::undefinedValue() { - return isObject() ? managed()->asDateObject() : 0; + Primitive v; +#if QT_POINTER_SIZE == 8 + v.val = quint64(Undefined_Type) << Tag_Shift; +#else + v.tag = Undefined_Type; + v.int_32 = 0; +#endif + return v; } -inline ArrayObject *Value::asArrayObject() const +inline Primitive Primitive::emptyValue() { - return isObject() ? managed()->asArrayObject() : 0; + Primitive v; + v.tag = Value::Empty_Type; + v.uint_32 = 0; + return v; } -inline ErrorObject *Value::asErrorObject() const +inline Value Value::fromManaged(Managed *m) { - return isObject() ? managed()->asErrorObject() : 0; + if (!m) + return QV4::Primitive::undefinedValue(); + Value v; +#if QT_POINTER_SIZE == 8 + v.m = m; +#else + v.tag = Managed_Type; + v.m = m; +#endif + return v; } -template -inline T *Value::as() const { Managed *m = isObject() ? managed() : 0; return m ? m->as() : 0; } - -struct Q_QML_PRIVATE_EXPORT PersistentValuePrivate +struct SafeValue : public Value { - PersistentValuePrivate(ReturnedValue v, ExecutionEngine *engine = 0, bool weak = false); - virtual ~PersistentValuePrivate(); - SafeValue value; - uint refcount; - bool weak; - QV4::ExecutionEngine *engine; - PersistentValuePrivate **prev; - PersistentValuePrivate *next; - - void init(); - void removeFromList(); - void ref() { ++refcount; } - void deref(); - PersistentValuePrivate *detach(const ReturnedValue value, bool weak = false); - - bool checkEngine(QV4::ExecutionEngine *otherEngine) { - if (!engine) { - Q_ASSERT(!value.isObject()); - engine = otherEngine; - } - return (engine == otherEngine); + SafeValue &operator =(const ScopedValue &v); + template + SafeValue &operator=(Returned *t); + SafeValue &operator=(ReturnedValue v) { + val = v; + return *this; } -}; - -class Q_QML_EXPORT PersistentValue -{ -public: - PersistentValue() : d(0) {} - PersistentValue(const PersistentValue &other); - PersistentValue &operator=(const PersistentValue &other); - - PersistentValue(const ValueRef val); - PersistentValue(ReturnedValue val); template - PersistentValue(Returned *obj); + SafeValue &operator=(T *t) { + val = Value::fromManaged(t).val; + return *this; + } + template - PersistentValue(const Referenced obj); - PersistentValue &operator=(const ValueRef other); - PersistentValue &operator =(ReturnedValue other); + SafeValue &operator=(const Scoped &t); + SafeValue &operator=(const ValueRef v); + SafeValue &operator=(const Value &v) { + val = v.val; + return *this; + } template - PersistentValue &operator=(Returned *obj); + inline Returned *as(); template - PersistentValue &operator=(const Referenced obj); - ~PersistentValue(); + inline Referenced asRef(); +}; - ReturnedValue value() const { - return (d ? d->value.asReturnedValue() : Primitive::undefinedValue().asReturnedValue()); +template +struct Safe : public SafeValue +{ + template + Safe &operator =(X *x) { + val = Value::fromManaged(x).val; } + Safe &operator =(T *t); + Safe &operator =(const Scoped &v); + Safe &operator =(const Referenced &v); + Safe &operator =(Returned *t); - ExecutionEngine *engine() { - if (!d) - return 0; - if (d->engine) - return d->engine; - Managed *m = d->value.asManaged(); - return m ? m->engine() : 0; - } + Safe &operator =(const Safe &t); - bool isUndefined() const { return !d || d->value.isUndefined(); } - bool isNullOrUndefined() const { return !d || d->value.isNullOrUndefined(); } - void clear() { - *this = PersistentValue(); - } + bool operator!() const { return !managed(); } + + T *operator->() { return static_cast(managed()); } + const T *operator->() const { return static_cast(managed()); } + T *getPointer() const { return static_cast(managed()); } + Returned *ret() const; -private: - friend struct ValueRef; - PersistentValuePrivate *d; + void mark(ExecutionEngine *e) { if (managed()) managed()->mark(e); } }; +typedef Safe SafeString; +typedef Safe SafeObject; -class Q_QML_EXPORT WeakValue +template +T *value_cast(const Value &v) { -public: - WeakValue() : d(0) {} - WeakValue(const ValueRef val); - WeakValue(const WeakValue &other); - WeakValue(ReturnedValue val); - template - WeakValue(Returned *obj); - WeakValue &operator=(const WeakValue &other); - WeakValue &operator=(const ValueRef other); - WeakValue &operator =(const ReturnedValue &other); - template - WeakValue &operator=(Returned *obj); - - ~WeakValue(); - - ReturnedValue value() const { - return (d ? d->value.asReturnedValue() : Primitive::undefinedValue().asReturnedValue()); - } - - ExecutionEngine *engine() { - if (!d) - return 0; - if (d->engine) - return d->engine; - Managed *m = d->value.asManaged(); - return m ? m->engine() : 0; - } + return v.as(); +} - bool isUndefined() const { return !d || d->value.isUndefined(); } - bool isNullOrUndefined() const { return !d || d->value.isNullOrUndefined(); } - void clear() { - *this = WeakValue(); - } +template +ReturnedValue value_convert(ExecutionContext *ctx, const Value &v); - void markOnce(ExecutionEngine *e); -private: - friend struct ValueRef; - PersistentValuePrivate *d; -}; -} // namespace QV4 +} QT_END_NAMESPACE -#endif +#endif // QV4VALUE_DEF_P_H diff --git a/src/qml/jsruntime/qv4variantobject_p.h b/src/qml/jsruntime/qv4variantobject_p.h index 3715dbc8c..6c4a36503 100644 --- a/src/qml/jsruntime/qv4variantobject_p.h +++ b/src/qml/jsruntime/qv4variantobject_p.h @@ -57,7 +57,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index 9d6540ebe..030e45045 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -41,7 +41,7 @@ #include "qv4vme_moth_p.h" #include "qv4instr_moth_p.h" -#include +#include #include #include #include diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index bc56fe1f2..d0476a92d 100644 --- a/src/qml/qml/qqmlboundsignal.cpp +++ b/src/qml/qml/qqmlboundsignal.cpp @@ -54,7 +54,7 @@ #include #include "qqmlinfo.h" -#include +#include #include #include diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index d3ef02a9a..1ca9c6ac1 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/qml/qqmlcontextwrapper_p.h b/src/qml/qml/qqmlcontextwrapper_p.h index bd56d4bce..0ecec9365 100644 --- a/src/qml/qml/qqmlcontextwrapper_p.h +++ b/src/qml/qml/qqmlcontextwrapper_p.h @@ -56,7 +56,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h index c4b19394f..f29b54dda 100644 --- a/src/qml/qml/qqmldata_p.h +++ b/src/qml/qml/qqmldata_p.h @@ -56,7 +56,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmljavascriptexpression.cpp b/src/qml/qml/qqmljavascriptexpression.cpp index 499ade1ca..b7673bdb3 100644 --- a/src/qml/qml/qqmljavascriptexpression.cpp +++ b/src/qml/qml/qqmljavascriptexpression.cpp @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/qml/qqmllistwrapper_p.h b/src/qml/qml/qqmllistwrapper_p.h index a8105d256..a7ce8b30b 100644 --- a/src/qml/qml/qqmllistwrapper_p.h +++ b/src/qml/qml/qqmllistwrapper_p.h @@ -58,7 +58,7 @@ #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index d026b9520..0247cebdc 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -50,7 +50,7 @@ #include #include -#include +#include #include diff --git a/src/qml/qml/qqmlpropertycache_p.h b/src/qml/qml/qqmlpropertycache_p.h index bc0cef9f4..a6741d3bd 100644 --- a/src/qml/qml/qqmlpropertycache_p.h +++ b/src/qml/qml/qqmlpropertycache_p.h @@ -62,7 +62,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index 02797220c..ab6f47e8d 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -69,7 +69,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index eb1eee509..355a6751a 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -56,7 +56,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h index 256573966..d66dbbba0 100644 --- a/src/qml/qml/qqmlvaluetypewrapper_p.h +++ b/src/qml/qml/qqmlvaluetypewrapper_p.h @@ -56,7 +56,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/qqmlvmemetaobject_p.h b/src/qml/qml/qqmlvmemetaobject_p.h index 77db10766..778559d0c 100644 --- a/src/qml/qml/qqmlvmemetaobject_p.h +++ b/src/qml/qml/qqmlvmemetaobject_p.h @@ -71,7 +71,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 316d06609..76327e3a6 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -68,7 +68,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index e390ef56d..1295e671f 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -68,7 +68,7 @@ #include #include -#include +#include #include #include diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index f10f54038..3bf83a1f6 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -52,7 +52,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/qml/types/qquickworkerscript.cpp b/src/qml/types/qquickworkerscript.cpp index 5af33a34f..da34101c3 100644 --- a/src/qml/types/qquickworkerscript.cpp +++ b/src/qml/types/qquickworkerscript.cpp @@ -62,7 +62,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp index 36c3623d8..8b79e33cc 100644 --- a/src/qml/util/qqmladaptormodel.cpp +++ b/src/qml/util/qqmladaptormodel.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index 763dd5251..ed5c8d7bc 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -54,7 +54,7 @@ #include #include -#include +#include #include #include diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index f636d5a61..1d22a6b48 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -65,7 +65,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/quick/items/context2d/qquickcontext2d_p.h b/src/quick/items/context2d/qquickcontext2d_p.h index 6399da3de..4390ae62c 100644 --- a/src/quick/items/context2d/qquickcontext2d_p.h +++ b/src/quick/items/context2d/qquickcontext2d_p.h @@ -55,7 +55,7 @@ #include #include -#include +#include //#define QQUICKCONTEXT2D_DEBUG //enable this for just DEBUG purpose! diff --git a/src/quick/items/qquickloader_p_p.h b/src/quick/items/qquickloader_p_p.h index 32c271222..578341861 100644 --- a/src/quick/items/qquickloader_p_p.h +++ b/src/quick/items/qquickloader_p_p.h @@ -58,7 +58,7 @@ #include "qquickitemchangelistener_p.h" #include -#include +#include QT_BEGIN_NAMESPACE -- 2.34.1