Type-mem.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #if !defined(TYPE_MEM_H_)
00032 #define TYPE_MEM_H_
00033
00034 #include "symtabAPI/h/Type.h"
00035 #include "boost/static_assert.hpp"
00036
00037 namespace Dyninst {
00038 namespace SymtabAPI {
00039 extern std::map<void *, size_t> type_memory;
00040 }
00041 }
00042
00043 using namespace Dyninst;
00044 using namespace SymtabAPI;
00045
00046 template<class T>
00047 T *upgradePlaceholder(Type *placeholder, T *new_type)
00048 {
00049 void *mem = (void *) placeholder;
00050 assert(type_memory.count(mem));
00051 size_t size = type_memory[mem];
00052
00053 assert(sizeof(T) < size);
00054 memset(mem, 0, size);
00055
00056 T *ret = new(mem) T();
00057 assert(mem == (void *) ret);
00058 *ret = *new_type;
00059 return ret;
00060 }
00061
00062 template<class T>
00063 T* typeCollection::addOrUpdateType(T *type)
00064 {
00065
00066
00067
00068
00069 BOOST_STATIC_ASSERT(sizeof(T) != sizeof(Type));
00070
00071 Type *existingType = findTypeLocal(type->getID());
00072 if (!existingType)
00073 {
00074 if ( type->getName() != "" )
00075 {
00076 typesByName[ type->getName() ] = type;
00077 }
00078 typesByID[ type->getID() ] = type;
00079 type->incrRefCount();
00080 return type;
00081 }
00082
00083
00084
00085
00086
00087 T *existingT = dynamic_cast<T*>(existingType);
00088 if (existingT && (*existingT == *type))
00089 {
00090 return (T*) existingType;
00091 }
00092
00093 if (existingType->getDataClass() == dataUnknownType)
00094 {
00095 upgradePlaceholder(existingType, type);
00096 }
00097 else
00098 {
00099
00100 existingType->merge(type);
00101 }
00102
00103
00104 if ( existingType->getName() != "")
00105 {
00106 if (typesByName.find(existingType->getName()) != typesByName.end())
00107 {
00108 if (typesByName[ existingType->getName() ] != existingType)
00109 {
00110 typesByName[ existingType->getName() ]->decrRefCount();
00111 typesByName[ existingType->getName() ] = existingType;
00112 existingType->incrRefCount();
00113 }
00114 }
00115 else
00116 {
00117 typesByName[ existingType->getName() ] = existingType;
00118 existingType->incrRefCount();
00119 }
00120 }
00121
00122
00123 return (T*) existingType;
00124 }
00125
00126
00127 #endif