Simplify NativeEntry state (bug 5852 part 3, r=ds).
authorDavid Anderson <dvander@alliedmods.net>
Fri Aug 30 10:14:18 2013 -0700 (2013-08-30)
changeset 4108dabaea5ab45c
parent 4107 5a723cf42aee
child 4109 10eb68d668af
Simplify NativeEntry state (bug 5852 part 3, r=ds).
core/logic/NativeInvoker.cpp
core/logic/NativeOwner.cpp
core/logic/PluginSys.cpp
core/logic/ShareSys.cpp
core/logic/ShareSys.h
     1.1 --- a/core/logic/NativeInvoker.cpp	Fri Aug 30 10:12:44 2013 -0700
     1.2 +++ b/core/logic/NativeInvoker.cpp	Fri Aug 30 10:14:18 2013 -0700
     1.3 @@ -73,10 +73,10 @@
     1.4  	if (!entry)
     1.5  		return false;
     1.6  
     1.7 -	if (!entry->owner || !entry->func)
     1.8 +	if (!entry->owner || !entry->func())
     1.9  		return false;
    1.10  
    1.11 -	native_ = entry->func;
    1.12 +	native_ = entry->func();
    1.13  	context_ = pContext;
    1.14  
    1.15  	m_curparam = 0;
     2.1 --- a/core/logic/NativeOwner.cpp	Fri Aug 30 10:12:44 2013 -0700
     2.2 +++ b/core/logic/NativeOwner.cpp	Fri Aug 30 10:14:18 2013 -0700
     2.3 @@ -97,7 +97,7 @@
     2.4  		 */
     2.5  		else
     2.6  		{
     2.7 -			native->pfn = ref.entry->func;
     2.8 +			native->pfn = ref.entry->func();
     2.9  		}
    2.10  	}
    2.11  }
    2.12 @@ -125,7 +125,7 @@
    2.13  	List<NativeEntry *>::iterator ntv_iter = m_Natives.begin();
    2.14  	while (ntv_iter != m_Natives.end())
    2.15  	{
    2.16 -		g_ShareSys.ClearNativeFromCache(this, (*ntv_iter)->name);
    2.17 +		g_ShareSys.ClearNativeFromCache(this, (*ntv_iter)->name());
    2.18  		ntv_iter = m_Natives.erase(ntv_iter);
    2.19  	}
    2.20  }
     3.1 --- a/core/logic/PluginSys.cpp	Fri Aug 30 10:12:44 2013 -0700
     3.2 +++ b/core/logic/PluginSys.cpp	Fri Aug 30 10:14:18 2013 -0700
     3.3 @@ -625,7 +625,7 @@
     3.4  	{
     3.5  		pNative = (*iter);
     3.6  		/* Find this native! */
     3.7 -		if (m_pRuntime->FindNativeByName(pNative->name, &idx) != SP_ERROR_NONE)
     3.8 +		if (m_pRuntime->FindNativeByName(pNative->name(), &idx) != SP_ERROR_NONE)
     3.9  		{
    3.10  			continue;
    3.11  		}
     4.1 --- a/core/logic/ShareSys.cpp	Fri Aug 30 10:12:44 2013 -0700
     4.2 +++ b/core/logic/ShareSys.cpp	Fri Aug 30 10:14:18 2013 -0700
     4.3 @@ -309,7 +309,7 @@
     4.4  
     4.5  	pContext = pPlugin->GetBaseContext();
     4.6  
     4.7 -	if (pContext->FindNativeByName(pEntry->name, &i) != SP_ERROR_NONE)
     4.8 +	if (pContext->FindNativeByName(pEntry->name(), &i) != SP_ERROR_NONE)
     4.9  	{
    4.10  		return;
    4.11  	}
    4.12 @@ -336,7 +336,7 @@
    4.13  	native->user = pEntry;
    4.14  
    4.15  	/* Perform a bind. */
    4.16 -	native->pfn = pEntry->func;
    4.17 +	native->pfn = pEntry->func();
    4.18  
    4.19  	/* We don't bother with dependency crap if the owner is Core. */
    4.20  	if (pEntry->owner != &g_CoreNatives)
    4.21 @@ -379,28 +379,22 @@
    4.22  
    4.23  	if ((pEntry = FindNative(ntv->name)) == NULL)
    4.24  	{
    4.25 -		pEntry = new NativeEntry;
    4.26 -
    4.27 -		pEntry->owner = pOwner;
    4.28 -		pEntry->name = ntv->name;
    4.29 -		pEntry->func = ntv->func;
    4.30 -		pEntry->fake = NULL;
    4.31 -
    4.32 +		pEntry = new NativeEntry(pOwner, ntv);
    4.33  		m_NtvCache.insert(ntv->name, pEntry);
    4.34 -
    4.35  		return pEntry;
    4.36  	}
    4.37  
    4.38  	if (pEntry->owner != NULL)
    4.39 -	{
    4.40  		return NULL;
    4.41 -	}
    4.42  
    4.43  	pEntry->owner = pOwner;
    4.44 -	pEntry->func = ntv->func;
    4.45 -	pEntry->name = ntv->name;
    4.46 +	pEntry->native = NULL;
    4.47 +	return pEntry;
    4.48 +}
    4.49  
    4.50 -	return pEntry;
    4.51 +FakeNative::~FakeNative()
    4.52 +{
    4.53 +	g_pSourcePawn2->DestroyFakeNative(gate);
    4.54  }
    4.55  
    4.56  void ShareSystem::ClearNativeFromCache(CNativeOwner *pOwner, const char *name)
    4.57 @@ -408,60 +402,39 @@
    4.58  	NativeEntry *pEntry;
    4.59  
    4.60  	if ((pEntry = FindNative(name)) == NULL)
    4.61 -	{
    4.62  		return;
    4.63 -	}
    4.64  
    4.65  	if (pEntry->owner != pOwner)
    4.66 -	{
    4.67  		return;
    4.68 -	}
    4.69  
    4.70 -	if (pEntry->fake != NULL)
    4.71 -	{
    4.72 -		g_pSourcePawn2->DestroyFakeNative(pEntry->func);
    4.73 -		delete pEntry->fake;
    4.74 -		pEntry->fake = NULL;
    4.75 -	}
    4.76 -
    4.77 -	pEntry->func = NULL;
    4.78 -	pEntry->name = NULL;
    4.79 +	pEntry->fake = NULL;
    4.80 +	pEntry->native = NULL;
    4.81  	pEntry->owner = NULL;
    4.82  }
    4.83  
    4.84  NativeEntry *ShareSystem::AddFakeNative(IPluginFunction *pFunc, const char *name, SPVM_FAKENATIVE_FUNC func)
    4.85  {
    4.86 -	FakeNative *pFake;
    4.87  	NativeEntry *pEntry;
    4.88 -	SPVM_NATIVE_FUNC gate;
    4.89  
    4.90  	if ((pEntry = FindNative(name)) != NULL && pEntry->owner != NULL)
    4.91 -	{
    4.92  		return NULL;
    4.93 -	}
    4.94  
    4.95 -	pFake = new FakeNative;
    4.96 +	ke::AutoPtr<FakeNative> fake(new FakeNative(name, pFunc));
    4.97  
    4.98 -	if ((gate = g_pSourcePawn2->CreateFakeNative(func, pFake)) == NULL)
    4.99 -	{
   4.100 -		delete pFake;
   4.101 +	fake->gate = g_pSourcePawn2->CreateFakeNative(func, fake);
   4.102 +	if (!fake->gate)
   4.103  		return NULL;
   4.104 -	}
   4.105  
   4.106 -	if (pEntry == NULL)
   4.107 -	{
   4.108 -		pEntry = new NativeEntry;
   4.109 -		m_NtvCache.insert(name, pEntry);
   4.110 -	}
   4.111 +	CNativeOwner *owner = g_PluginSys.GetPluginByCtx(fake->ctx->GetContext());
   4.112  
   4.113 -	pFake->call = pFunc;
   4.114 -	pFake->ctx = pFunc->GetParentContext();
   4.115 -	smcore.strncopy(pFake->name, name, sizeof(pFake->name));
   4.116 -	
   4.117 -	pEntry->fake = pFake;
   4.118 -	pEntry->func = gate;
   4.119 -	pEntry->name = pFake->name;
   4.120 -	pEntry->owner = g_PluginSys.GetPluginByCtx(pFake->ctx->GetContext());
   4.121 +	if (!pEntry)
   4.122 +	{
   4.123 +		pEntry = new NativeEntry(owner, fake.take());
   4.124 +		m_NtvCache.insert(name, pEntry);
   4.125 +	} else {
   4.126 +		pEntry->owner = owner;
   4.127 +		pEntry->fake = fake.take();
   4.128 +	}
   4.129  
   4.130  	return pEntry;
   4.131  }
   4.132 @@ -527,7 +500,7 @@
   4.133  	if (!entry)
   4.134  		return FeatureStatus_Unknown;
   4.135  
   4.136 -	if (entry->owner && entry->func)
   4.137 +	if (entry->owner)
   4.138  		return FeatureStatus_Available;
   4.139  
   4.140  	return FeatureStatus_Unavailable;
     5.1 --- a/core/logic/ShareSys.h	Fri Aug 30 10:12:44 2013 -0700
     5.2 +++ b/core/logic/ShareSys.h	Fri Aug 30 10:14:18 2013 -0700
     5.3 @@ -34,6 +34,8 @@
     5.4  
     5.5  #include <IShareSys.h>
     5.6  #include <IHandleSys.h>
     5.7 +#include <am-string.h>
     5.8 +#include <am-utility.h>
     5.9  #include <sh_list.h>
    5.10  #include <sm_stringhashmap.h>
    5.11  #include <sm_namehashset.h>
    5.12 @@ -67,21 +69,60 @@
    5.13  
    5.14  struct FakeNative
    5.15  {
    5.16 -	char name[64];
    5.17 +	FakeNative(const char *name, IPluginFunction *fun)
    5.18 +		: name(name),
    5.19 +		  ctx(fun->GetParentContext()),
    5.20 +		  call(fun),
    5.21 +		  gate(NULL)
    5.22 +	{
    5.23 +	}
    5.24 +	~FakeNative();
    5.25 +
    5.26 +	ke::AString name;
    5.27  	IPluginContext *ctx;
    5.28  	IPluginFunction *call;
    5.29 +	SPVM_NATIVE_FUNC gate;
    5.30  };
    5.31  
    5.32  struct NativeEntry
    5.33  {
    5.34 +	NativeEntry(CNativeOwner *owner, const sp_nativeinfo_t *native)
    5.35 +		: owner(owner),
    5.36 +		  native(native),
    5.37 +		  fake(NULL)
    5.38 +	{
    5.39 +	}
    5.40 +	NativeEntry(CNativeOwner *owner, FakeNative *fake)
    5.41 +		: owner(owner),
    5.42 +		  native(NULL),
    5.43 +		  fake(fake)
    5.44 +	{
    5.45 +	}
    5.46 +
    5.47  	CNativeOwner *owner;
    5.48 -	SPVM_NATIVE_FUNC func;
    5.49 -	const char *name;
    5.50 -	FakeNative *fake;
    5.51 +	const sp_nativeinfo_t *native;
    5.52 +	ke::AutoPtr<FakeNative> fake;
    5.53 +
    5.54 +	SPVM_NATIVE_FUNC func() const
    5.55 +	{
    5.56 +		if (native)
    5.57 +			return native->func;
    5.58 +		if (fake)
    5.59 +			return fake->gate;
    5.60 +		return NULL;
    5.61 +	}
    5.62 +	const char *name() const
    5.63 +	{
    5.64 +		if (native)
    5.65 +			return native->name;
    5.66 +		if (fake)
    5.67 +			return fake->name.chars();
    5.68 +		return NULL;
    5.69 +	}
    5.70  
    5.71  	static inline bool matches(const char *name, const NativeEntry *entry)
    5.72  	{
    5.73 -		return strcmp(name, entry->name) == 0;
    5.74 +		return strcmp(name, entry->name()) == 0;
    5.75  	}
    5.76  };
    5.77