11e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* 21e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Copyright 2012, The Android Open Source Project 31e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * 41e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 51e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * you may not use this file except in compliance with the License. 61e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * You may obtain a copy of the License at 71e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * 81e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 91e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * 101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Unless required by applicable law or agreed to in writing, software 111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * See the License for the specific language governing permissions and 141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * limitations under the License. 151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang */ 161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang//===----------------------------------------------------------------------===// 181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// This file implements RSInfo::write() 191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang//===----------------------------------------------------------------------===// 201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 21e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines#include "bcc/Renderscript/RSInfo.h" 221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 23ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h" 24c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/OutputFile.h" 251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changusing namespace bcc; 271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace { 291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename ItemType, typename ItemContainer> inline bool 311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item(ItemType &pResult, const RSInfo &pInfo, 321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const typename ItemContainer::const_iterator &pItem); 331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::DependencyTableItem, RSInfo::DependencyTableTy>( 361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::DependencyTableItem &pResult, 371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo::DependencyTableTy::const_iterator &pItem) { 391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.id = pInfo.getStringIdxInPool(pItem->first); 401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.sha1 = 411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pInfo.getStringIdxInPool(reinterpret_cast<const char *>(pItem->second)); 421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.id == rsinfo::gInvalidStringIndex) { 441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS dependency table contains invalid source id string '%s'.", 451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pItem->first); 461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.sha1 == rsinfo::gInvalidStringIndex) { 501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS dependency table contains invalid SHA-1 checksum string in '%s'.", 511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pItem->first); 521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::PragmaItem, RSInfo::PragmaListTy>( 601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::PragmaItem &pResult, 611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo::PragmaListTy::const_iterator &pItem) { 631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.key = pInfo.getStringIdxInPool(pItem->first); 641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.value = pInfo.getStringIdxInPool(pItem->second); 651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.key == rsinfo::gInvalidStringIndex) { 671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS pragma list contains invalid string '%s' for key.", pItem->first); 681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.value == rsinfo::gInvalidStringIndex) { 721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS pragma list contains invalid string '%s' for value.", 731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pItem->second); 741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ObjectSlotItem, RSInfo::ObjectSlotListTy>( 821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::ObjectSlotItem &pResult, 831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo::ObjectSlotListTy::const_iterator &pItem) { 851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.slot = *pItem; 861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ExportVarNameItem, RSInfo::ExportVarNameListTy>( 911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::ExportVarNameItem &pResult, 921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo::ExportVarNameListTy::const_iterator &pItem) { 941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.name = pInfo.getStringIdxInPool(*pItem); 951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.name == rsinfo::gInvalidStringIndex) { 971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS export vars contains invalid string '%s' for name.", *pItem); 981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 1051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ExportFuncNameItem, 1061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::ExportFuncNameListTy>( 1071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::ExportFuncNameItem &pResult, 1081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 1091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo::ExportFuncNameListTy::const_iterator &pItem) { 1101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.name = pInfo.getStringIdxInPool(*pItem); 1111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.name == rsinfo::gInvalidStringIndex) { 1131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS export funcs contains invalid string '%s' for name.", *pItem); 1141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 1211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ExportForeachFuncItem, 1221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::ExportForeachFuncListTy>( 1231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::ExportForeachFuncItem &pResult, 1241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 1251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo::ExportForeachFuncListTy::const_iterator &pItem) { 1261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.name = pInfo.getStringIdxInPool(pItem->first); 1271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.signature = pItem->second; 1281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pResult.name == rsinfo::gInvalidStringIndex) { 1301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("RS export foreach contains invalid string '%s' for name.", 1311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pItem->first); 1321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename ItemType, typename ItemContainer> 1391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline bool helper_write_list(OutputFile &pOutput, 1401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 1411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::ListHeader &pHeader, 1421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ItemContainer &pList) { 1431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ItemType item; 1441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang for (typename ItemContainer::const_iterator item_iter = pList.begin(), 1461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang item_end = pList.end(); item_iter != item_end; item_iter++) { 1471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Convert each entry in the pList to ItemType. 1481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_adapt_list_item<ItemType, ItemContainer>(item, 1491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pInfo, 1501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang item_iter)) { 1511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // And write out an item. 1541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pOutput.write(&item, sizeof(item)) != sizeof(item)) { 1551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Cannot write out item of %s for RSInfo file %s! (%s)", 1561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang rsinfo::GetItemTypeName<ItemType>(), pOutput.getName().c_str(), 1571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pOutput.getErrorMessage().c_str()); 1581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end anonymous namespace 1661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changbool RSInfo::write(OutputFile &pOutput) { 1681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang off_t initial_offset = pOutput.tell(); 1691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *output_filename = pOutput.getName().c_str(); 1701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pOutput.hasError()) { 1721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid RS info file %s for output! (%s)", 1731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang output_filename, pOutput.getErrorMessage().c_str()); 1741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Layout. 1781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!layout(initial_offset)) { 1791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write header. 1831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pOutput.write(&mHeader, sizeof(mHeader)) != sizeof(mHeader)) { 1841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Cannot write out the header for RSInfo file %s! (%s)", 1851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang output_filename, pOutput.getErrorMessage().c_str()); 1861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write string pool. 1901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (static_cast<size_t>(pOutput.write(mStringPool, mHeader.strPoolSize)) 1911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang != mHeader.strPoolSize) { 1921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Cannot write out the string pool for RSInfo file %s! (%s)", 1931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang output_filename, pOutput.getErrorMessage().c_str()); 1941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write dependencyTable. 1981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_write_list<rsinfo::DependencyTableItem, DependencyTableTy> 1991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (pOutput, *this, mHeader.dependencyTable, mDependencyTable)) { 2001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 2011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write pragmaList. 2041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_write_list<rsinfo::PragmaItem, PragmaListTy> 2051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (pOutput, *this, mHeader.pragmaList, mPragmas)) { 2061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 2071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write objectSlotList. 2101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_write_list<rsinfo::ObjectSlotItem, ObjectSlotListTy> 2111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (pOutput, *this, mHeader.objectSlotList, mObjectSlots)) { 2121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 2131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write exportVarNameList. 2161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_write_list<rsinfo::ExportVarNameItem, ExportVarNameListTy> 2171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (pOutput, *this, mHeader.exportVarNameList, mExportVarNames)) { 2181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 2191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write exportFuncNameList. 2221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_write_list<rsinfo::ExportFuncNameItem, ExportFuncNameListTy> 2231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (pOutput, *this, mHeader.exportFuncNameList, mExportFuncNames)) { 2241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 2251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Write exportForeachFuncList. 2281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_write_list<rsinfo::ExportForeachFuncItem, ExportForeachFuncListTy> 2291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (pOutput, *this, mHeader.exportForeachFuncList, mExportForeachFuncs)) { 2301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 2311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 2341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 235