greatly optimized the process of mapping plugin natives from Core

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401388
This commit is contained in:
David Anderson 2007-08-29 00:47:05 +00:00
parent 08ae85bdb3
commit f145178fc0
5 changed files with 51 additions and 11 deletions

View File

@ -769,6 +769,7 @@ CPluginManager::CPluginManager()
m_AllPluginsLoaded = false;
m_MyIdent = NULL;
m_pNativeLookup = sm_trie_create();
m_pCoreNatives = sm_trie_create();
}
CPluginManager::~CPluginManager()
@ -780,6 +781,7 @@ CPluginManager::~CPluginManager()
*/
sm_trie_destroy(m_LoadLookup);
sm_trie_destroy(m_pNativeLookup);
sm_trie_destroy(m_pCoreNatives);
CStack<CPluginManager::CPluginIterator *>::iterator iter;
for (iter=m_iters.begin(); iter!=m_iters.end(); iter++)
@ -1325,18 +1327,28 @@ bool CPluginManager::RunSecondPass(CPlugin *pPlugin, char *error, size_t maxleng
void CPluginManager::AddCoreNativesToPlugin(CPlugin *pPlugin)
{
List<sp_nativeinfo_t *>::iterator iter;
IPluginContext *pContext = pPlugin->GetBaseContext();
sp_context_t *ctx = pContext->GetContext();
for (iter=m_natives.begin(); iter!=m_natives.end(); iter++)
uint32_t natives = pContext->GetNativesNum();
sp_native_t *native;
SPVM_NATIVE_FUNC pfn;
for (uint32_t i=0; i<natives; i++)
{
sp_nativeinfo_t *natives = (*iter);
IPluginContext *ctx = pPlugin->GetBaseContext();
unsigned int i=0;
/* Attempt to bind every native! */
while (natives[i].func != NULL)
if (pContext->GetNativeByIndex(i, &native) != SP_ERROR_NONE)
{
ctx->BindNative(&natives[i++]);
continue;
}
if (native->status == SP_NATIVE_BOUND)
{
continue;
}
if (!sm_trie_retrieve(m_pCoreNatives, native->name, (void **)&pfn))
{
continue;
}
pContext->BindNativeToIndex(i, pfn);
}
}
@ -1854,7 +1866,10 @@ void CPluginManager::OnHandleDestroy(HandleType_t type, void *object)
void CPluginManager::RegisterNativesFromCore(sp_nativeinfo_t *natives)
{
m_natives.push_back(natives);
for (unsigned int i = 0; natives[i].func != NULL; i++)
{
sm_trie_insert(m_pCoreNatives, natives[i].name, natives[i].func);
}
}
IPlugin *CPluginManager::PluginFromHandle(Handle_t handle, HandleError *err)

View File

@ -485,12 +485,12 @@ private:
private:
List<IPluginsListener *> m_listeners;
List<CPlugin *> m_plugins;
List<sp_nativeinfo_t *> m_natives;
CStack<CPluginManager::CPluginIterator *> m_iters;
CPluginInfoDatabase m_PluginInfo;
Trie *m_LoadLookup;
bool m_AllPluginsLoaded;
IdentityToken_t *m_MyIdent;
Trie *m_pCoreNatives;
/* Dynamic native stuff */
List<FakeNative *> m_Natives;

View File

@ -642,6 +642,22 @@ int BaseContext::BindNative(const sp_nativeinfo_t *native)
return SP_ERROR_NONE;
}
int BaseContext::BindNativeToIndex(uint32_t index, SPVM_NATIVE_FUNC native)
{
int err;
sp_native_t *native;
if ((err = GetNativeByIndex(index, &native)) != SP_ERROR_NONE)
{
return err;
}
ctx->natives[index].pfn = native;
ctx->natives[index].status = SP_NATIVE_BOUND;
return SP_ERROR_NONE;
}
int BaseContext::BindNativeToAny(SPVM_NATIVE_FUNC native)
{
uint32_t nativesnum, i;

View File

@ -89,6 +89,7 @@ namespace SourcePawn
cell_t *GetNullRef(SP_NULL_TYPE type);
int LocalToStringNULL(cell_t local_addr, char **addr);
#endif
int BindNativeToIndex(uint32_t index, SPVM_NATIVE_FUNC native);
public: //IPluginDebugInfo
int LookupFile(ucell_t addr, const char **filename);
int LookupFunction(ucell_t addr, const char **name);

View File

@ -44,7 +44,7 @@
#define SOURCEPAWN_ENGINE_API_VERSION 1
/** SourcePawn VM API Version */
#define SOURCEPAWN_VM_API_VERSION 4
#define SOURCEPAWN_VM_API_VERSION 5
#if !defined SOURCEMOD_BUILD
#define SOURCEMOD_BUILD
@ -591,6 +591,14 @@ namespace SourcePawn
*/
virtual int LocalToStringNULL(cell_t local_addr, char **addr) =0;
#endif
/**
* @brief Binds a single native to a given native index.
*
* @param index Index to bind at.
* @param native Native function to bind.
*/
virtual int BindNativeToIndex(uint32_t index, SPVM_NATIVE_FUNC native) =0;
};