[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdebindings/generator
From:       Arno Rehn <kde () arnorehn ! de>
Date:       2009-11-07 20:00:53
Message-ID: 1257624053.414473.24489.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1046193 by arnorehn:

Correctly handle arrays.


 M  +7 -2      type.cpp  
 M  +11 -7     type.h  
 M  +18 -9     type_compiler.cpp  


--- trunk/KDE/kdebindings/generator/type.cpp #1046192:1046193
@@ -166,7 +166,7 @@
     }
     
     // FIXME: This won't work for an array of function pointers!
-    if (isArray()) ret += '(';
+    if (isArray() && (m_pointerDepth > 0 || m_isRef)) ret += '(';
     
     for (int i = 0; i < m_pointerDepth; i++) {
         ret += "*";
@@ -175,8 +175,13 @@
     ret = ret.trimmed();
     if (m_isRef) ret += "&";
     
-    if (isArray()) ret += fnPtrName + ")[" + QString::number(m_dimensions) + ']';
+    if (isArray()) ret += fnPtrName;
+    if (isArray() && (m_pointerDepth > 0 || m_isRef)) ret += ')';
     
+    foreach(int size, m_arrayLengths) {
+        ret += '[' + QString::number(size) + ']';
+    }
+    
     if (m_isFunctionPointer) {
         ret += "(*" + fnPtrName + ")(";
         for (int i = 0; i < m_params.count(); i++) {
--- trunk/KDE/kdebindings/generator/type.h #1046192:1046193
@@ -372,16 +372,16 @@
 public:
     Type(Class* klass = 0, bool isConst = false, bool isVolatile = false, int \
                pointerDepth = 0, bool isRef = false)
         : m_class(klass), m_typedef(0), m_enum(0), m_isConst(isConst), \
                m_isVolatile(isVolatile), 
-          m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
m_isFunctionPointer(false), m_dimensions(0) {} +          \
m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
                m_isFunctionPointer(false) {}
     Type(Typedef* tdef, bool isConst = false, bool isVolatile = false, int \
                pointerDepth = 0, bool isRef = false)
         : m_class(0), m_typedef(tdef), m_enum(0), m_isConst(isConst), \
                m_isVolatile(isVolatile), 
-          m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
m_isFunctionPointer(false), m_dimensions(0) {} +          \
m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
                m_isFunctionPointer(false) {}
     Type(Enum* e, bool isConst = false, bool isVolatile = false, int pointerDepth = \
                0, bool isRef = false)
         : m_class(0), m_typedef(0), m_enum(e), m_isConst(isConst), \
                m_isVolatile(isVolatile), 
-          m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
m_isFunctionPointer(false), m_dimensions(0) {}     +          \
m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
                m_isFunctionPointer(false) {}
     Type(const QString& name, bool isConst = false, bool isVolatile = false, int \
                pointerDepth = 0, bool isRef = false)
         : m_class(0), m_typedef(0), m_enum(0), m_name(name), m_isConst(isConst), \
                m_isVolatile(isVolatile), 
-          m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
m_isFunctionPointer(false), m_dimensions(0) {} +          \
m_pointerDepth(pointerDepth), m_isRef(isRef), m_isIntegral(false), \
m_isFunctionPointer(false) {}  
     void setClass(Class* klass) { m_class = klass; m_typedef = 0; m_enum = 0; }
     Class* getClass() const { return m_class; }
@@ -424,9 +424,13 @@
     void setIsIntegral(bool isIntegral) { m_isIntegral = isIntegral; }
     bool isIntegral() const { return m_isIntegral; }
 
-    void setArrayDimensions(int dim) { m_dimensions = dim; }
-    bool isArray() const { return m_dimensions; }
+    void setArrayDimensions(int dim) { m_arrayLengths.resize(dim); }
+    int arrayDimensions() const { return m_arrayLengths.size(); }
+    bool isArray() const { return m_arrayLengths.size(); }
 
+    void setArrayLength(int dim, int length) { m_arrayLengths[dim] = length; }
+    int arrayLength(int dim) const { return m_arrayLengths[dim]; }
+
     const QList<Type>& templateArguments() const { return m_templateArgs; }
     void appendTemplateArgument(const Type& type) { m_templateArgs.append(type); }
     void setTemplateArguments(const QList<Type>& types) { m_templateArgs = types; }
@@ -465,7 +469,7 @@
     QList<Type> m_templateArgs;
     bool m_isFunctionPointer;
     ParameterList m_params;
-    int m_dimensions;
+    QVector<int> m_arrayLengths;
 };
 
 #endif // TYPE_H
--- trunk/KDE/kdebindings/generator/type_compiler.cpp #1046192:1046193
@@ -69,18 +69,27 @@
         run(declarator->ptr_ops);
     
     if (declarator->array_dimensions) {
-        PrimaryExpressionAST* primary = \
                ast_cast<PrimaryExpressionAST*>(declarator->array_dimensions->at(0)->element);
                
-        if (primary) {
-            QByteArray token = \
                m_session->token_stream->token(primary->token).symbolByteArray();
-            bool ok = false;
-            int dimensions = token.toInt(&ok);
-            if (ok) {
-                m_realType.setArrayDimensions(dimensions);
+        const ListNode<ExpressionAST*>* it = \
declarator->array_dimensions->toFront(), *end = it; +        int dim = 0;
+        m_realType.setArrayDimensions(declarator->array_dimensions->count());
+        do {
+            PrimaryExpressionAST* primary = \
ast_cast<PrimaryExpressionAST*>(it->element); +            if (primary) {
+                QByteArray token = \
m_session->token_stream->token(primary->token).symbolByteArray(); +                \
bool ok = false; +                int length = token.toInt(&ok);
+                if (ok) {
+                    m_realType.setArrayLength(dim++, length);
+                } else {
+                    m_realType.setPointerDepth(m_realType.pointerDepth() + 1);
+                }
             } else {
                 m_realType.setPointerDepth(m_realType.pointerDepth() + 1);
             }
-        } else {
-            m_realType.setPointerDepth(m_realType.pointerDepth() + 1);
+            it = it->next;
+        } while (it != end);
+        if (dim != m_realType.arrayDimensions()) {
+            m_realType.setArrayDimensions(dim);
         }
     }
     


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic