cyclic redundancy
Steven Schveighoffer
schveiguy at yahoo.com
Mon Jun 18 14:15:49 UTC 2018
On 6/18/18 4:45 AM, Mr.Bingo wrote:
> I got tired of waiting for a solution and rolled my own:
>
>
>
> static this()
> {
>
> import std.meta, std.stdio;
>
> // Find all <module>___This functions linked to this module
> auto Iterate()()
> {
> string[string] s;
> void Iterate2(alias m, int depth = 0)()
> {
> static if (depth < 4)
> {
> static foreach (symbol_name; __traits(allMembers, m))
> {
>
> static if (symbol_name == "object") { }
> else static if (symbol_name ==
> m.stringof[7..$]~"___This")
> {
> s[m.stringof[7..$]] = m.stringof[7..$]~"___This";
> } else static if (isModule!(__traits(getMember, m,
> symbol_name)))
> {
> mixin("Iterate2!("~symbol_name~", depth +
> 1);");
> }
> }
> }
> }
>
> mixin("Iterate2!("~.stringof[7..$]~");");
>
> return s;
> }
>
>
> // Call all
> enum fs = Iterate;
> static foreach(k, f; fs)
> mixin(k~"."~f~"();");
> }
>
>
> This code simply finds all <module>___This static functions linked to
> the module this static constructor is called from and executes them.
>
> This doesn't solve the original problem but lets one execute the static
> functions to simulate static this. One could hypothetically even add
> attributes to allow for ordering(which is what the original cyclic
> redundancy check is suppose to solve but makes things worse since it is
> an ignorant algorithm).
The algorithm in druntime is correct, I'm sure you mean that the data
provided to the algorithm is not detailed enough. This is actually a
very tricky thing to get right. What you may end up with is a program
that works or doesn't based on your linker order.
> This type of method might be more feasible, a sort of static main(). It
> does not check for static this of aggregates though but gets around the
> CRC's banket fatal error.
The worst thing to consider is template class/struct static ctors which
get called in the *instantiating* module. I always recommend avoiding
putting those into your code.
-Steve
More information about the Digitalmars-d-learn
mailing list