Simplify NativeEntry state (bug 5852 part 3, r=ds).
Simplify NativeEntry state (
bug 5852 part 3, r=ds).
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