void ShareSystem::BindNativesToPlugin(CPlugin *pPlugin, bool bCoreOnly) { uint32_t i, native_count; IPluginContext *pContext; pContext = pPlugin->GetBaseContext(); /* Generate a new serial ID, mark our dependencies with it. */ g_mark_serial++; pPlugin->PropagateMarkSerial(g_mark_serial); native_count = pContext->GetNativesNum(); for (i = 0; i < native_count; i++) { const sp_native_t *native = pContext->GetRuntime()->GetNative(i); if (!native) continue; // If we're already bound, no need to do anything else. if (native->status == SP_NATIVE_BOUND) continue; /* Otherwise, the native must be in our cache. */ Ref<Native> pEntry = FindNative(native->name); if (!pEntry) continue; if (bCoreOnly && pEntry->owner != &g_CoreNatives) continue; BindNativeToPlugin(pPlugin, native, i, pEntry); } }
void CNativeOwner::UnbindWeakRef(const WeakNative &ref) { IPluginContext *pContext; pContext = ref.pl->GetBaseContext(); pContext->GetRuntime()->UpdateNativeBinding( ref.idx, nullptr, 0, nullptr); }
void ShareSystem::BindNativeToPlugin(CPlugin *pPlugin, const Ref<Native> &entry) { if (!entry->owner) return; IPluginContext *pContext = pPlugin->GetBaseContext(); uint32_t i; if (pContext->FindNativeByName(entry->name(), &i) != SP_ERROR_NONE) return; const sp_native_t *native = pContext->GetRuntime()->GetNative(i); if (!native) return; if (native->status == SP_NATIVE_BOUND) return; BindNativeToPlugin(pPlugin, native, i, entry); }