/* * Copyright 2010, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Config.h" #include "ScriptCached.h" #include <bcc/bcc_cache.h> #if USE_OLD_JIT #include "OldJIT/ContextManager.h" #endif #include "DebugHelper.h" #include <stdlib.h> namespace bcc { ScriptCached::~ScriptCached() { // Deallocate the bcc script context #if USE_OLD_JIT if (mContext) { ContextManager::get().deallocateContext(mContext); } #endif // Deallocate string pool, exported var list, exported func list if (mpStringPoolRaw) { free(mpStringPoolRaw); } if (mpExportVars) { free(mpExportVars); } if (mpExportFuncs) { free(mpExportFuncs); } if (mpObjectSlotList) { free(mpObjectSlotList); } } void ScriptCached::getExportVarList(size_t varListSize, void **varList) { if (varList) { size_t varCount = getExportVarCount(); if (varCount > varListSize) { varCount = varListSize; } memcpy(varList, mpExportVars->cached_addr_list, sizeof(void *) * varCount); } } void ScriptCached::getExportFuncList(size_t funcListSize, void **funcList) { if (funcList) { size_t funcCount = getExportFuncCount(); if (funcCount > funcListSize) { funcCount = funcListSize; } memcpy(funcList, mpExportFuncs->cached_addr_list, sizeof(void *) * funcCount); } } void ScriptCached::getPragmaList(size_t pragmaListSize, char const **keyList, char const **valueList) { size_t pragmaCount = getPragmaCount(); if (pragmaCount > pragmaListSize) { pragmaCount = pragmaListSize; } if (keyList) { for (size_t i = 0; i < pragmaCount; ++i) { *keyList++ = mPragmas[i].first; } } if (valueList) { for (size_t i = 0; i < pragmaCount; ++i) { *valueList++ = mPragmas[i].second; } } } void ScriptCached::getObjectSlotList(size_t objectSlotListSize, uint32_t *objectSlotList) { if (objectSlotList) { size_t objectSlotCount = getObjectSlotCount(); if (objectSlotCount > objectSlotListSize) { objectSlotCount = objectSlotListSize; } memcpy(objectSlotList, mpObjectSlotList->object_slot_list, sizeof(uint32_t) * objectSlotCount); } } void *ScriptCached::lookup(const char *name) { #if USE_MCJIT return rsloaderGetSymbolAddress(mRSExecutable, name); #endif FuncTable::const_iterator I = mFunctions.find(name); return (I == mFunctions.end()) ? NULL : I->second.first; } void ScriptCached::getFuncInfoList(size_t funcInfoListSize, FuncInfo *funcInfoList) { if (funcInfoList) { size_t funcCount = getFuncCount(); if (funcCount > funcInfoListSize) { funcCount = funcInfoListSize; } FuncInfo *info = funcInfoList; for (FuncTable::const_iterator I = mFunctions.begin(), E = mFunctions.end(); I != E && funcCount > 0; ++I, ++info, --funcCount) { info->name = I->first.c_str(); info->addr = I->second.first; info->size = I->second.second; } } } } // namespace bcc