What's New for D 0.141
Dec 1, 2005
New/Changed Features
- The predefined version identifier D_InlineAsm has been changed to D_InlineAsm_X86. The former made no sense, and although it is still defined, it is deprecated.
- Added D code coverage analyzer.
- Added .mangleof property for types, which gives the 'mangled' type name as a string.
Bugs Fixed
- Fixed D.bugs/5643
- Fixed D.bugs/5668
- Fixed D.bugs/5687
- Fixed D.bugs/5690
- Fixed D.bugs/5673 (it now issues an OutOfMemoryException)
- Fixed D.bugs/5729
- Fixed dstress.run.c.creal_26_A regression.
- Fixed dstress.run.const_18 regression.
其中“D代码覆盖分析器”应该是很多人感兴趣的东西了,下面是一个例子(摘自http://digitalmars.com/d/code_coverage.html):
/*
Eratosthenes Sieve prime number calculation.
*/
bit flags[ 8191 ];
int main()
{ int i, prime, k, count, iter;
printf( " 10 iterations\n " );
for (iter = 1 ; iter <= 10 ; iter ++ )
{ count = 0 ;
flags[] = true ;
for (i = 0 ; i < flags.length; i ++ )
{ if (flags[i])
{ prime = i + i + 3 ;
k = i + prime;
while (k < flags.length)
{
flags[k] = false ;
k += prime;
}
count += 1 ;
}
}
}
printf ( " \n%d primes\n " , count);
return 0 ;
}
bit flags[ 8191 ];
int main()
{ int i, prime, k, count, iter;
printf( " 10 iterations\n " );
for (iter = 1 ; iter <= 10 ; iter ++ )
{ count = 0 ;
flags[] = true ;
for (i = 0 ; i < flags.length; i ++ )
{ if (flags[i])
{ prime = i + i + 3 ;
k = i + prime;
while (k < flags.length)
{
flags[k] = false ;
k += prime;
}
count += 1 ;
}
}
}
printf ( " \n%d primes\n " , count);
return 0 ;
}
编译、运行:
dmd sieve
-
cov
sieve
结果如下:
sieve
|/* Eratosthenes Sieve prime number calculation. */
|
|bit flags[8191];
|
|int main()
5|{ int i, prime, k, count, iter;
|
1| printf("10 iterations\n");
22| for (iter = 1; iter <= 10; iter++)
10| { count = 0;
10| flags[] = true;
163840| for (i = 0; i < flags.length; i++)
81910| { if (flags[i])
18990| { prime = i + i + 3;
18990| k = i + prime;
168980| while (k < flags.length)
| {
149990| flags[k] = false;
149990| k += prime;
| }
18990| count += 1;
| }
| }
| }
1| printf ("\n%d primes\n", count);
1| return 0;
|}
sieve.d is 100% covered
|
|bit flags[8191];
|
|int main()
5|{ int i, prime, k, count, iter;
|
1| printf("10 iterations\n");
22| for (iter = 1; iter <= 10; iter++)
10| { count = 0;
10| flags[] = true;
163840| for (i = 0; i < flags.length; i++)
81910| { if (flags[i])
18990| { prime = i + i + 3;
18990| k = i + prime;
168980| while (k < flags.length)
| {
149990| flags[k] = false;
149990| k += prime;
| }
18990| count += 1;
| }
| }
| }
1| printf ("\n%d primes\n", count);
1| return 0;
|}
sieve.d is 100% covered
另一个惊喜是mangleof属性,可以得到一个类型被编译器mangle后的名字。不知道mangle对应的中文翻译是什么?大概是“名字转换”吧。一点测试代码:
import std.stdio;
void test();
void test1( int n);
void test2( int n);
void main()
{
void function ( int , char []) f;
void function ( int ) f1;
void function () f2;
writefln (f.mangleof);
writefln (f1.mangleof);
writefln (f2.mangleof);
writefln ( int .mangleof);
float a;
writefln (a.mangleof);
writefln (( & test).mangleof);
writefln (( & test1).mangleof);
writefln (( & test2).mangleof);
writefln ( void .mangleof);
}
编译执行结果如下:
void test();
void test1( int n);
void test2( int n);
void main()
{
void function ( int , char []) f;
void function ( int ) f1;
void function () f2;
writefln (f.mangleof);
writefln (f1.mangleof);
writefln (f2.mangleof);
writefln ( int .mangleof);
float a;
writefln (a.mangleof);
writefln (( & test).mangleof);
writefln (( & test1).mangleof);
writefln (( & test2).mangleof);
writefln ( void .mangleof);
}
PFiAaZv
PFiZv
PFZv
i
f
PFZv
PFiZv
PFiZv
v
PFiZv
PFZv
i
f
PFZv
PFiZv
PFiZv
v