/* * 64-bit 3way compare function. * mov r7, #-1 * cmp op1hi, op2hi * blt done * bgt flip * sub r7, op1lo, op2lo (treat as unsigned) * beq done * ite hi * mov(hi) r7, #-1 * mov(!hi) r7, #1 * flip: * neg r7 * done: */ static void genCmpLong(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2) { RegLocation rlTemp = LOC_C_RETURN; // Just using as template, will change ArmLIR *target1; ArmLIR *target2; rlSrc1 = loadValueWide(cUnit, rlSrc1, kCoreReg); rlSrc2 = loadValueWide(cUnit, rlSrc2, kCoreReg); rlTemp.lowReg = dvmCompilerAllocTemp(cUnit); loadConstant(cUnit, rlTemp.lowReg, -1); opRegReg(cUnit, kOpCmp, rlSrc1.highReg, rlSrc2.highReg); ArmLIR *branch1 = opCondBranch(cUnit, kArmCondLt); ArmLIR *branch2 = opCondBranch(cUnit, kArmCondGt); opRegRegReg(cUnit, kOpSub, rlTemp.lowReg, rlSrc1.lowReg, rlSrc2.lowReg); ArmLIR *branch3 = opCondBranch(cUnit, kArmCondEq); genIT(cUnit, kArmCondHi, "E"); newLIR2(cUnit, kThumb2MovImmShift, rlTemp.lowReg, modifiedImmediate(-1)); loadConstant(cUnit, rlTemp.lowReg, 1); genBarrier(cUnit); target2 = newLIR0(cUnit, kArmPseudoTargetLabel); target2->defMask = -1; opRegReg(cUnit, kOpNeg, rlTemp.lowReg, rlTemp.lowReg); target1 = newLIR0(cUnit, kArmPseudoTargetLabel); target1->defMask = -1; storeValue(cUnit, rlDest, rlTemp); branch1->generic.target = (LIR *)target1; branch2->generic.target = (LIR *)target2; branch3->generic.target = branch1->generic.target; }
static bool genCmpFP(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2) { bool isDouble; int defaultResult; bool ltNaNBias; RegLocation rlResult; switch(mir->dalvikInsn.opCode) { case OP_CMPL_FLOAT: isDouble = false; defaultResult = -1; break; case OP_CMPG_FLOAT: isDouble = false; defaultResult = 1; break; case OP_CMPL_DOUBLE: isDouble = true; defaultResult = -1; break; case OP_CMPG_DOUBLE: isDouble = true; defaultResult = 1; break; default: return true; } if (isDouble) { rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg); rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg); dvmCompilerClobberSReg(cUnit, rlDest.sRegLow); rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kCoreReg, true); loadConstant(cUnit, rlResult.lowReg, defaultResult); newLIR2(cUnit, kThumb2Vcmpd, S2D(rlSrc1.lowReg, r1Src2.highReg), S2D(rlSrc2.lowReg, rlSrc2.highReg)); } else { rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg); rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg); dvmCompilerClobberSReg(cUnit, rlDest.sRegLow); rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kCoreReg, true); loadConstant(cUnit, rlResult.lowReg, defaultResult); newLIR2(cUnit, kThumb2Vcmps, rlSrc1.lowReg, rlSrc2.lowReg); } assert(!FPREG(rlResult.lowReg)); newLIR0(cUnit, kThumb2Fmstat); genIT(cUnit, (defaultResult == -1) ? kArmCondGt : kArmCondMi, ""); newLIR2(cUnit, kThumb2MovImmShift, rlResult.lowReg, modifiedImmediate(-defaultResult)); // Must not alter ccodes genIT(cUnit, kArmCondEq, ""); loadConstant(cUnit, rlResult.lowReg, 0); storeValue(cUnit, rlDest, rlResult); return false; }
Database::Database() : m_metadata(new Metadata(this)) , m_timer(new QTimer(this)) , m_cipher(KeePass2::CIPHER_AES) , m_compressionAlgo(CompressionGZip) , m_transformRounds(50000) , m_hasKey(false) , m_emitModified(false) , m_uuid(Uuid::random()) { setRootGroup(new Group()); rootGroup()->setUuid(Uuid::random()); m_timer->setSingleShot(true); m_uuidMap.insert(m_uuid, this); connect(m_metadata, SIGNAL(modified()), this, SIGNAL(modifiedImmediate())); connect(m_metadata, SIGNAL(nameTextChanged()), this, SIGNAL(nameTextChanged())); connect(this, SIGNAL(modifiedImmediate()), this, SLOT(startModifiedTimer())); connect(m_timer, SIGNAL(timeout()), SIGNAL(modified())); }
void TestModified::testSignals() { int spyCount = 0; int spyCount2 = 0; CompositeKey compositeKey; Database* db = new Database(); Group* root = db->rootGroup(); QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); db->setKey(compositeKey); QCOMPARE(spyModified.count(), ++spyCount); Group* g1 = new Group(); g1->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); Group* g2 = new Group(); g2->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); g2->setParent(root, 0); QCOMPARE(spyModified.count(), ++spyCount); Entry* entry1 = new Entry(); entry1->setGroup(g1); QCOMPARE(spyModified.count(), ++spyCount); Database* db2 = new Database(); Group* root2 = db2->rootGroup(); QSignalSpy spyModified2(db2, SIGNAL(modifiedImmediate())); g1->setParent(root2); QCOMPARE(spyModified.count(), ++spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); entry1->setTitle("test"); QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); Entry* entry2 = new Entry(); entry2->setGroup(g2); QCOMPARE(spyModified.count(), ++spyCount); QCOMPARE(spyModified2.count(), spyCount2); entry2->setGroup(root2); QCOMPARE(spyModified.count(), ++spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); entry2->setTitle("test2"); QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); Group* g3 = new Group(); g3->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); Group* g4 = new Group(); g4->setParent(g3); QCOMPARE(spyModified.count(), ++spyCount); delete g4; QCOMPARE(spyModified.count(), ++spyCount); delete entry2; QCOMPARE(spyModified2.count(), ++spyCount2); QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), spyCount2); delete db; delete db2; }
void TestModified::testEntrySets() { int spyCount = 0; Database* db = new Database(); Group* root = db->rootGroup(); Group* g = new Group(); g->setParent(root); Entry* entry = new Entry(); entry->setGroup(g); QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); entry->setUuid(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); entry->setUuid(entry->uuid()); QCOMPARE(spyModified.count(), spyCount); entry->setTitle("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setTitle(entry->title()); QCOMPARE(spyModified.count(), spyCount); entry->setUrl("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setUrl(entry->url()); QCOMPARE(spyModified.count(), spyCount); entry->setUsername("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setUsername(entry->username()); QCOMPARE(spyModified.count(), spyCount); entry->setPassword("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setPassword(entry->password()); QCOMPARE(spyModified.count(), spyCount); entry->setNotes("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setNotes(entry->notes()); QCOMPARE(spyModified.count(), spyCount); entry->setIcon(1); QCOMPARE(spyModified.count(), ++spyCount); entry->setIcon(entry->iconNumber()); QCOMPARE(spyModified.count(), spyCount); entry->setIcon(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); entry->setIcon(entry->iconUuid()); QCOMPARE(spyModified.count(), spyCount); entry->setTags("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setTags(entry->tags()); QCOMPARE(spyModified.count(), spyCount); entry->setExpires(true); QCOMPARE(spyModified.count(), ++spyCount); entry->setExpires(entry->timeInfo().expires()); QCOMPARE(spyModified.count(), spyCount); entry->setExpiryTime(Tools::currentDateTimeUtc().addYears(1)); QCOMPARE(spyModified.count(), ++spyCount); entry->setExpiryTime(entry->timeInfo().expiryTime()); QCOMPARE(spyModified.count(), spyCount); entry->setAutoTypeEnabled(false); QCOMPARE(spyModified.count(), ++spyCount); entry->setAutoTypeEnabled(entry->autoTypeEnabled()); QCOMPARE(spyModified.count(), spyCount); entry->setAutoTypeObfuscation(1); QCOMPARE(spyModified.count(), ++spyCount); entry->setAutoTypeObfuscation(entry->autoTypeObfuscation()); QCOMPARE(spyModified.count(), spyCount); entry->setDefaultAutoTypeSequence("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setDefaultAutoTypeSequence(entry->defaultAutoTypeSequence()); QCOMPARE(spyModified.count(), spyCount); entry->setForegroundColor(Qt::red); QCOMPARE(spyModified.count(), ++spyCount); entry->setForegroundColor(entry->foregroundColor()); QCOMPARE(spyModified.count(), spyCount); entry->setBackgroundColor(Qt::red); QCOMPARE(spyModified.count(), ++spyCount); entry->setBackgroundColor(entry->backgroundColor()); QCOMPARE(spyModified.count(), spyCount); entry->setOverrideUrl("test"); QCOMPARE(spyModified.count(), ++spyCount); entry->setOverrideUrl(entry->overrideUrl()); QCOMPARE(spyModified.count(), spyCount); entry->attributes()->set("test key", "test value", false); QCOMPARE(spyModified.count(), ++spyCount); entry->attributes()->set("test key", entry->attributes()->value("test key"), false); QCOMPARE(spyModified.count(), spyCount); entry->attributes()->set("test key", entry->attributes()->value("test key"), true); QCOMPARE(spyModified.count(), ++spyCount); entry->attributes()->set("test key", "new test value", true); QCOMPARE(spyModified.count(), ++spyCount); entry->attributes()->set("test key2", "test value2", true); QCOMPARE(spyModified.count(), ++spyCount); entry->attributes()->set("test key2", entry->attributes()->value("test key2"), true); QCOMPARE(spyModified.count(), spyCount); delete db; }
void TestModified::testGroupSets() { int spyCount = 0; Database* db = new Database(); Group* root = db->rootGroup(); Group* g = new Group(); g->setParent(root); QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); root->setUuid(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); root->setUuid(root->uuid()); QCOMPARE(spyModified.count(), spyCount); root->setName("test"); QCOMPARE(spyModified.count(), ++spyCount); root->setName(root->name()); QCOMPARE(spyModified.count(), spyCount); root->setNotes("test"); QCOMPARE(spyModified.count(), ++spyCount); root->setNotes(root->notes()); QCOMPARE(spyModified.count(), spyCount); root->setIcon(1); QCOMPARE(spyModified.count(), ++spyCount); root->setIcon(root->iconNumber()); QCOMPARE(spyModified.count(), spyCount); root->setIcon(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); root->setIcon(root->iconUuid()); QCOMPARE(spyModified.count(), spyCount); g->setUuid(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); g->setUuid(g->uuid()); QCOMPARE(spyModified.count(), spyCount); g->setName("test"); QCOMPARE(spyModified.count(), ++spyCount); g->setName(g->name()); QCOMPARE(spyModified.count(), spyCount); g->setNotes("test"); QCOMPARE(spyModified.count(), ++spyCount); g->setNotes(g->notes()); QCOMPARE(spyModified.count(), spyCount); g->setIcon(1); QCOMPARE(spyModified.count(), ++spyCount); g->setIcon(g->iconNumber()); QCOMPARE(spyModified.count(), spyCount); g->setIcon(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); g->setIcon(g->iconUuid()); QCOMPARE(spyModified.count(), spyCount); delete db; }