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;
}
Exemple #2
0
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 ) );
            }
         }