Mercurial > projects > ldc
view lphobos/internal/dmain2.d @ 1418:f5f8c21ce6ef
Make "`aa[key]`" use the same runtime call as "`key in aa`". The runtime calls
these were using were different, but with equivalent definitions.
With `ldc -O3`, the following functions now all compile to the exact same code:
{{{
int[int] y;
void foo(int x) {
if (x in y) {
auto z = x in y;
sink(*z);
}
}
void bar(int x) {
if (x in y) {
sink(y[x]);
}
}
void baz(int x) {
if (auto p = x in y) {
sink(*p);
}
}
}}}
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Mon, 25 May 2009 12:50:40 +0200 |
parents | 373489eeaf90 |
children |
line wrap: on
line source
/* * Placed into the Public Domain. * written by Walter Bright * www.digitalmars.com */ module internal.dmain2; import object; import std.c.stdio; import std.c.string; import std.c.stdlib; import std.string; extern (C) void _STI_monitor_staticctor(); extern (C) void _STD_monitor_staticdtor(); extern (C) void _STI_critical_init(); extern (C) void _STD_critical_term(); extern (C) void gc_init(); extern (C) void gc_term(); extern (C) void _minit(); extern (C) void _moduleCtor(); extern (C) void _moduleDtor(); extern (C) void _moduleUnitTests(); extern (C) bool no_catch_exceptions; /*********************************** * The D main() function supplied by the user's program */ int main(char[][] args); /*********************************** * Substitutes for the C main() function. * It's purpose is to wrap the call to the D main() * function and catch any unhandled exceptions. */ extern (C) int main(size_t argc, char **argv) { char[] *am; char[][] args; int result; int myesp; int myebx; version (linux) { _STI_monitor_staticctor(); _STI_critical_init(); gc_init(); am = cast(char[] *) malloc(argc * (char[]).sizeof); // BUG: alloca() conflicts with try-catch-finally stack unwinding //am = (char[] *) alloca(argc * (char[]).sizeof); } version (Win32) { gc_init(); _minit(); am = cast(char[] *) alloca(argc * (char[]).sizeof); } if (no_catch_exceptions) { _moduleCtor(); _moduleUnitTests(); for (size_t i = 0; i < argc; i++) { auto len = strlen(argv[i]); am[i] = argv[i][0 .. len]; } args = am[0 .. argc]; result = main(args); _moduleDtor(); gc_term(); } else { try { _moduleCtor(); _moduleUnitTests(); for (size_t i = 0; i < argc; i++) { auto len = strlen(argv[i]); am[i] = argv[i][0 .. len]; } args = am[0 .. argc]; result = main(args); _moduleDtor(); gc_term(); } catch (Object o) { version (none) { printf("Error: "); o.print(); } else { auto foo = o.toString(); fprintf(stderr, "Error: %.*s\n", foo.length, foo.ptr); } exit(EXIT_FAILURE); } } version (linux) { free(am); _STD_critical_term(); _STD_monitor_staticdtor(); } return result; }