Mercurial > projects > ddmd
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); } - + } }