Reducing source code: weak+alias values in array

Jens Bauer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 1 13:29:59 PDT 2015


On Wednesday, 29 April 2015 at 13:58:14 UTC, Artur Skawina wrote:
> On 04/27/15 19:49, Jens Bauer via Digitalmars-d-learn wrote:
>> I was wondering if there's a way to reduce my bulky startup 
>> files a bit.
{snip}

> Just create a helper module, which the startup files can all
> use to generate the data from a dsl. Eg
{snip}

I've experimented a little with the code, but ran into two minor 
problems.

         code ~= `@weakalias("`~M.n~`") extern (C) void ` ~ 
__traits(identifier, A.tupleof[I]) ~ "();\n";

The above part gives me some problems; I do not know how to 
create the @weakalias.
I can make a @exc (which defaults to defaultExceptionVector) and 
@rst (which defaults to defaultResetHandler), but I have not yet 
succeeded in making a universal @weakalias.

alias Tuple(A...) = A;
alias rst = Tuple!(weak, gcc.attribute.attribute("alias", 
"defaultResetHandler"));
alias exc = Tuple!(weak, gcc.attribute.attribute("alias", 
"defaultExceptionHandler"));

... I tried messing with changing the above code, but no luck so 
far:

     code ~= `@weak @gcc.attribute.attribute("alias", "`~M.n~`") 
extern (C) void ` ~ __traits(identifier, A.tupleof[I]) ~ "();\n";


If I modify the above to ...
	foreach (I, M; A.init.tupleof)
	{
		static if (is(typeof(M)==A.RST))
			code ~= `@rst extern (C) void ` ~ __traits(identifier, 
A.tupleof[I]) ~ "();\n";
		static if (is(typeof(M)==A.EXC))
			code ~= `@exc extern (C) void ` ~ __traits(identifier, 
A.tupleof[I]) ~ "();\n";
	}
... then it will build and produce the expected results. That 
requires replacing the EXC for the ResetHandler by RST, I like 
the original code much better, though. :)


I also had some trouble with the exception vectors not being 
generated, and it turned out that my array was dynamic instead of 
static.

For now, I've just made the array a constant size (100 elements); 
eg. changed ...
     code ~= "\n at isr_vector VectorFunc[] g_pfnVectors = [\n";
... to ...
     code ~= "\n at isr_vector VectorFunc[100] g_pfnVectors = [\n";
... Is it possible to generate a static array without specifying 
a fixed array size ?

Apart from the above two mentioned problems, the code builds and 
produces the expected results. I even started to understand some 
parts of it, and I find it pretty awesome. ;)


More information about the Digitalmars-d-learn mailing list