]> granicus.if.org Git - icu/commitdiff
ICU-21569 LSTM fix resource issue.
authorFrank Tang <ftang@chromium.org>
Thu, 13 May 2021 21:01:20 +0000 (21:01 +0000)
committerFrank Yung-Fong Tang <ftang@google.com>
Sat, 15 May 2021 17:10:37 +0000 (10:10 -0700)
See #1718

icu4c/source/common/lstmbe.cpp
icu4c/source/test/intltest/lstmbetst.cpp

index 3da2289a1a3bbaf8376a879227455853ee8a3e45..68c37866c6051f1e724c5483ccf5b23048275fb6 100644 (file)
@@ -373,13 +373,12 @@ struct LSTMData : public UMemory {
     ConstArray1D fOutputB;
 
 private:
-    UResourceBundle* fDataRes;
-    UResourceBundle* fDictRes;
+    UResourceBundle* fBundle;
 };
 
 LSTMData::LSTMData(UResourceBundle* rb, UErrorCode &status)
     : fDict(nullptr), fType(UNKNOWN), fName(nullptr),
-      fDataRes(nullptr), fDictRes(nullptr)
+      fBundle(rb)
 {
     if (U_FAILURE(status)) {
         return;
@@ -403,26 +402,25 @@ LSTMData::LSTMData(UResourceBundle* rb, UErrorCode &status)
         fType = GRAPHEME_CLUSTER;
     }
     fName = ures_getStringByKey(rb, "model", nullptr, &status);
-    fDataRes = ures_getByKey(rb, "data", nullptr, &status);
+    LocalUResourceBundlePointer dataRes(ures_getByKey(rb, "data", nullptr, &status));
     if (U_FAILURE(status)) return;
     int32_t data_len = 0;
-    const int32_t* data = ures_getIntVector(fDataRes, &data_len, &status);
-    if (U_FAILURE(status)) return;
-    fDictRes = ures_getByKey(rb, "dict", nullptr, &status);
-    if (U_FAILURE(status)) return;
-    U_ASSERT(fDictRes != nullptr);
-    int32_t num_index = ures_getSize(fDictRes);
+    const int32_t* data = ures_getIntVector(dataRes.getAlias(), &data_len, &status);
     fDict = uhash_open(uhash_hashUChars, uhash_compareUChars, nullptr, &status);
-    if (U_FAILURE(status)) return;
 
-    ures_resetIterator(fDictRes);
-    int32_t idx = 0;
+    StackUResourceBundle stackTempBundle;
+    ResourceDataValue value;
+    ures_getValueWithFallback(rb, "dict", stackTempBundle.getAlias(), value, status);
+    ResourceArray stringArray = value.getArray(status);
+    int32_t num_index = stringArray.getSize();
+    if (U_FAILURE(status)) { return; }
+
     // put dict into hash
-    while(ures_hasNext(fDictRes)) {
-        const char *tempKey = nullptr;
-        const UChar* str = ures_getNextString(fDictRes, nullptr, &tempKey, &status);
-        if (U_FAILURE(status)) return;
-        uhash_putiAllowZero(fDict, (void*)str, idx++, &status);
+    int32_t stringLength;
+    for (int32_t idx = 0; idx < num_index; idx++) {
+        stringArray.getValue(idx, value);
+        const UChar* str = value.getString(stringLength, status);
+        uhash_putiAllowZero(fDict, (void*)str, idx, &status);
         if (U_FAILURE(status)) return;
 #ifdef LSTM_VECTORIZER_DEBUG
         printf("Assign [");
@@ -468,8 +466,7 @@ LSTMData::LSTMData(UResourceBundle* rb, UErrorCode &status)
 
 LSTMData::~LSTMData() {
     uhash_close(fDict);
-    ures_close(fDictRes);
-    ures_close(fDataRes);
+    ures_close(fBundle);
 }
 
 class Vectorizer : public UMemory {
@@ -806,7 +803,7 @@ U_CAPI const LSTMData* U_EXPORT2 CreateLSTMDataForScript(UScriptCode script, UEr
         ures_openDirect(U_ICUDATA_BRKITR, namebuf.data(), &status));
     if (U_FAILURE(status)) return nullptr;
 
-    return CreateLSTMData(rb.getAlias(), status);
+    return CreateLSTMData(rb.orphan(), status);
 }
 
 U_CAPI const LSTMData* U_EXPORT2 CreateLSTMData(UResourceBundle* rb, UErrorCode& status)
index cbeaadf72c8c36cf59a198e7415b155bac82400e..8a6de0271155af8f3f5a2c3264b1334e9625b7e9 100644 (file)
@@ -229,7 +229,7 @@ const LanguageBreakEngine* LSTMBETest::createEngineFromTestData(
         return nullptr;
     }
 
-    const LSTMData* data = CreateLSTMData(rb.getAlias(), status);
+    const LSTMData* data = CreateLSTMData(rb.orphan(), status);
     if (U_FAILURE(status)) {
         dataerrln("Could not CreateLSTMData " + UnicodeString(model) + " under " +  UnicodeString(testdatapath) +  ", " +
                   UnicodeString(u_errorName(status)));