[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