diff dmd/Library.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents e7769d53e750
children 190ba98276b3
line wrap: on
line diff
--- a/dmd/Library.d	Sun Oct 10 10:38:55 2010 +0400
+++ b/dmd/Library.d	Sun Oct 17 07:42:00 2010 +0400
@@ -130,7 +130,7 @@
     memcpy(name, p, len);
     name[len] = 0;
     *pp = p + len;
-	
+
 	return len;
 }
 
@@ -148,7 +148,7 @@
 {
 	ObjSymbol** p1 = cast(ObjSymbol**)a;
 	ObjSymbol** p2 = cast(ObjSymbol**)b;
-	
+
     return cmp((*p1).name, (*p2).name);
 }
 version (Windows)
@@ -158,7 +158,7 @@
  * Returns:
  *	0	failure
  */
- 
+
 extern (C) extern uint _rotl(uint value, int shift);
 extern (C) extern uint _rotr(uint value, int shift);
 
@@ -254,7 +254,9 @@
     return 0;
 }
 
-class Library
+import dmd.TObject;
+
+class Library : TObject
 {
     File libfile;
     Array objmodules;	// ObjModule[]
@@ -264,11 +266,11 @@
 
     this()
 	{
+		register();
 		libfile = null;
-		
+
 		objmodules = new Array();
 		objsymbols = new Array();
-		tab = new StringTable();
 	}
 
 	/***********************************
@@ -280,7 +282,7 @@
 	{
 		string arg = filename;
 		if (arg.length == 0)
-		{   
+		{
 			// Generate lib file name from first obj name
 			string n = (cast(String)global.params.objfiles.data[0]).str;
 
@@ -352,7 +354,7 @@
 			return;
 		}
 		else
-		{	
+		{
 			// Not a library, assume OMF object module
 			g_page_size = 16;
 		}
@@ -383,7 +385,7 @@
 				case LHEADR :
 				case THEADR :
 					if (!om)
-					{   
+					{
 						char name[LIBIDMAX + 1];
 						om = new ObjModule();
 						om.flags = 0;
@@ -391,7 +393,7 @@
 						p += 3;
 						parseName(&p, name.ptr);
 						if (first_module && module_name && !islibrary)
-						{	
+						{
 							// Remove path and extension
 							string fname = FileName.name(module_name);
 							string ext = FileName.ext(fname);
@@ -402,7 +404,7 @@
 							om.name = fname;
 						}
 						else
-						{	
+						{
 							/* Use THEADR name as module name,
 							 * removing path and extension.
 							 */
@@ -411,12 +413,12 @@
 							if (ext.length != 0) {
 								fname = fname[0..$-ext.length-1];
 							}
-							
+
 							om.name = fname;
 							om.flags |= MFtheadr;
 						}
 						if (strcmp(name.ptr, "C".ptr) == 0)	   // old C compilers did this
-						{	
+						{
 							om.flags |= MFgentheadr;  // generate our own THEADR
 							om.base = pnext;	   // skip past THEADR
 						}
@@ -428,7 +430,7 @@
 				case MODEND :
 				case M386END:
 					if (om)
-					{   
+					{
 						om.page = cast(ushort)((om.base - pstart) / g_page_size);
 						om.length = pnext - om.base;
 						om = null;
@@ -438,9 +440,9 @@
 					t = (t + g_page_size - 1) & ~cast(uint)(g_page_size - 1);
 					pnext = pstart + t;
 					break;
-				
+
 				default:
-					// ignore 
+					// ignore
 					;
 			}
 		}
@@ -478,15 +480,15 @@
 	version (LOG) {
 		printf("Library.addSymbol(%s, %s, %d)\n", om.name, name, pickAny);
 	}
-		StringValue* s = tab.insert(name);
+		Object* s = tab.insert(name);
 		if (!s)
-		{	
+		{
 			// already in table
 			if (!pickAny)
-			{   
+			{
 				s = tab.lookup(name);
 				assert(s);
-				ObjSymbol* os = cast(ObjSymbol*)s.ptrvalue;
+				ObjSymbol* os = *cast(ObjSymbol**)s;
 				error("multiple definition of %s: %s and %s: %s",
 				om.name, name, os.om.name, os.name);
 			}
@@ -496,12 +498,12 @@
 			ObjSymbol* os = new ObjSymbol();
 			os.name = name;
 			os.om = om;
-			s.ptrvalue = cast(void*)os;
+			*s = cast(Object)cast(void*)os; /// !!!!
 
 			objsymbols.push(os);
 		}
 	}
-	
+
     void scanObjModule(ObjModule* om)
 	{
 		int easyomf;
@@ -605,7 +607,7 @@
 
 				case COMENT:
 					// Recognize Phar Lap EASY-OMF format
-					{   
+					{
 						enum ubyte[7] omfstr = [0x80,0xAA,'8','0','3','8','6'];
 
 						if (recLen == omfstr.sizeof)
@@ -619,7 +621,7 @@
 						}
 					}
 					// Recognize .IMPDEF Import Definition Records
-					{   
+					{
 						enum ubyte[3] omfstr = [0, 0xA0, 1];
 
 						if (recLen >= 7)
@@ -638,7 +640,7 @@
 					break;
 
 				default:
-					// ignore 
+					// ignore
 					;
 			}
 		}
@@ -648,7 +650,7 @@
 		///for (u = 1; u < names.dim; u++)
 		///	free(names.data[u]);
 	}
-	
+
 	/***********************************
 	 * Calculates number of pages needed for dictionary
 	 * Returns:
@@ -662,13 +664,13 @@
 		uint symSize = 0;
 
 		for (int i = 0; i < objsymbols.dim; i++)
-		{	
+		{
 			ObjSymbol* s = cast(ObjSymbol*)objsymbols.data[i];
 			symSize += ( s.name.length + 4 ) & ~1;
 		}
 
 		for (int i = 0; i < objmodules.dim; i++)
-		{	
+		{
 			ObjModule* om = cast(ObjModule*)objmodules.data[i];
 
 			size_t len = om.name.length;
@@ -701,7 +703,7 @@
 		for (int i = 0; 1; i++)
 		{
 			if ( primes[i] == 0 )
-			{   
+			{
 				// Quick and easy way is out.
 				// Now try and find first prime number > ndicpages
 				uint prime;
@@ -730,7 +732,7 @@
 
 		return ndicpages;
 	}
-	
+
 	/*******************************************
 	 * Write the module and symbol names to the dictionary.
 	 * Returns:
@@ -744,12 +746,12 @@
 
 		// Add each of the module names
 		for (int i = 0; i < objmodules.dim; i++)
-		{	
+		{
 			ObjModule* om = cast(ObjModule*)objmodules.data[i];
 
 			ushort n = cast(ushort)om.name.length;
 			if (n > 255)
-			{   
+			{
 				entry[0] = 0xFF;
 				entry[1] = 0;
 				*cast(ushort*)(entry.ptr + 2) = cast(ushort)(n + 1);
@@ -757,7 +759,7 @@
 				n += 3;
 			}
 			else
-			{   
+			{
 				entry[ 0 ] = cast(ubyte)(1 + n);
 				memcpy(entry.ptr + 1, om.name.ptr, n );
 			}
@@ -774,12 +776,12 @@
 
 		// Add each of the symbols
 		for (int i = 0; i < objsymbols.dim; i++)
-		{	
+		{
 			ObjSymbol* os = cast(ObjSymbol*)objsymbols.data[i];
 
 			ushort n = cast(ushort)os.name.length;
 			if (n > 255)
-			{   
+			{
 				entry[0] = 0xFF;
 				entry[1] = 0;
 				*cast(ushort*)(entry.ptr + 2) = n;
@@ -787,7 +789,7 @@
 				n += 3;
 			}
 			else
-			{   
+			{
 				entry[ 0 ] = cast(ubyte)n;
 				memcpy( entry.ptr + 1, os.name.ptr, n );
 			}
@@ -802,7 +804,7 @@
 
 		return 1;
 	}
-	
+
 	/**********************************************
 	 * Create and write library to libbuf.
 	 * The library consists of:
@@ -817,7 +819,7 @@
 		 * to go into the dictionary
 		 */
 		for (int i = 0; i < objmodules.dim; i++)
-		{   
+		{
 			ObjModule* om = cast(ObjModule*)objmodules.data[i];
 			scanObjModule(om);
 		}
@@ -837,7 +839,7 @@
 			uint offset = g_page_size;
 
 			for (int i = 0; i < objmodules.dim; i++)
-			{   
+			{
 				ObjModule* om = cast(ObjModule*)objmodules.data[i];
 
 				uint page = offset / g_page_size;
@@ -879,7 +881,7 @@
 		/* Write each object module into the library
 		 */
 		for (int i = 0; i < objmodules.dim; i++)
-		{	
+		{
 			ObjModule* om = cast(ObjModule*)objmodules.data[i];
 
 			uint page = libbuf.offset / g_page_size;
@@ -905,7 +907,7 @@
 				ubyte checksum = 0;
 				ubyte* p = header.ptr;
 				while (n--)
-				{	
+				{
 					checksum -= *p;
 					p++;
 				}
@@ -958,7 +960,7 @@
 				bucketsP[u * BUCKETPAGE + HASHMOD] = (HASHMOD + 1) >> 1;
 			}
 
-			if (FillDict(bucketsP, ndicpages)) 
+			if (FillDict(bucketsP, ndicpages))
 				break;
 			padding += 16;      // try again with more margins
 		}
@@ -985,22 +987,25 @@
 } // version (Windows)
 else version(TARGET_LINUX)
 {
-class Library
+
+import dmd.TObject;
+
+class Library : TObject
 {
     void setFilename(string dir, string filename)
     {
     	assert(0);
     }
-    
+
     void addObject(string module_name, void *buf, size_t buflen)
     {
     	assert(0);
     }
-    
+
     void write()
     {
     	assert(0);
     }
-	
+
 }
 }