Fix build with msvc2010 in 32-bit mode
authorSimon Hausmann <simon.hausmann@digia.com>
Tue, 25 Jun 2013 12:23:35 +0000 (14:23 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 26 Jun 2013 13:45:50 +0000 (15:45 +0200)
It cannot map a function pointer that returns a structure that isn't known
at declaration time.

Done with Lars.

Change-Id: I02a241695a6f6a94883507eb2c4988852cc9b912
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/qml/v4/qv4global_p.h
src/qml/qml/v4/qv4managed_p.h
src/qml/qml/v4/qv4value_def_p.h [new file with mode: 0644]
src/qml/qml/v4/qv4value_p.h
src/qml/qml/v4/v4.pri

index 55cbb23..acee20b 100644 (file)
@@ -63,6 +63,30 @@ QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
+class MemoryManager;
+struct String;
+struct Object;
+struct ObjectPrototype;
+struct ObjectIterator;
+struct ExecutionContext;
+struct ScriptFunction;
+struct InternalClass;
+struct Property;
+
+struct BooleanObject;
+struct NumberObject;
+struct StringObject;
+struct ArrayObject;
+struct DateObject;
+struct FunctionObject;
+struct ErrorObject;
+struct ArgumentsObject;
+struct Managed;
+struct Value;
+struct Lookup;
+struct ExecutionEngine;
+struct QObjectWrapper;
+
 
 enum PropertyFlag {
     Attr_Data = 0,
index 82bd24d..5e3c142 100644 (file)
 #include <QtCore/QVector>
 #include <QtCore/QDebug>
 #include "qv4global_p.h"
+#include "qv4value_def_p.h"
 
 QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
-class MemoryManager;
-struct String;
-struct Object;
-struct ObjectPrototype;
-struct ObjectIterator;
-struct ExecutionContext;
-struct ScriptFunction;
-struct InternalClass;
-struct Property;
-
-struct BooleanObject;
-struct NumberObject;
-struct StringObject;
-struct ArrayObject;
-struct DateObject;
-struct FunctionObject;
-struct ErrorObject;
-struct ArgumentsObject;
-struct Managed;
-struct Value;
-struct Lookup;
-struct ExecutionEngine;
-struct QObjectWrapper;
-
 #define Q_MANAGED_CHECK \
     template <typename T> inline void qt_check_for_QMANAGED_macro(const T &_q_argument) const \
     { int i = qYouForgotTheQ_MANAGED_Macro(this, &_q_argument); i = i + 1; }
@@ -331,6 +308,11 @@ private:
     friend struct ObjectIterator;
 };
 
+// ### Not a good placement
+template<typename T>
+inline T *Value::as() const { Managed *m = isObject() ? managed() : 0; return m ? m->as<T>() : 0; }
+
+
 }
 
 
diff --git a/src/qml/qml/v4/qv4value_def_p.h b/src/qml/qml/v4/qv4value_def_p.h
new file mode 100644 (file)
index 0000000..2e3a9c0
--- /dev/null
@@ -0,0 +1,280 @@
+/****************************************************************************
+**
+** 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 <QtCore/QString>
+#include "qv4global_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QV4 {
+
+typedef uint Bool;
+
+struct Q_QML_EXPORT Value
+{
+    union {
+        quint64 val;
+        double dbl;
+        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
+        };
+    };
+
+    enum Masks {
+        NotDouble_Mask = 0xfffc0000,
+        Type_Mask = 0xffff8000,
+        Immediate_Mask = NotDouble_Mask | 0x00008000,
+        Special_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,
+        Object_Type = NotDouble_Mask | 0x00000,
+        String_Type = NotDouble_Mask | 0x10000,
+        Deleted_Type = NotDouble_Mask | 0x30000
+    };
+
+    enum ImmediateFlags {
+        ConvertibleToInt = Immediate_Mask | 0x1
+    };
+
+    enum ValueTypeInternal {
+        _Undefined_Type = Undefined_Type,
+        _Empty_Type = Deleted_Type,
+        _Null_Type = Null_Type | ConvertibleToInt,
+        _Boolean_Type = Boolean_Type | ConvertibleToInt,
+        _Integer_Type = Integer_Type | ConvertibleToInt,
+        _Object_Type = Object_Type,
+        _String_Type = String_Type
+
+    };
+
+    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; }
+    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; }
+#if QT_POINTER_SIZE == 8
+    inline bool isString() const { return (tag & Type_Mask) == String_Type; }
+    inline bool isObject() const { return (tag & Type_Mask) == Object_Type; }
+#else
+    inline bool isString() const { return tag == String_Type; }
+    inline bool isObject() const { return tag == Object_Type; }
+#endif
+    inline bool isConvertibleToInt() const { return (tag & ConvertibleToInt) == ConvertibleToInt; }
+    inline bool isInt32() {
+        if (tag == _Integer_Type)
+            return true;
+        if (isDouble()) {
+            int i = (int)dbl;
+            if (i == dbl) {
+                int_32 = i;
+                tag = _Integer_Type;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    bool booleanValue() const {
+        return int_32;
+    }
+    double doubleValue() const {
+        return dbl;
+    }
+    void setDouble(double d) {
+        dbl = d;
+    }
+    double asDouble() const {
+        if (tag == _Integer_Type)
+            return int_32;
+        return dbl;
+    }
+    int integerValue() const {
+        return int_32;
+    }
+
+#if QT_POINTER_SIZE == 8
+    String *stringValue() const {
+        return (String *)(val & ~(quint64(Type_Mask) << Tag_Shift));
+    }
+    Object *objectValue() const {
+        return (Object *)(val & ~(quint64(Type_Mask) << Tag_Shift));
+    }
+    Managed *managed() const {
+        return (Managed *)(val & ~(quint64(Type_Mask) << Tag_Shift));
+    }
+#else
+    String *stringValue() const {
+        return s;
+    }
+    Object *objectValue() const {
+        return o;
+    }
+    Managed *managed() const {
+        return m;
+    }
+#endif
+
+    quint64 rawValue() const {
+        return val;
+    }
+
+    static Value emptyValue();
+    static Value undefinedValue();
+    static Value nullValue();
+    static Value fromBoolean(Bool b);
+    static Value fromDouble(double d);
+    static Value fromInt32(int i);
+    static Value fromUInt32(uint i);
+    static Value fromString(String *s);
+    static Value fromObject(Object *o);
+
+#ifndef QMLJS_LLVM_RUNTIME
+    static Value fromString(ExecutionContext *ctx, const QString &fromString);
+    static Value fromString(ExecutionEngine *engine, const QString &s);
+#endif
+
+    static double toInteger(double fromNumber);
+    static int toInt32(double value);
+    static unsigned int toUInt32(double value);
+
+    int toUInt16() const;
+    int toInt32() const;
+    unsigned int toUInt32() const;
+
+    bool toBoolean() const;
+    double toInteger() const;
+    double toNumber() const;
+    QString toQString() const;
+    String *toString(ExecutionContext *ctx) const;
+    Object *toObject(ExecutionContext *ctx) const;
+
+    inline bool isPrimitive() const { return !isObject(); }
+#if QT_POINTER_SIZE == 8
+    inline bool integerCompatible() const {
+        const quint64 mask = quint64(ConvertibleToInt) << 32;
+        return (val & mask) == mask;
+    }
+    static inline bool integerCompatible(Value a, Value b) {
+        const quint64 mask = quint64(ConvertibleToInt) << 32;
+        return ((a.val & b.val) & mask) == mask;
+    }
+    static inline bool bothDouble(Value a, Value b) {
+        const quint64 mask = quint64(NotDouble_Mask) << 32;
+        return ((a.val | b.val) & mask) != mask;
+    }
+#else
+    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;
+    }
+#endif
+    inline bool tryIntegerConversion() {
+        bool b = isConvertibleToInt();
+        if (b)
+            tag = _Integer_Type;
+        return b;
+    }
+
+    String *asString() const;
+    Managed *asManaged() const;
+    Object *asObject() const;
+    FunctionObject *asFunctionObject() const;
+    BooleanObject *asBooleanObject() const;
+    NumberObject *asNumberObject() const;
+    StringObject *asStringObject() const;
+    DateObject *asDateObject() const;
+    ArrayObject *asArrayObject() const;
+    ErrorObject *asErrorObject() const;
+
+    template<typename T> inline T *as() const;
+
+    uint asArrayIndex() const;
+    uint asArrayLength(bool *ok) const;
+
+    Value property(ExecutionContext *ctx, String *name) const;
+
+    inline ExecutionEngine *engine() const;
+
+    // Section 9.12
+    bool sameValue(Value other) const;
+
+    inline void mark() const;
+};
+
+}
+
+QT_END_NAMESPACE
+
+#endif // QV4VALUE_DEF_P_H
index 85ac64d..6d3f0e6 100644 (file)
 
 //#include <wtf/MathExtras.h>
 
+#include "qv4value_def_p.h"
+
 QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
-struct String;
-struct ExecutionContext;
-struct ExecutionEngine;
-struct Value;
-
 double __qmljs_to_number(const QV4::Value &value);
 Q_QML_EXPORT QV4::String *__qmljs_convert_to_string(QV4::ExecutionContext *ctx, const QV4::Value &value);
 QV4::Object *__qmljs_convert_to_object(QV4::ExecutionContext *ctx, const QV4::Value &value);
 
-typedef uint Bool;
-
-
-struct Q_QML_EXPORT Value
-{
-    union {
-        quint64 val;
-        double dbl;
-        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
-        };
-    };
-
-    enum Masks {
-        NotDouble_Mask = 0xfffc0000,
-        Type_Mask = 0xffff8000,
-        Immediate_Mask = NotDouble_Mask | 0x00008000,
-        Special_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,
-        Object_Type = NotDouble_Mask | 0x00000,
-        String_Type = NotDouble_Mask | 0x10000,
-        Deleted_Type = NotDouble_Mask | 0x30000
-    };
-
-    enum ImmediateFlags {
-        ConvertibleToInt = Immediate_Mask | 0x1
-    };
-
-    enum ValueTypeInternal {
-        _Undefined_Type = Undefined_Type,
-        _Empty_Type = Deleted_Type,
-        _Null_Type = Null_Type | ConvertibleToInt,
-        _Boolean_Type = Boolean_Type | ConvertibleToInt,
-        _Integer_Type = Integer_Type | ConvertibleToInt,
-        _Object_Type = Object_Type,
-        _String_Type = String_Type
-
-    };
-
-    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; }
-    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; }
-#if QT_POINTER_SIZE == 8
-    inline bool isString() const { return (tag & Type_Mask) == String_Type; }
-    inline bool isObject() const { return (tag & Type_Mask) == Object_Type; }
-#else
-    inline bool isString() const { return tag == String_Type; }
-    inline bool isObject() const { return tag == Object_Type; }
-#endif
-    inline bool isConvertibleToInt() const { return (tag & ConvertibleToInt) == ConvertibleToInt; }
-    inline bool isInt32() {
-        if (tag == _Integer_Type)
-            return true;
-        if (isDouble()) {
-            int i = (int)dbl;
-            if (i == dbl) {
-                int_32 = i;
-                tag = _Integer_Type;
-                return true;
-            }
-        }
-        return false;
-    }
-
-    bool booleanValue() const {
-        return int_32;
-    }
-    double doubleValue() const {
-        return dbl;
-    }
-    void setDouble(double d) {
-        dbl = d;
-    }
-    double asDouble() const {
-        if (tag == _Integer_Type)
-            return int_32;
-        return dbl;
-    }
-    int integerValue() const {
-        return int_32;
-    }
-
-#if QT_POINTER_SIZE == 8
-    String *stringValue() const {
-        return (String *)(val & ~(quint64(Type_Mask) << Tag_Shift));
-    }
-    Object *objectValue() const {
-        return (Object *)(val & ~(quint64(Type_Mask) << Tag_Shift));
-    }
-    Managed *managed() const {
-        return (Managed *)(val & ~(quint64(Type_Mask) << Tag_Shift));
-    }
-#else
-    String *stringValue() const {
-        return s;
-    }
-    Object *objectValue() const {
-        return o;
-    }
-    Managed *managed() const {
-        return m;
-    }
-#endif
-
-    quint64 rawValue() const {
-        return val;
-    }
-
-    static Value emptyValue();
-    static Value undefinedValue();
-    static Value nullValue();
-    static Value fromBoolean(Bool b);
-    static Value fromDouble(double d);
-    static Value fromInt32(int i);
-    static Value fromUInt32(uint i);
-    static Value fromString(String *s);
-    static Value fromObject(Object *o);
-
-#ifndef QMLJS_LLVM_RUNTIME
-    static Value fromString(ExecutionContext *ctx, const QString &fromString);
-    static Value fromString(ExecutionEngine *engine, const QString &s);
-#endif
-
-    static double toInteger(double fromNumber);
-    static int toInt32(double value);
-    static unsigned int toUInt32(double value);
-
-    int toUInt16() const;
-    int toInt32() const;
-    unsigned int toUInt32() const;
-
-    bool toBoolean() const;
-    double toInteger() const;
-    double toNumber() const;
-    QString toQString() const;
-    String *toString(ExecutionContext *ctx) const;
-    Object *toObject(ExecutionContext *ctx) const;
-
-    inline bool isPrimitive() const { return !isObject(); }
-#if QT_POINTER_SIZE == 8
-    inline bool integerCompatible() const {
-        const quint64 mask = quint64(ConvertibleToInt) << 32;
-        return (val & mask) == mask;
-    }
-    static inline bool integerCompatible(Value a, Value b) {
-        const quint64 mask = quint64(ConvertibleToInt) << 32;
-        return ((a.val & b.val) & mask) == mask;
-    }
-    static inline bool bothDouble(Value a, Value b) {
-        const quint64 mask = quint64(NotDouble_Mask) << 32;
-        return ((a.val | b.val) & mask) != mask;
-    }
-#else
-    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;
-    }
-#endif
-    inline bool tryIntegerConversion() {
-        bool b = isConvertibleToInt();
-        if (b)
-            tag = _Integer_Type;
-        return b;
-    }
-
-    String *asString() const;
-    Managed *asManaged() const;
-    Object *asObject() const;
-    FunctionObject *asFunctionObject() const;
-    BooleanObject *asBooleanObject() const;
-    NumberObject *asNumberObject() const;
-    StringObject *asStringObject() const;
-    DateObject *asDateObject() const;
-    ArrayObject *asArrayObject() const;
-    ErrorObject *asErrorObject() const;
-
-    template<typename T>
-    T *as() const { Managed *m = isObject() ? managed() : 0; return m ? m->as<T>() : 0; }
-
-    uint asArrayIndex() const;
-    uint asArrayLength(bool *ok) const;
 
-    Value property(ExecutionContext *ctx, String *name) const;
-
-    ExecutionEngine *engine() const {
-        Managed *m = asManaged();
-        return m ? m->engine() : 0;
-    }
-
-    // Section 9.12
-    bool sameValue(Value other) const;
+inline ExecutionEngine *Value::engine() const {
+    Managed *m = asManaged();
+    return m ? m->engine() : 0;
+}
 
-    void mark() const {
-        Managed *m = asManaged();
-        if (m)
-            m->mark();
-    }
-};
+inline void Value::mark() const {
+    Managed *m = asManaged();
+    if (m)
+        m->mark();
+}
 
 inline Value Value::undefinedValue()
 {
index 9d15992..8b695a1 100644 (file)
@@ -66,6 +66,7 @@ HEADERS += \
     $$PWD/qv4runtime_p.h \
     $$PWD/qv4math_p.h \
     $$PWD/qv4value_p.h \
+    $$PWD/qv4value_def_p.h \
     $$PWD/qv4syntaxchecker_p.h \
     $$PWD/qv4isel_masm_p.h \
     $$PWD/qv4isel_p.h \