Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 514

Show
Ignore:
Timestamp:
01/16/11 07:18:28 (14 years ago)
Author:
walter
Message:

don't ignore exceptions

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/rt/dmain2.d

    r508 r514  
    1414module rt.dmain2; 
    1515 
    1616private 
    1717{ 
    1818    import rt.memory; 
    1919    import rt.util.console; 
    2020    import rt.util.string; 
    2121    import core.stdc.stddef; 
    2222    import core.stdc.stdlib; 
    2323    import core.stdc.string; 
    24     //import core.stdc.stdio;   // for printf() 
     24    import core.stdc.stdio;   // for printf() 
    2525} 
    2626 
    2727version (Windows) 
    2828{ 
    2929    private import core.stdc.wchar_; 
    3030 
    3131    extern (Windows) alias int function() FARPROC; 
    3232    extern (Windows) FARPROC    GetProcAddress(void*, in char*); 
    3333    extern (Windows) void*      LoadLibraryA(in char*); 
    3434    extern (Windows) int        FreeLibrary(void*); 
     
    106106 
    107107    alias void* function()      gcGetFn; 
    108108    alias void  function(void*) gcSetFn; 
    109109    alias void  function()      gcClrFn; 
    110110} 
    111111 
    112112extern (C) void* rt_loadLibrary(in char[] name) 
    113113{ 
    114114    version (Windows) 
    115115    { 
     116    // Load a DLL at runtime 
    116117        char[260] temp = void; 
    117118        temp[0 .. name.length] = name[]; 
    118119        temp[name.length] = cast(char) 0; 
     120    // BUG: LoadLibraryA() call calls rt_init(), which fails if proxy is not set! 
    119121        void* ptr = LoadLibraryA(temp.ptr); 
    120122        if (ptr is null) 
    121123            return ptr; 
    122124        gcSetFn gcSet = cast(gcSetFn) GetProcAddress(ptr, "gc_setProxy"); 
    123125        if (gcSet !is null) 
     126    {   // BUG: Set proxy, but too late 
    124127            gcSet(gc_getProxy()); 
     128    } 
    125129        return ptr; 
    126130 
    127131    } 
    128132    else version (Posix) 
    129133    { 
    130134        throw new Exception("rt_loadLibrary not yet implemented on Posix."); 
    131135    } 
    132136} 
    133137 
    134138extern (C) bool rt_unloadLibrary(void* ptr) 
     
    271275            _minit(); 
    272276        _moduleCtor(); 
    273277        _moduleTlsCtor(); 
    274278        runModuleUnitTests(); 
    275279        return true; 
    276280    } 
    277281    catch (Throwable e) 
    278282    { 
    279283        if (dg) 
    280284            dg(e); 
     285    else 
     286        throw e;    // rethrow, don't silently ignore error 
    281287    } 
    282288    _d_criticalTerm(); 
    283289    return false; 
    284290} 
    285291 
    286292void _d_criticalTerm() 
    287293{ 
    288294    version (Posix) 
    289295    { 
    290296        _STD_critical_term();