Mercurial > projects > ldc
comparison lphobos/internal/dmain2.d @ 473:373489eeaf90
Applied downs' lphobos update
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Mon, 04 Aug 2008 19:28:49 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
472:15c804b6ce77 | 473:373489eeaf90 |
---|---|
1 /* | |
2 * Placed into the Public Domain. | |
3 * written by Walter Bright | |
4 * www.digitalmars.com | |
5 */ | |
6 | |
7 module internal.dmain2; | |
8 import object; | |
9 import std.c.stdio; | |
10 import std.c.string; | |
11 import std.c.stdlib; | |
12 import std.string; | |
13 | |
14 extern (C) void _STI_monitor_staticctor(); | |
15 extern (C) void _STD_monitor_staticdtor(); | |
16 extern (C) void _STI_critical_init(); | |
17 extern (C) void _STD_critical_term(); | |
18 extern (C) void gc_init(); | |
19 extern (C) void gc_term(); | |
20 extern (C) void _minit(); | |
21 extern (C) void _moduleCtor(); | |
22 extern (C) void _moduleDtor(); | |
23 extern (C) void _moduleUnitTests(); | |
24 | |
25 extern (C) bool no_catch_exceptions; | |
26 | |
27 /*********************************** | |
28 * The D main() function supplied by the user's program | |
29 */ | |
30 int main(char[][] args); | |
31 | |
32 /*********************************** | |
33 * Substitutes for the C main() function. | |
34 * It's purpose is to wrap the call to the D main() | |
35 * function and catch any unhandled exceptions. | |
36 */ | |
37 | |
38 extern (C) int main(size_t argc, char **argv) | |
39 { | |
40 char[] *am; | |
41 char[][] args; | |
42 int result; | |
43 int myesp; | |
44 int myebx; | |
45 | |
46 version (linux) | |
47 { | |
48 _STI_monitor_staticctor(); | |
49 _STI_critical_init(); | |
50 gc_init(); | |
51 am = cast(char[] *) malloc(argc * (char[]).sizeof); | |
52 // BUG: alloca() conflicts with try-catch-finally stack unwinding | |
53 //am = (char[] *) alloca(argc * (char[]).sizeof); | |
54 } | |
55 version (Win32) | |
56 { | |
57 gc_init(); | |
58 _minit(); | |
59 am = cast(char[] *) alloca(argc * (char[]).sizeof); | |
60 } | |
61 | |
62 if (no_catch_exceptions) | |
63 { | |
64 _moduleCtor(); | |
65 _moduleUnitTests(); | |
66 | |
67 for (size_t i = 0; i < argc; i++) | |
68 { | |
69 auto len = strlen(argv[i]); | |
70 am[i] = argv[i][0 .. len]; | |
71 } | |
72 | |
73 args = am[0 .. argc]; | |
74 | |
75 result = main(args); | |
76 _moduleDtor(); | |
77 gc_term(); | |
78 } | |
79 else | |
80 { | |
81 try | |
82 { | |
83 _moduleCtor(); | |
84 _moduleUnitTests(); | |
85 | |
86 for (size_t i = 0; i < argc; i++) | |
87 { | |
88 auto len = strlen(argv[i]); | |
89 am[i] = argv[i][0 .. len]; | |
90 } | |
91 | |
92 args = am[0 .. argc]; | |
93 | |
94 result = main(args); | |
95 _moduleDtor(); | |
96 gc_term(); | |
97 } | |
98 catch (Object o) | |
99 { | |
100 version (none) | |
101 { | |
102 printf("Error: "); | |
103 o.print(); | |
104 } | |
105 else | |
106 { | |
107 auto foo = o.toString(); | |
108 fprintf(stderr, "Error: %.*s\n", foo.length, foo.ptr); | |
109 } | |
110 exit(EXIT_FAILURE); | |
111 } | |
112 } | |
113 | |
114 version (linux) | |
115 { | |
116 free(am); | |
117 _STD_critical_term(); | |
118 _STD_monitor_staticdtor(); | |
119 } | |
120 return result; | |
121 } | |
122 |