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