core/logic/ShareSys.cpp
changeset 4108 dabaea5ab45c
parent 4106 a39557bde4ac
child 4109 10eb68d668af
     1.1 --- a/core/logic/ShareSys.cpp	Fri Aug 30 10:12:44 2013 -0700
     1.2 +++ b/core/logic/ShareSys.cpp	Fri Aug 30 10:14:18 2013 -0700
     1.3 @@ -309,7 +309,7 @@
     1.4  
     1.5  	pContext = pPlugin->GetBaseContext();
     1.6  
     1.7 -	if (pContext->FindNativeByName(pEntry->name, &i) != SP_ERROR_NONE)
     1.8 +	if (pContext->FindNativeByName(pEntry->name(), &i) != SP_ERROR_NONE)
     1.9  	{
    1.10  		return;
    1.11  	}
    1.12 @@ -336,7 +336,7 @@
    1.13  	native->user = pEntry;
    1.14  
    1.15  	/* Perform a bind. */
    1.16 -	native->pfn = pEntry->func;
    1.17 +	native->pfn = pEntry->func();
    1.18  
    1.19  	/* We don't bother with dependency crap if the owner is Core. */
    1.20  	if (pEntry->owner != &g_CoreNatives)
    1.21 @@ -379,28 +379,22 @@
    1.22  
    1.23  	if ((pEntry = FindNative(ntv->name)) == NULL)
    1.24  	{
    1.25 -		pEntry = new NativeEntry;
    1.26 -
    1.27 -		pEntry->owner = pOwner;
    1.28 -		pEntry->name = ntv->name;
    1.29 -		pEntry->func = ntv->func;
    1.30 -		pEntry->fake = NULL;
    1.31 -
    1.32 +		pEntry = new NativeEntry(pOwner, ntv);
    1.33  		m_NtvCache.insert(ntv->name, pEntry);
    1.34 -
    1.35  		return pEntry;
    1.36  	}
    1.37  
    1.38  	if (pEntry->owner != NULL)
    1.39 -	{
    1.40  		return NULL;
    1.41 -	}
    1.42  
    1.43  	pEntry->owner = pOwner;
    1.44 -	pEntry->func = ntv->func;
    1.45 -	pEntry->name = ntv->name;
    1.46 +	pEntry->native = NULL;
    1.47 +	return pEntry;
    1.48 +}
    1.49  
    1.50 -	return pEntry;
    1.51 +FakeNative::~FakeNative()
    1.52 +{
    1.53 +	g_pSourcePawn2->DestroyFakeNative(gate);
    1.54  }
    1.55  
    1.56  void ShareSystem::ClearNativeFromCache(CNativeOwner *pOwner, const char *name)
    1.57 @@ -408,60 +402,39 @@
    1.58  	NativeEntry *pEntry;
    1.59  
    1.60  	if ((pEntry = FindNative(name)) == NULL)
    1.61 -	{
    1.62  		return;
    1.63 -	}
    1.64  
    1.65  	if (pEntry->owner != pOwner)
    1.66 -	{
    1.67  		return;
    1.68 -	}
    1.69  
    1.70 -	if (pEntry->fake != NULL)
    1.71 -	{
    1.72 -		g_pSourcePawn2->DestroyFakeNative(pEntry->func);
    1.73 -		delete pEntry->fake;
    1.74 -		pEntry->fake = NULL;
    1.75 -	}
    1.76 -
    1.77 -	pEntry->func = NULL;
    1.78 -	pEntry->name = NULL;
    1.79 +	pEntry->fake = NULL;
    1.80 +	pEntry->native = NULL;
    1.81  	pEntry->owner = NULL;
    1.82  }
    1.83  
    1.84  NativeEntry *ShareSystem::AddFakeNative(IPluginFunction *pFunc, const char *name, SPVM_FAKENATIVE_FUNC func)
    1.85  {
    1.86 -	FakeNative *pFake;
    1.87  	NativeEntry *pEntry;
    1.88 -	SPVM_NATIVE_FUNC gate;
    1.89  
    1.90  	if ((pEntry = FindNative(name)) != NULL && pEntry->owner != NULL)
    1.91 -	{
    1.92  		return NULL;
    1.93 -	}
    1.94  
    1.95 -	pFake = new FakeNative;
    1.96 +	ke::AutoPtr<FakeNative> fake(new FakeNative(name, pFunc));
    1.97  
    1.98 -	if ((gate = g_pSourcePawn2->CreateFakeNative(func, pFake)) == NULL)
    1.99 -	{
   1.100 -		delete pFake;
   1.101 +	fake->gate = g_pSourcePawn2->CreateFakeNative(func, fake);
   1.102 +	if (!fake->gate)
   1.103  		return NULL;
   1.104 -	}
   1.105  
   1.106 -	if (pEntry == NULL)
   1.107 -	{
   1.108 -		pEntry = new NativeEntry;
   1.109 -		m_NtvCache.insert(name, pEntry);
   1.110 -	}
   1.111 +	CNativeOwner *owner = g_PluginSys.GetPluginByCtx(fake->ctx->GetContext());
   1.112  
   1.113 -	pFake->call = pFunc;
   1.114 -	pFake->ctx = pFunc->GetParentContext();
   1.115 -	smcore.strncopy(pFake->name, name, sizeof(pFake->name));
   1.116 -	
   1.117 -	pEntry->fake = pFake;
   1.118 -	pEntry->func = gate;
   1.119 -	pEntry->name = pFake->name;
   1.120 -	pEntry->owner = g_PluginSys.GetPluginByCtx(pFake->ctx->GetContext());
   1.121 +	if (!pEntry)
   1.122 +	{
   1.123 +		pEntry = new NativeEntry(owner, fake.take());
   1.124 +		m_NtvCache.insert(name, pEntry);
   1.125 +	} else {
   1.126 +		pEntry->owner = owner;
   1.127 +		pEntry->fake = fake.take();
   1.128 +	}
   1.129  
   1.130  	return pEntry;
   1.131  }
   1.132 @@ -527,7 +500,7 @@
   1.133  	if (!entry)
   1.134  		return FeatureStatus_Unknown;
   1.135  
   1.136 -	if (entry->owner && entry->func)
   1.137 +	if (entry->owner)
   1.138  		return FeatureStatus_Available;
   1.139  
   1.140  	return FeatureStatus_Unavailable;