ScriptCompiled.cpp revision 2a6dc82a465631f82fc589c6bc68c15ed264f7eb
12a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan/* 22a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * Copyright 2010, The Android Open Source Project 32a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * 42a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * Licensed under the Apache License, Version 2.0 (the "License"); 52a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * you may not use this file except in compliance with the License. 62a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * You may obtain a copy of the License at 72a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * 82a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * http://www.apache.org/licenses/LICENSE-2.0 92a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * 102a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * Unless required by applicable law or agreed to in writing, software 112a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * distributed under the License is distributed on an "AS IS" BASIS, 122a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * See the License for the specific language governing permissions and 142a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan * limitations under the License. 152a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan */ 162a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 172a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#define LOG_TAG "bcc" 182a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#include <cutils/log.h> 192a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 202a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#include "ScriptCompiled.h" 212a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 222a6dc82a465631f82fc589c6bc68c15ed264f7ebLogannamespace bcc { 232a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 242a6dc82a465631f82fc589c6bc68c15ed264f7ebLoganvoid ScriptCompiled::getExportVars(BCCsizei *actualVarCount, 252a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCsizei maxVarCount, 262a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCvoid **vars) { 272a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan int varCount; 282a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 292a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#if 0 302a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 312a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = static_cast<int>(mCacheHdr->exportVarsCount); 322a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualVarCount) 332a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualVarCount = varCount; 342a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (varCount > maxVarCount) 352a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = maxVarCount; 362a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (vars) { 372a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan uint32_t *cachedVars = (uint32_t *)(mCacheMapAddr + 382a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan mCacheHdr->exportVarsOffset); 392a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 402a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (int i = 0; i < varCount; i++) { 412a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *vars = (BCCvoid *)((char *)(*cachedVars) + mCacheDiff); 422a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan vars++; 432a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan cachedVars++; 442a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 452a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 462a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan return; 472a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 482a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#endif 492a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 502a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = mExportVars.size(); 512a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualVarCount) 522a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualVarCount = varCount; 532a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (varCount > maxVarCount) 542a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan varCount = maxVarCount; 552a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (vars) { 562a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (ExportVarList::const_iterator 572a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan I = mExportVars.begin(), E = mExportVars.end(); I != E; I++) { 582a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *vars++ = *I; 592a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 602a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 612a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 622a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 632a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 642a6dc82a465631f82fc589c6bc68c15ed264f7ebLoganvoid ScriptCompiled::getExportFuncs(BCCsizei *actualFuncCount, 652a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCsizei maxFuncCount, 662a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCvoid **funcs) { 672a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan int funcCount; 682a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 692a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#if 0 702a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 712a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = static_cast<int>(mCacheHdr->exportFuncsCount); 722a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualFuncCount) 732a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualFuncCount = funcCount; 742a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcCount > maxFuncCount) 752a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = maxFuncCount; 762a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcs) { 772a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan uint32_t *cachedFuncs = (uint32_t *)(mCacheMapAddr + 782a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan mCacheHdr->exportFuncsOffset); 792a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 802a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (int i = 0; i < funcCount; i++) { 812a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *funcs = (BCCvoid *)((char *)(*cachedFuncs) + mCacheDiff); 822a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcs++; 832a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan cachedFuncs++; 842a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 852a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 862a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan return; 872a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 882a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#endif 892a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 902a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = mExportFuncs.size(); 912a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualFuncCount) 922a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualFuncCount = funcCount; 932a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcCount > maxFuncCount) 942a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan funcCount = maxFuncCount; 952a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (funcs) { 962a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (ExportFuncList::const_iterator 972a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan I = mExportFuncs.begin(), E = mExportFuncs.end(); I != E; I++) { 982a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *funcs++ = *I; 992a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1002a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1012a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 1022a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1032a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1042a6dc82a465631f82fc589c6bc68c15ed264f7ebLoganvoid ScriptCompiled::getPragmas(BCCsizei *actualStringCount, 1052a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCsizei maxStringCount, 1062a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan BCCchar **strings) { 1072a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan int stringCount; 1082a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1092a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#if 0 1102a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (mUseCache && mCacheFd >= 0 && !mCacheNew) { 1112a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = static_cast<int>(mCacheHdr->exportPragmasCount) * 2; 1122a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1132a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualStringCount) 1142a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualStringCount = stringCount; 1152a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1162a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (stringCount > maxStringCount) 1172a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = maxStringCount; 1182a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1192a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (strings) { 1202a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan char *pragmaTab = mCacheMapAddr + mCacheHdr->exportPragmasOffset; 1212a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1222a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan oBCCPragmaEntry *cachedPragmaEntries = (oBCCPragmaEntry *)pragmaTab; 1232a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1242a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (int i = 0; stringCount >= 2; stringCount -= 2, i++) { 1252a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = pragmaTab + cachedPragmaEntries[i].pragmaNameOffset; 1262a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = pragmaTab + cachedPragmaEntries[i].pragmaValueOffset; 1272a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1282a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1292a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1302a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan return; 1312a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1322a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan#endif 1332a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1342a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = mPragmas.size() * 2; 1352a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1362a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (actualStringCount) 1372a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *actualStringCount = stringCount; 1382a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (stringCount > maxStringCount) 1392a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount = maxStringCount; 1402a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan if (strings) { 1412a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan size_t i = 0; 1422a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan for (PragmaList::const_iterator it = mPragmas.begin(); 1432a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan stringCount >= 2; stringCount -= 2, it++, ++i) { 1442a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = const_cast<BCCchar*>(it->first.c_str()); 1452a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan *strings++ = const_cast<BCCchar*>(it->second.c_str()); 1462a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1472a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan } 1482a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} 1492a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 1502a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan} // namespace bcc 151