New syntax for string mixins

Don nospam at nospam.com
Tue Dec 21 21:30:43 PST 2010


Alex_Dovhal wrote:
> "Don" <nospam at nospam.com> wrote:
>> In order for CTFE code to call pre-compiled code, three things are 
>> required:
>> (1) the compiler needs to be able to find the file (.obj/.lib/shared 
>> library) containing the compiled code;
>> (2) the compiler needs to be able to load the module and call it. This 
>> requires some form of dynamic linking.
>> (3) We need a marshalling step, to convert from compiler literal to 
>> compiled data, and back.
>>
>>
>> Step (3) is straightforward. The challenge is step(2), although note that 
>> it's a general "allow the compiler to load a plugin" problem, and doesn't 
>> have much to do with CTFE.
> 
> I thought it over, and got:
> (1) can be solved by adding compiler option: --macro-libs=<list_of_libs>, so 
> the compiler knows in which dynamic libraries to search for the plugins ;
> (2) plugin library functions should be *stdcall*, so C++ compiler can load 
> them. That library should implement function like that:
> 
> PluginInfo* getFunctionsInfo () ;
> where:
> typedef struct _PluginInfo{
>  struct _PluginInfo * nextPlugin ;
>  char* fcnName ; // short name of a function, e.g. "fcn"
>  char* params ; // param list, e.g. "(int, float, char*)"
>  char* mangledName;//name of funct. in the library, e.g. "_fcn at 12"
>  char* returnType ; // e.g. "int"
>  bool  isNothrow ; // if useful?
>  bool  isPure ;    // ditto
>  //... etc ...
> } PluginInfo ;
> 
> And also should implement all the functions, info about which is returned by 
> getFunctionsInfo().
> D compiler calls getFunctionsInfo from each plugin library - and then loads 
> all the implemented functions with full info about them.
> If one plugin function name found in two or more libraries - D throws 
> compiler error.
> Not a perfect solution, but at least straightforward one and solves given 
> problem.
> 
> One more note: this approach makes CTFE functions calling such plugins 
> uncallable at runtime, which IMO is OK, as one should not call it in any 
> case.
> 
> Is that suitable? 

It's not that complicated. Once you can load the library and call *one* 
function in it, the problem is solved.
But at a deeper level, I'm not sure what you'd hope to achieve with this.
I mean (excluding some not-yet implemented features), CTFE allows you to 
execute any pure + safe function which you have source code for.

So, if you had such a plugin, it could do things like make database 
queries. Everything else you can do already.


More information about the Digitalmars-d mailing list