Add sublinear indexing of objects, outline of support for fixing the object identity problem. git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6099 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/plugins/npapi/LocalObjectTable.cpp b/plugins/npapi/LocalObjectTable.cpp index a450381..cc2a4ad 100644 --- a/plugins/npapi/LocalObjectTable.cpp +++ b/plugins/npapi/LocalObjectTable.cpp
@@ -6,3 +6,16 @@ freeAll(); } } + +void* LocalObjectTable::getIdentityFrom(NPObject* obj) { + void** rawPtr = reinterpret_cast<void**>(reinterpret_cast<char*>(obj) + sizeof(NPClass*) + + sizeof(uint32_t)); + Debug::log(Debug::Info) << "getIdentity(obj=" << (void*)obj << "): class=" << (void*)obj->_class + << ", bytes:"; + for (int i = 0; i< 4; ++i) { + Debug::log(Debug::Info) << " " << rawPtr[i]; + } + Debug::log(Debug::Info) << Debug::flush; + return obj; +} +
diff --git a/plugins/npapi/LocalObjectTable.h b/plugins/npapi/LocalObjectTable.h index cc8beb7..857d2e6 100644 --- a/plugins/npapi/LocalObjectTable.h +++ b/plugins/npapi/LocalObjectTable.h
@@ -18,6 +18,7 @@ #include <vector> #include <algorithm> +#include <map> #include "Debug.h" @@ -29,6 +30,7 @@ int nextFree; std::vector<NPObject*> objects; + std::map<void*, int> objectIndex; bool dontFree; bool isFree(int id) { @@ -41,6 +43,16 @@ objects[id] = reinterpret_cast<NPObject*>((nextFree << 1) | 1LL); nextFree = id; } + + int findIndex(void* ptr) { + std::map<void*, int>::iterator it = objectIndex.find(ptr); + if (it == objectIndex.end()) { + return -1; + } + return it->second; + } + + static void* getIdentityFrom(NPObject* obj); public: LocalObjectTable() { nextFree = -1; @@ -51,7 +63,8 @@ virtual ~LocalObjectTable(); int add(NPObject* obj) { - int id = find(obj); + void* objId = getIdentityFrom(obj); + int id = findIndex(objId); if (id >= 0) { Debug::log(Debug::Spam) << "LocalObjectTable::add(obj=" << obj << "): returning old id=" << id << Debug::flush; @@ -65,6 +78,7 @@ id = static_cast<int>(objects.size()); objects.push_back(obj); } + objectIndex[objId] = id; Debug::log(Debug::Spam) << "LocalObjectTable::add(obj=" << obj << "): id=" << id << Debug::flush; // keep track that we hold a reference in the table @@ -72,13 +86,9 @@ return id; } - // TODO(jat): sublinear search int find(NPObject* obj) { - std::vector<NPObject*>::iterator it = std::find(objects.begin(), objects.end(), obj); - if (it == objects.end()) { - return -1; - } - return static_cast<int>(it - objects.begin()); + void* objId = getIdentityFrom(obj); + return findIndex(objId); } void free(int id) {