From 5b7688bbb5ed01b534570e86a91ae1c724e23100 Mon Sep 17 00:00:00 2001 From: Keisuke Kuroynagi Date: Tue, 23 Jul 2013 13:13:12 +0900 Subject: [PATCH] Fix: native crash while iterating bigramslist. Bug: 9964153 Change-Id: Ia2eb922b61300a7c0e34122cd6c18358f1ee7ba9 --- .../suggest/core/dictionary/bigram_dictionary.cpp | 14 +++++++------- .../src/suggest/core/dictionary/multi_bigram_map.h | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp index 618a9d2d5..09eecd348 100644 --- a/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp +++ b/native/jni/src/suggest/core/dictionary/bigram_dictionary.cpp @@ -120,8 +120,8 @@ int BigramDictionary::getPredictions(const int *prevWord, int prevWordLength, in int bigramCount = 0; int unigramProbability = 0; int bigramBuffer[MAX_WORD_LENGTH]; - for (BinaryDictionaryBigramsIterator bigramsIt(mBinaryDictionaryInfo, pos); - bigramsIt.hasNext(); /* no-op */) { + BinaryDictionaryBigramsIterator bigramsIt(mBinaryDictionaryInfo, pos); + while (bigramsIt.hasNext()) { bigramsIt.next(); const int length = mBinaryDictionaryInfo->getStructurePolicy()-> getCodePointsAndProbabilityAndReturnCodePointCount( @@ -147,13 +147,13 @@ int BigramDictionary::getPredictions(const int *prevWord, int prevWordLength, in } // Returns a pointer to the start of the bigram list. -// If the word is not found or has no bigrams, this function returns 0. +// If the word is not found or has no bigrams, this function returns NOT_A_DICT_POS. int BigramDictionary::getBigramListPositionForWord(const int *prevWord, const int prevWordLength, const bool forceLowerCaseSearch) const { - if (0 >= prevWordLength) return 0; + if (0 >= prevWordLength) return NOT_A_DICT_POS; int pos = mBinaryDictionaryInfo->getStructurePolicy()->getTerminalNodePositionOfWord( mBinaryDictionaryInfo, prevWord, prevWordLength, forceLowerCaseSearch); - if (NOT_A_VALID_WORD_POS == pos) return 0; + if (NOT_A_VALID_WORD_POS == pos) return NOT_A_DICT_POS; return mBinaryDictionaryInfo->getStructurePolicy()->getBigramsPositionOfNode( mBinaryDictionaryInfo, pos); } @@ -183,8 +183,8 @@ bool BigramDictionary::isValidBigram(const int *word0, int length0, const int *w mBinaryDictionaryInfo, word1, length1, false /* forceLowerCaseSearch */); if (NOT_A_VALID_WORD_POS == nextWordPos) return false; - for (BinaryDictionaryBigramsIterator bigramsIt(mBinaryDictionaryInfo, pos); - bigramsIt.hasNext(); /* no-op */) { + BinaryDictionaryBigramsIterator bigramsIt(mBinaryDictionaryInfo, pos); + while (bigramsIt.hasNext()) { bigramsIt.next(); if (bigramsIt.getBigramPos() == nextWordPos) { return true; diff --git a/native/jni/src/suggest/core/dictionary/multi_bigram_map.h b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h index 12f1d08b9..d5eafe1bf 100644 --- a/native/jni/src/suggest/core/dictionary/multi_bigram_map.h +++ b/native/jni/src/suggest/core/dictionary/multi_bigram_map.h @@ -69,8 +69,8 @@ class MultiBigramMap { void init(const BinaryDictionaryInfo *const binaryDictionaryInfo, const int nodePos) { const int bigramsListPos = binaryDictionaryInfo->getStructurePolicy()-> getBigramsPositionOfNode(binaryDictionaryInfo, nodePos); - for (BinaryDictionaryBigramsIterator bigramsIt(binaryDictionaryInfo, bigramsListPos); - bigramsIt.hasNext(); /* no-op */) { + BinaryDictionaryBigramsIterator bigramsIt(binaryDictionaryInfo, bigramsListPos); + while (bigramsIt.hasNext()) { bigramsIt.next(); mBigramMap[bigramsIt.getBigramPos()] = bigramsIt.getProbability(); mBloomFilter.setInFilter(bigramsIt.getBigramPos()); @@ -109,8 +109,8 @@ class MultiBigramMap { const int nextWordPosition, const int unigramProbability) { const int bigramsListPos = binaryDictionaryInfo->getStructurePolicy()-> getBigramsPositionOfNode(binaryDictionaryInfo, nodePos); - for (BinaryDictionaryBigramsIterator bigramsIt(binaryDictionaryInfo, bigramsListPos); - bigramsIt.hasNext(); /* no-op */) { + BinaryDictionaryBigramsIterator bigramsIt(binaryDictionaryInfo, bigramsListPos); + while (bigramsIt.hasNext()) { bigramsIt.next(); if (bigramsIt.getBigramPos() == nextWordPosition) { return ProbabilityUtils::computeProbabilityForBigram(