void* _ExtensionInfo_Copy( void* extensionInfo, void* dest, Bool deep, Name nameExt, struct PtrMap* ptrMap ) { ExtensionInfo* self = (ExtensionInfo*)extensionInfo; ExtensionInfo* newExtensionInfo; /* Copy parent */ newExtensionInfo = (ExtensionInfo*)_Stg_Object_Copy( self, dest, deep, nameExt, ptrMap ); newExtensionInfo->_dataCopy = self->_dataCopy; newExtensionInfo->key = self->key; newExtensionInfo->originalSize = self->originalSize; newExtensionInfo->size = self->size; newExtensionInfo->isRegistered = self->isRegistered; newExtensionInfo->itemSize = self->itemSize; newExtensionInfo->count = self->count; newExtensionInfo->offset = self->offset; newExtensionInfo->handle = self->handle; newExtensionInfo->extensionManager = (ExtensionManager*)Stg_Class_Copy( self->extensionManager, NULL, deep, nameExt, ptrMap ); if ( self->data ) { newExtensionInfo->data = PtrMap_Find( ptrMap, self->data ); Journal_Firewall( newExtensionInfo->data != NULL , Journal_Register( Error_Type, __FILE__ ), "Copy Error: Attempting to copy ExtensionInfo before data\n" ); } else { newExtensionInfo->data = NULL; } return newExtensionInfo; }
void* _Stg_ObjectAdaptor_Copy( void* objectAdaptor, void* dest, Bool deep, Name nameExt, struct PtrMap* ptrMap ) { Stg_ObjectAdaptor* self = (Stg_ObjectAdaptor*)objectAdaptor; Stg_ObjectAdaptor* newTuple; newTuple = _Stg_Object_Copy( self, dest, deep, nameExt, ptrMap ); newTuple->isGlobal = self->isGlobal; newTuple->isStgClass = self->isStgClass; Journal_Firewall( deep, Journal_Register( Error_Type, Stg_ObjectAdaptor_Type ), "Shallow copy not yet implemented\n" ); if( deep ) { if( self->isGlobal ) { newTuple->iOwn = False; newTuple->dataPtr = self->dataPtr; } else { newTuple->iOwn = True; Journal_Firewall( self->iOwn, Journal_Register( Error_Type, Stg_ObjectAdaptor_Type ), "Deep copy for Stg_ObjectAdaptors that do not own the non-global data is not yet implemented\n" ); /* TODO: DOES NOT check if the object has already been copied (i.e. use ptrMap). Beacuse if we assume ownership, we could not do so without an instance count machanism. */ /* if not in ptr map */ if( self->isStgClass ) { newTuple->dataPtr = Stg_Class_Copy( self->dataPtr, 0, deep, nameExt, ptrMap ); } else { Journal_Firewall( self->ptrCopy != NULL, Journal_Register( Error_Type, Stg_ObjectAdaptor_Type ), "Deep copy for pointer based Stg_ObjectAdaptors requires a copy function attached... not provided!\n" ); newTuple->dataPtr = self->ptrCopy( self->dataPtr, 0, deep, nameExt, ptrMap ); } /* else if in ptr map ... copy ptr value from there. */ } } return newTuple; }
void* _EntryPoint_Copy( void* entryPoint, void* dest, Bool deep, Name nameExt, PtrMap* ptrMap ) { EntryPoint* self = (EntryPoint*)entryPoint; EntryPoint* newEntryPoint; PtrMap* map = ptrMap; Bool ownMap = False; if( !map ) { map = PtrMap_New( 10 ); ownMap = True; } newEntryPoint = (EntryPoint*)_Stg_Object_Copy( self, dest, deep, nameExt, map ); /* Virtual methods */ newEntryPoint->_getRun = self->_getRun; newEntryPoint->castType = self->castType; newEntryPoint->run = self->run; if( deep ) { newEntryPoint->hooks = (HookList*)Stg_Class_Copy( self->hooks, NULL, deep, nameExt, map ); if( newEntryPoint->hooks ) { if( self->alwaysFirstHook ) { if( nameExt ) { Name tmpName; tmpName = Memory_Alloc_Array( char, strlen( Stg_Object_GetName( self->alwaysFirstHook ) ) + strlen( nameExt ) + 1, "tmpName" ); strcpy( tmpName, Stg_Object_GetName( self->alwaysFirstHook ) ); strcpy( &tmpName[strlen( Stg_Object_GetName( self->alwaysFirstHook ) )], nameExt ); newEntryPoint->alwaysFirstHook = (Hook*)Stg_ObjectList_Get( newEntryPoint->hooks, tmpName ); Memory_Free( tmpName ); } else { newEntryPoint->alwaysFirstHook = (Hook*)Stg_ObjectList_Get( newEntryPoint->hooks, Stg_Object_GetName( self->alwaysFirstHook ) ); } } else { self->alwaysFirstHook = NULL; } if( self->alwaysLastHook ) { if( nameExt ) { Name tmpName; tmpName = Memory_Alloc_Array( char, strlen( Stg_Object_GetName( self->alwaysLastHook ) ) + strlen( nameExt ) + 1, "tmpName" ); strcpy( tmpName, Stg_Object_GetName( self->alwaysLastHook ) ); strcpy( &tmpName[strlen( Stg_Object_GetName( self->alwaysLastHook ) )], nameExt ); newEntryPoint->alwaysLastHook = (Hook*)Stg_ObjectList_Get( newEntryPoint->hooks, tmpName ); Memory_Free( tmpName ); } else { newEntryPoint->alwaysLastHook = (Hook*)Stg_ObjectList_Get( newEntryPoint->hooks, Stg_Object_GetName( self->alwaysLastHook ) ); } }