blob: a7d21f74f4df98f6bf339ec0cbf88499fcec1f29 [file] [log] [blame]
/*
* 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