Compile time code paths

Don nospam at nospam.com
Tue Aug 11 00:34:52 PDT 2009


Jeremie Pelletier wrote:
> David Gileadi Wrote:
> 
>> Daniel Keep wrote:
>>> Jeremie Pelletier wrote:
>>>> If a function has both an asm and D implementations inside its body, and the D version can be executed at compile time, but the asm one is much faster at runtime. Is it possible to have the compiler use the D code path at compile time (ie to fill in enums and whatnot), and have the asm version available at runtime.
>>> Not that I know of.  There's no way to switch based on run time/compile
>>> time.  This was going to be solved, at least in part, using static
>>> arguments, but that got dropped.
>>>
>>> As it stands, you just have to use a suffix or prefix or something to
>>> distinguish CTFE methods from runtime methods.
>> Is this a case for version(CompileTime){}?
> 
> No because it would also compile this block into the binary. 

I think something like this might work:

static if (__traits(CompileTime)) {
    ... // ctfe code
} else {
    asm {
      ...
    }
}

Not sure what the exact syntax should be.

> 
> The easy way is of course to have different symbols for compile-time and run-time. But this doesn't go well with generic programming where the function needing such a check can be deep in the compile-time call stack.
> 
> For example:
> int foo() { return bar + 1; }
> int bar() { return foobar * 2; }
> int foobar() {
> static if(isCompileTime) return ...; /// asm cannot execute at compile time, needed to keep foo and bar able to do CTFE
> else asm { ...; } /// asm optimized for runtime
> }



More information about the Digitalmars-d mailing list