diff options
Diffstat (limited to 'src/qml/compiler/qv4bytecodegenerator.cpp')
-rw-r--r-- | src/qml/compiler/qv4bytecodegenerator.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/qml/compiler/qv4bytecodegenerator.cpp b/src/qml/compiler/qv4bytecodegenerator.cpp index 05bbf25292..4d50654d27 100644 --- a/src/qml/compiler/qv4bytecodegenerator.cpp +++ b/src/qml/compiler/qv4bytecodegenerator.cpp @@ -74,16 +74,20 @@ void BytecodeGenerator::packInstruction(I &i) Q_ASSERT(type >= MOTH_NUM_INSTRUCTIONS()); if (type >= MOTH_NUM_INSTRUCTIONS()) type -= MOTH_NUM_INSTRUCTIONS(); - int instructionsAsInts[sizeof(Instr)/sizeof(int)]; + int instructionsAsInts[sizeof(Instr)/sizeof(int)] = {}; int nMembers = Moth::InstrInfo::argumentCount[static_cast<int>(i.type)]; - memcpy(instructionsAsInts, i.packed + 1, nMembers*sizeof(int)); + for (int j = 0; j < nMembers; ++j) { + instructionsAsInts[j] = qFromLittleEndian<qint32>(i.packed + 1 + j * sizeof(int)); + } enum { Normal, Wide } width = Normal; for (int n = 0; n < nMembers; ++n) { - if (width == Normal && (static_cast<char>(instructionsAsInts[n]) != instructionsAsInts[n])) + if (width == Normal && (static_cast<qint8>(instructionsAsInts[n]) != instructionsAsInts[n])) { width = Wide; + break; + } } char *code = i.packed; switch (width) { @@ -91,7 +95,7 @@ void BytecodeGenerator::packInstruction(I &i) *reinterpret_cast<uchar *>(code) = type; ++code; for (int n = 0; n < nMembers; ++n) { - char v = static_cast<char>(instructionsAsInts[n]); + qint8 v = static_cast<qint8>(instructionsAsInts[n]); memcpy(code, &v, 1); code += 1; } @@ -113,17 +117,17 @@ void BytecodeGenerator::adjustJumpOffsets() continue; Q_ASSERT(i.linkedLabel != -1 && labels.at(i.linkedLabel) != -1); const auto &linkedInstruction = instructions.at(labels.at(i.linkedLabel)); - char *c = i.packed + i.offsetForJump; + qint8 *c = reinterpret_cast<qint8*>(i.packed + i.offsetForJump); int jumpOffset = linkedInstruction.position - (i.position + i.size); // qDebug() << "adjusting jump offset for instruction" << index << i.position << i.size << "offsetForJump" << i.offsetForJump << "target" // << labels.at(i.linkedLabel) << linkedInstruction.position << "jumpOffset" << jumpOffset; uchar type = *reinterpret_cast<const uchar *>(i.packed); if (type >= MOTH_NUM_INSTRUCTIONS()) { Q_ASSERT(i.offsetForJump == i.size - 4); - memcpy(c, &jumpOffset, sizeof(int)); + qToLittleEndian<qint32>(jumpOffset, c); } else { Q_ASSERT(i.offsetForJump == i.size - 1); - char o = jumpOffset; + qint8 o = jumpOffset; Q_ASSERT(o == jumpOffset); *c = o; } @@ -181,6 +185,7 @@ void BytecodeGenerator::finalize(Compiler::Context *context) } int BytecodeGenerator::addInstructionHelper(Instr::Type type, const Instr &i, int offsetOfOffset) { +#if QT_CONFIG(qml_debug) if (debugMode && type != Instr::Type::Debug) { QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wmaybe-uninitialized") // broken gcc warns about Instruction::Debug() @@ -193,10 +198,14 @@ QT_WARNING_DISABLE_GCC("-Wmaybe-uninitialized") // broken gcc warns about Instru } QT_WARNING_POP } +#else + Q_UNUSED(debugMode); +#endif const int pos = instructions.size(); - int s = Moth::InstrInfo::argumentCount[static_cast<int>(type)]*sizeof(int); + const int argCount = Moth::InstrInfo::argumentCount[static_cast<int>(type)]; + int s = argCount*sizeof(int); if (offsetOfOffset != -1) offsetOfOffset += 1; I instr{type, static_cast<short>(s + 1), 0, currentLine, offsetOfOffset, -1, "\0\0" }; @@ -204,7 +213,12 @@ QT_WARNING_POP *reinterpret_cast<uchar *>(code) = static_cast<uchar>(MOTH_NUM_INSTRUCTIONS() + static_cast<int>(type)); ++code; Q_ASSERT(MOTH_NUM_INSTRUCTIONS() + static_cast<int>(type) < 256); - memcpy(code, &i, s); + + for (int j = 0; j < argCount; ++j) { + qToLittleEndian<qint32>(i.argumentsAsInts[j], code); + code += sizeof(int); + } + instructions.append(instr); return pos; |