The gist of the matter is I have module with some immutable tables. Quite some I should say (Unicode stuff). This gives the outline of problem:

imutable Something tableA  = ...; //~4-8Kb
...
imutable Something tableZ  = ...; //~4-8Kb

Now I have a set of functions that make use of each of these tables:

bool funcA(dchar ch){
        //optional ... extra logic
        return tableA[ch];
}
...
bool funcZ(dchar ch){ ... }

Now is the challenge is how do I make it NOT link in tables if I don't call the corresponding functions.

First try fails:

bool funcA(dchar ch){
        //this just allocates!
        immutable tableA = [ ... ];
        //sadly this appears in the map file
        static immutable tableA = [ ... ];
}

For the moment this what I found to 'work' :
template funcA(){
        immutable tableA = [ ... ];
        bool funcA(dchar ch){
                ...
        }
}

Otherwise the table is present regardless of whether or not I make use of funcA. The above is a neat hack but I think there must be a better way to avoid pulling globals into executable.

In the test sample below 'fable' is present in the map file, foo itself is correctly absent.

//module
// should be changed somehow so as not to put fable into exe when foo
// is not referenced, with no templates involved
module mod;
immutable byte[] fable = [1, 2, 3, 4, 5];

public byte foo(int ch){
    return fable[ch];
}


//driver
import mod;

immutable byte[] bable = [1, 2, 3, 4, 5];

byte boo(int ch){
    return bable[ch];
}

void main(string[] args){
    boo(0);
}

--
Dmitry Olshansky

Reply via email to