diff options
Diffstat (limited to 'src/tools/moc')
-rw-r--r-- | src/tools/moc/generator.cpp | 50 | ||||
-rw-r--r-- | src/tools/moc/keywords.cpp | 2 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 12 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 2 | ||||
-rw-r--r-- | src/tools/moc/moc.pro | 1 | ||||
-rw-r--r-- | src/tools/moc/ppkeywords.cpp | 2 | ||||
-rw-r--r-- | src/tools/moc/util/generate_keywords.cpp | 9 | ||||
-rw-r--r-- | src/tools/moc/utils.h | 8 |
8 files changed, 54 insertions, 32 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index ef3b381842..e6ffbe157a 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com> ** Contact: http://www.qt-project.org/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -522,11 +523,6 @@ void Generator::generateCode() } if (!purestSuperClass.isEmpty() && !isQObject) { QByteArray superClass = purestSuperClass; - // workaround for VC6 - if (superClass.contains("::")) { - fprintf(out, " typedef %s QMocSuperClass;\n", superClass.constData()); - superClass = "QMocSuperClass"; - } fprintf(out, " return %s::qt_metacast(_clname);\n", superClass.constData()); } else { fprintf(out, " return 0;\n"); @@ -719,7 +715,9 @@ void Generator::generateProperties() uint flags = Invalid; if (!isBuiltinType(p.type)) flags |= EnumOrFlag; - if (!p.read.isEmpty()) + if (!p.member.isEmpty() && !p.constant) + flags |= Writable; + if (!p.read.isEmpty() || !p.member.isEmpty()) flags |= Readable; if (!p.write.isEmpty()) { flags |= Writable; @@ -846,11 +844,6 @@ void Generator::generateMetacall() if (!purestSuperClass.isEmpty() && !isQObject) { QByteArray superClass = purestSuperClass; - // workaround for VC6 - if (superClass.contains("::")) { - fprintf(out, " typedef %s QMocSuperClass;\n", superClass.constData()); - superClass = "QMocSuperClass"; - } fprintf(out, " _id = %s::qt_metacall(_c, _id, _a);\n", superClass.constData()); } @@ -893,12 +886,12 @@ void Generator::generateMetacall() bool needUser = false; for (int i = 0; i < cdef->propertyList.size(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); - needGet |= !p.read.isEmpty(); - if (!p.read.isEmpty()) + needGet |= !p.read.isEmpty() || !p.member.isEmpty(); + if (!p.read.isEmpty() || !p.member.isEmpty()) needTempVarForGet |= (p.gspec != PropertyDef::PointerSpec && p.gspec != PropertyDef::ReferenceSpec); - needSet |= !p.write.isEmpty(); + needSet |= !p.write.isEmpty() || (!p.member.isEmpty() && !p.constant); needReset |= !p.reset.isEmpty(); needDesignable |= p.designable.endsWith(')'); needScriptable |= p.scriptable.endsWith(')'); @@ -917,7 +910,7 @@ void Generator::generateMetacall() fprintf(out, " switch (_id) {\n"); for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { const PropertyDef &p = cdef->propertyList.at(propindex); - if (p.read.isEmpty()) + if (p.read.isEmpty() && p.member.isEmpty()) continue; QByteArray prefix; if (p.inPrivateClass.size()) { @@ -933,9 +926,12 @@ void Generator::generateMetacall() else if (cdef->enumDeclarations.value(p.type, false)) fprintf(out, " case %d: *reinterpret_cast<int*>(_v) = QFlag(%s%s()); break;\n", propindex, prefix.constData(), p.read.constData()); - else + else if (!p.read.isEmpty()) fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n", propindex, p.type.constData(), prefix.constData(), p.read.constData()); + else + fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s; break;\n", + propindex, p.type.constData(), prefix.constData(), p.member.constData()); } fprintf(out, " }\n"); } @@ -952,7 +948,9 @@ void Generator::generateMetacall() fprintf(out, " switch (_id) {\n"); for (int propindex = 0; propindex < cdef->propertyList.size(); ++propindex) { const PropertyDef &p = cdef->propertyList.at(propindex); - if (p.write.isEmpty()) + if (p.constant) + continue; + if (p.write.isEmpty() && p.member.isEmpty()) continue; QByteArray prefix; if (p.inPrivateClass.size()) { @@ -962,9 +960,25 @@ void Generator::generateMetacall() if (cdef->enumDeclarations.value(p.type, false)) { fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast<int*>(_v))); break;\n", propindex, prefix.constData(), p.write.constData()); - } else { + } else if (!p.write.isEmpty()) { fprintf(out, " case %d: %s%s(*reinterpret_cast< %s*>(_v)); break;\n", propindex, prefix.constData(), p.write.constData(), p.type.constData()); + } else { + fprintf(out, " case %d:\n", propindex); + fprintf(out, " if (%s%s != *reinterpret_cast< %s*>(_v)) {\n", + prefix.constData(), p.member.constData(), p.type.constData()); + fprintf(out, " %s%s = *reinterpret_cast< %s*>(_v);\n", + prefix.constData(), p.member.constData(), p.type.constData()); + if (!p.notify.isEmpty() && p.notifyId != -1) { + const FunctionDef &f = cdef->signalList.at(p.notifyId); + if (f.arguments.size() == 0) + fprintf(out, " emit %s();\n", p.notify.constData()); + else if (f.arguments.size() == 1 && f.arguments.at(0).normalizedType == p.type) + fprintf(out, " emit %s(%s%s);\n", + p.notify.constData(), prefix.constData(), p.member.constData()); + } + fprintf(out, " }\n"); + fprintf(out, " break;\n"); } } fprintf(out, " }\n"); diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp index 558e99c1d6..dc03af3378 100644 --- a/src/tools/moc/keywords.cpp +++ b/src/tools/moc/keywords.cpp @@ -45,7 +45,7 @@ static const short keyword_trans[][128] = { {0,0,0,0,0,0,0,0,0,546,543,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 546,252,544,547,0,38,239,545,25,26,236,234,30,235,27,237, + 546,252,544,547,8,38,239,545,25,26,236,234,30,235,27,237, 22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43, 0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,21,8,8,8,8,8,8,8,8,8,31,549,32,238,8, diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index f49cc23ce5..1ebb82ffad 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1059,6 +1059,12 @@ void Moc::createPropertyDef(PropertyDef &propDef) v2 = "()"; } switch (l[0]) { + case 'M': + if (l == "MEMBER") + propDef.member = v; + else + error(2); + break; case 'R': if (l == "READ") propDef.read = v; @@ -1099,11 +1105,11 @@ void Moc::createPropertyDef(PropertyDef &propDef) error(2); } } - if (propDef.read.isNull()) { + if (propDef.read.isNull() && propDef.member.isNull()) { QByteArray msg; msg += "Property declaration "; msg += propDef.name; - msg += " has no READ accessor function. The property will be invalid."; + msg += " has no READ accessor function or associated MEMBER variable. The property will be invalid."; warning(msg.constData()); } if (propDef.constant && !propDef.write.isNull()) { @@ -1515,7 +1521,7 @@ void Moc::checkProperties(ClassDef *cdef) // for (int i = 0; i < cdef->propertyList.count(); ++i) { PropertyDef &p = cdef->propertyList[i]; - if (p.read.isEmpty()) + if (p.read.isEmpty() && p.member.isEmpty()) continue; for (int j = 0; j < cdef->publicList.count(); ++j) { const FunctionDef &f = cdef->publicList.at(j); diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 5b3c364a73..f97a537215 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -127,7 +127,7 @@ struct FunctionDef struct PropertyDef { PropertyDef():notifyId(-1), constant(false), final(false), gspec(ValueSpec), revision(0){} - QByteArray name, type, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass; + QByteArray name, type, member, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass; int notifyId; bool constant; bool final; diff --git a/src/tools/moc/moc.pro b/src/tools/moc/moc.pro index 3a6fd2a02d..d56c2805eb 100644 --- a/src/tools/moc/moc.pro +++ b/src/tools/moc/moc.pro @@ -1,4 +1,5 @@ option(host_build) +CONFIG += force_bootstrap DEFINES += QT_MOC QT_NO_CAST_FROM_ASCII QT_NO_CAST_FROM_BYTEARRAY QT_NO_COMPRESS diff --git a/src/tools/moc/ppkeywords.cpp b/src/tools/moc/ppkeywords.cpp index e9d199705d..76387d4b18 100644 --- a/src/tools/moc/ppkeywords.cpp +++ b/src/tools/moc/ppkeywords.cpp @@ -45,7 +45,7 @@ static const short pp_keyword_trans[][128] = { {0,0,0,0,0,0,0,0,0,98,12,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 98,76,96,13,0,60,62,97,9,10,58,56,11,57,102,59, + 98,76,96,13,1,60,62,97,9,10,58,56,11,57,102,59, 6,6,6,6,6,6,6,6,6,6,92,0,7,81,8,91, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,101,0,61,1, diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp index 47ff0f9ac8..7ad553608c 100644 --- a/src/tools/moc/util/generate_keywords.cpp +++ b/src/tools/moc/util/generate_keywords.cpp @@ -268,7 +268,7 @@ inline bool is_ident_start(char s) { return ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z') - || s == '_' + || s == '_' || s == '$' ); } @@ -277,7 +277,7 @@ inline bool is_ident_char(char s) return ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z') || (s >= '0' && s <= '9') - || s == '_' + || s == '_' || s == '$' ); } struct State @@ -360,8 +360,9 @@ void makeTable(const Keyword keywords[]) newState(states, pre?"PP_CHARACTER":"CHARACTER", c); for (c = 'A'; c <= 'Z'; ++c) newState(states, pre?"PP_CHARACTER":"CHARACTER", c); - c = '_'; - newState(states, pre?"PP_CHARACTER":"CHARACTER", c); + + newState(states, pre?"PP_CHARACTER":"CHARACTER", '_'); + newState(states, pre?"PP_CHARACTER":"CHARACTER", '$'); // add digits for (c = '0'; c <= '9'; ++c) diff --git a/src/tools/moc/utils.h b/src/tools/moc/utils.h index aeb9b745f1..0dfd0999f4 100644 --- a/src/tools/moc/utils.h +++ b/src/tools/moc/utils.h @@ -60,7 +60,7 @@ inline bool is_ident_start(char s) { return ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z') - || s == '_' + || s == '_' || s == '$' ); } @@ -69,7 +69,7 @@ inline bool is_ident_char(char s) return ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z') || (s >= '0' && s <= '9') - || s == '_' + || s == '_' || s == '$' ); } @@ -112,10 +112,10 @@ inline const char *skipQuote(const char *data) } ++data; } - + if (*data) //Skip last quote ++data; - return data; + return data; } QT_END_NAMESPACE |