On Sunday 02 September 2012 23:10:18 Konstantin Tokarev wrote: > Hi all, > > When building Qt 5 on big endian host (PPC) I've found moc breaking on Qt > classes containing Q_PLUGIN_METADATA with > > ASSERT: "idx >= 0 && idx < s" in file > ../../../include/QtCore/../../src/corelib/tools/qvarlengtharray.h, line 111 > > It turned out to be a fault of QJsonPrivate::Parser::parseObject which has > different code for handling of big endian and little endian cases: > > if (parsedObject.offsets.size()) { > int tableSize = parsedObject.offsets.size()*sizeof(uint); ^^^^^^^^^^^^^
The error is there: one should multiply tableSize by sizeof(uint) only if one do a memcpy. > table = reserveSpace(tableSize); > #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN > memcpy(data + table, parsedObject.offsets.constData(), tableSize); > #else > offset *o = (offset *)(data + table); > for (int i = 0; i < tableSize; ++i) > o[i] = parsedObject.offsets[i]; > > #endif > } > > Could anyone explain why memcpy cannot be used for big endian case here? I guess that's because the offsets needs to be stored in little endian. offset is a typedef to a class that has an assignement operator which swap the bytes. -- Olivier Woboq - Qt services and support - http://woboq.com _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development