Mercurial > projects > ddmd
diff main.d @ 70:6bdecc3f4569
Get rid of win32 bindings
author | korDen |
---|---|
date | Sat, 28 Aug 2010 10:51:32 +0400 |
parents | 544b922227c7 |
children | 7e0d548de9e6 |
line wrap: on
line diff
--- a/main.d Tue Aug 24 16:59:45 2010 +0400 +++ b/main.d Sat Aug 28 10:51:32 2010 +0400 @@ -31,8 +31,7 @@ import core.memory; -import dlib.CrashHandler; -import dbg.ui.CrashWindow; +import dbg.CallStackInfo; import dmd.Util; @@ -41,10 +40,142 @@ EXIT_SUCCESS = 0, } -extern (C) extern __gshared bool rt_trapExceptions; +version (Windows) +{ + private import core.stdc.wchar_; + + extern (Windows) alias int function() FARPROC; + extern (Windows) FARPROC GetProcAddress(void*, in char*); + extern (Windows) void* LoadLibraryA(in char*); + extern (Windows) int FreeLibrary(void*); + extern (Windows) void* LocalFree(void*); + extern (Windows) wchar_t* GetCommandLineW(); + extern (Windows) wchar_t** CommandLineToArgvW(wchar_t*, int*); + extern (Windows) export int WideCharToMultiByte(uint, uint, wchar_t*, int, char*, int, char*, int); + pragma(lib, "shell32.lib"); // needed for CommandLineToArgvW +} + +shared bool _d_isHalting = false; +__gshared string[] _d_args = null; + +extern (C) void gc_init(); +extern (C) void gc_term(); +extern (C) void _minit(); +extern (C) void _moduleCtor(); +extern (C) void _moduleDtor(); +extern (C) bool runModuleUnitTests(); +extern (C) void thread_joinAll(); + +import rt.memory; + +extern (C) int main(int argc, char** argv) +{ + char[][] args; + int result; + + version (OSX) + { /* OSX does not provide a way to get at the top of the + * stack, except for the magic value 0xC0000000. + * But as far as the gc is concerned, argv is at the top + * of the main thread's stack, so save the address of that. + */ + __osx_stack_end = cast(void*)&argv; + } + + version (FreeBSD) version (D_InlineAsm_X86) + { + /* + * FreeBSD/i386 sets the FPU precision mode to 53 bit double. + * Make it 64 bit extended. + */ + ushort fpucw; + asm + { + fstsw fpucw; + or fpucw, 0b11_00_111111; // 11: use 64 bit extended-precision + // 111111: mask all FP exceptions + fldcw fpucw; + } + } + + version (Posix) + { + _STI_monitor_staticctor(); + _STI_critical_init(); + } -static this() { - rt_trapExceptions = false; + version (Windows) + { + wchar_t* wcbuf = GetCommandLineW(); + size_t wclen = wcslen(wcbuf); + int wargc = 0; + wchar_t** wargs = CommandLineToArgvW(wcbuf, &wargc); + assert(wargc == argc); + + char* cargp = null; + size_t cargl = WideCharToMultiByte(65001, 0, wcbuf, wclen, null, 0, null, 0); + + cargp = cast(char*) alloca(cargl); + args = ((cast(char[]*) alloca(wargc * (char[]).sizeof)))[0 .. wargc]; + + for (size_t i = 0, p = 0; i < wargc; i++) + { + int wlen = wcslen(wargs[i]); + int clen = WideCharToMultiByte(65001, 0, &wargs[i][0], wlen, null, 0, null, 0); + args[i] = cargp[p .. p+clen]; + p += clen; assert(p <= cargl); + WideCharToMultiByte(65001, 0, &wargs[i][0], wlen, &args[i][0], clen, null, 0); + } + LocalFree(wargs); + wargs = null; + wargc = 0; + } + else version (Posix) + { + char[]* am = cast(char[]*) malloc(argc * (char[]).sizeof); + scope(exit) free(am); + + for (size_t i = 0; i < argc; i++) + { + auto len = strlen(argv[i]); + am[i] = argv[i][0 .. len]; + } + args = am[0 .. argc]; + } + _d_args = cast(string[]) args; + + void runMain() + { + result = main(_d_args); + } + + void runAll() + { + gc_init(); + initStaticDataGC(); + version (Windows) + _minit(); + _moduleCtor(); + _moduleTlsCtor(); + if (runModuleUnitTests()) + runMain(); + else + result = EXIT_FAILURE; + _moduleTlsDtor(); + thread_joinAll(); + _d_isHalting = true; + _moduleDtor(); + gc_term(); + } + + runAll(); + + version (Posix) + { + _STD_critical_term(); + _STD_monitor_staticdtor(); + } + return result; } int main(string[] args)