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;