Re: How can I express the type of a function in D?

2019-02-04 Thread dnsmt via Digitalmars-d-learn

On Wednesday, 30 January 2019 at 05:14:20 UTC, Sobaya wrote:
I want to get a mangled name of a D function by 
`core.demangle.mangle`, but I'm in trouble because there are no 
ways to express a type of a function, which is used for a 
template argument of `mangle`.


Did you consider `core.demangle.mangleFunc` instead?


Re: How can I express the type of a function in D?

2019-02-01 Thread Atila Neves via Digitalmars-d-learn

On Wednesday, 30 January 2019 at 05:14:20 UTC, Sobaya wrote:
I want to get a mangled name of a D function by 
`core.demangle.mangle`, but I'm in trouble because there are no 
ways to express a type of a function, which is used for a 
template argument of `mangle`.


There's a way:

int add(int i, int j);
static assert(is(typeof(add) == typeof(*(int function(int, 
int)).init)));


Unfortunately there's no dedicated syntax for it, unlike C++. 
Weirdly enough, if you pragma(msg) a function type it prints it 
out in C++ syntax (e.g. `int(int, int)`), but if you type it 
yourself it won't compile.


Then there's this oddity:

https://issues.dlang.org/show_bug.cgi?id=19270



Re: How can I express the type of a function in D?

2019-01-30 Thread Steven Schveighoffer via Digitalmars-d-learn

On 1/30/19 1:39 PM, Ali Çehreli wrote:

On 01/30/2019 07:47 AM, Steven Schveighoffer wrote:
 > On 1/30/19 12:14 AM, Sobaya wrote:
 >> I want to get a mangled name of a D function by
 >> `core.demangle.mangle`, but I'm in trouble because there are no ways
 >> to express a type of a function, which is used for a template argument
 >> of `mangle`.
 >>
 >> For example, it is wrong to use the type `int function(int,int)` to
 >> express the type of `int add(int,int)`.
 >> Because it expresses the type of a function POINTER, not just a 
function.

 >>
 >> The fuction name in a binary compiled this function is "_D3addFiiZi",
 >> but `mangle!(int function(int,int))("add")` returns "_D3addPFiiZi",
 >> which includes "P" meaning POINTER.
 >>
 >> How can I get the former one?
 >
 > Why not use add.mangleof?
 >

add.mangleof includes the module name as well (_D6deneme3addFiiZi) but 
the OP wanted without (_D3addFiiZi). 


But he says `The fuction name in a binary compiled this function is 
"_D3addFiiZi"`. So whatever he compiles as must be what mangleof 
reports, as it's the same entity generating the mangle. I don't know 
what his source code is.


-Steve


Re: How can I express the type of a function in D?

2019-01-30 Thread Neia Neutuladh via Digitalmars-d-learn
On Wed, 30 Jan 2019 12:56:06 -0800, Ali Çehreli wrote:
> I remember names like _add. Is that a Windows thing?

A number of functions are implemented as manually-mangled names with 
preprocessor macros that forward to them. It's weird, but it happens.


Re: How can I express the type of a function in D?

2019-01-30 Thread Ali Çehreli via Digitalmars-d-learn

On 01/30/2019 11:42 AM, H. S. Teoh wrote:

On Wed, Jan 30, 2019 at 10:39:21AM -0800, Ali Çehreli via Digitalmars-d-learn 
wrote:
[...]

I wonder why the inconsistency. On the other hand, .mangleof produces
just "add" when the function is extern(C).  (?)

[...]

For extern(C), this is correct behaviour, because that's how a C
function would be mangled (i.e., not mangled at all).


T



I remember names like _add. Is that a Windows thing?

Ali



Re: How can I express the type of a function in D?

2019-01-30 Thread H. S. Teoh via Digitalmars-d-learn
On Wed, Jan 30, 2019 at 07:51:17PM +, Neia Neutuladh via 
Digitalmars-d-learn wrote:
> On Wed, 30 Jan 2019 10:39:21 -0800, Ali Çehreli wrote:
> > import core.demangle;
> > 
> > extern(C) int add(int, int);
> > 
> > void main() {
> >alias F = typeof(add);
> >pragma(msg, mangle!F("add"));
> >pragma(msg, add.mangleof);
> > }
> > 
> > Output:
> > 
> > _D3addUiiZi
> > add   <-- Is that correct?
> 
> `add.mangleof` is correct. In fact, it's definitively correct.
> 
> typeof(add) is extern(C) int function(int, int). Based on this output,
> core.demangle seems like it's not taking the extern(C) portion into
> account.

That would be a bug in core.demangle.


T

-- 
"I suspect the best way to deal with procrastination is to put off the 
procrastination itself until later. I've been meaning to try this, but haven't 
gotten around to it yet. " -- swr


Re: How can I express the type of a function in D?

2019-01-30 Thread Neia Neutuladh via Digitalmars-d-learn
On Wed, 30 Jan 2019 10:39:21 -0800, Ali Çehreli wrote:
> import core.demangle;
> 
> extern(C) int add(int, int);
> 
> void main() {
>alias F = typeof(add);
>pragma(msg, mangle!F("add"));
>pragma(msg, add.mangleof);
> }
> 
> Output:
> 
> _D3addUiiZi
> add   <-- Is that correct?

`add.mangleof` is correct. In fact, it's definitively correct.

typeof(add) is extern(C) int function(int, int). Based on this output, 
core.demangle seems like it's not taking the extern(C) portion into 
account.


Re: How can I express the type of a function in D?

2019-01-30 Thread H. S. Teoh via Digitalmars-d-learn
On Wed, Jan 30, 2019 at 10:39:21AM -0800, Ali Çehreli via Digitalmars-d-learn 
wrote:
[...]
> I wonder why the inconsistency. On the other hand, .mangleof produces
> just "add" when the function is extern(C).  (?)
[...]

For extern(C), this is correct behaviour, because that's how a C
function would be mangled (i.e., not mangled at all).


T

-- 
In a world without fences, who needs Windows and Gates? -- Christian Surchi


Re: How can I express the type of a function in D?

2019-01-30 Thread Ali Çehreli via Digitalmars-d-learn

On 01/30/2019 07:47 AM, Steven Schveighoffer wrote:
> On 1/30/19 12:14 AM, Sobaya wrote:
>> I want to get a mangled name of a D function by
>> `core.demangle.mangle`, but I'm in trouble because there are no ways
>> to express a type of a function, which is used for a template argument
>> of `mangle`.
>>
>> For example, it is wrong to use the type `int function(int,int)` to
>> express the type of `int add(int,int)`.
>> Because it expresses the type of a function POINTER, not just a 
function.

>>
>> The fuction name in a binary compiled this function is "_D3addFiiZi",
>> but `mangle!(int function(int,int))("add")` returns "_D3addPFiiZi",
>> which includes "P" meaning POINTER.
>>
>> How can I get the former one?
>
> Why not use add.mangleof?
>
> -Steve

add.mangleof includes the module name as well (_D6deneme3addFiiZi) but 
the OP wanted without (_D3addFiiZi). I wonder why the inconsistency. On 
the other hand, .mangleof produces just "add" when the function is 
extern(C). (?)


import core.demangle;

extern(C) int add(int, int);

void main() {
  alias F = typeof(add);
  pragma(msg, mangle!F("add"));
  pragma(msg, add.mangleof);
}

Output:

_D3addUiiZi
add   <-- Is that correct?

Ali



Re: How can I express the type of a function in D?

2019-01-30 Thread Steven Schveighoffer via Digitalmars-d-learn

On 1/30/19 12:14 AM, Sobaya wrote:
I want to get a mangled name of a D function by `core.demangle.mangle`, 
but I'm in trouble because there are no ways to express a type of a 
function, which is used for a template argument of `mangle`.


For example, it is wrong to use the type `int function(int,int)` to 
express the type of `int add(int,int)`.

Because it expresses the type of a function POINTER, not just a function.

The fuction name in a binary compiled this function is "_D3addFiiZi", 
but `mangle!(int function(int,int))("add")` returns "_D3addPFiiZi", 
which includes "P" meaning POINTER.


How can I get the former one?


Why not use add.mangleof?

-Steve


Re: How can I express the type of a function in D?

2019-01-30 Thread Ali Çehreli via Digitalmars-d-learn

On 01/29/2019 09:14 PM, Sobaya wrote:
I want to get a mangled name of a D function by `core.demangle.mangle`, 
but I'm in trouble because there are no ways to express a type of a 
function, which is used for a template argument of `mangle`.


For example, it is wrong to use the type `int function(int,int)` to 
express the type of `int add(int,int)`.

Because it expresses the type of a function POINTER, not just a function.

The fuction name in a binary compiled this function is "_D3addFiiZi", 
but `mangle!(int function(int,int))("add")` returns "_D3addPFiiZi", 
which includes "P" meaning POINTER.


How can I get the former one?

Thanks.



typeof works:

import core.demangle;

int add(int, int);

void main() {
  alias F = typeof(add);
  pragma(msg, mangle!F("add"));
}

Ali


Re: How can I express the type of a function in D?

2019-01-29 Thread Sobaya via Digitalmars-d-learn

On Wednesday, 30 January 2019 at 06:02:02 UTC, FrankLike wrote:

On Wednesday, 30 January 2019 at 05:40:50 UTC, FrankLike wrote:

On Wednesday, 30 January 2019 at 05:14:20 UTC, Sobaya wrote:

[...]


import std.stdio;
import std.process:executeShell;
import core.demangle;

void main()
{   
assert(mangle!(int function(int))("a.b") == "_D1a1bPFiZi");
executeShell("pause");
}

CODE END//
Yes,"_D1a1bPFiZi",which includes "P".


I want a mangled function name without "P", not one with "P".


Re: How can I express the type of a function in D?

2019-01-29 Thread FrankLike via Digitalmars-d-learn

On Wednesday, 30 January 2019 at 05:40:50 UTC, FrankLike wrote:

On Wednesday, 30 January 2019 at 05:14:20 UTC, Sobaya wrote:
I want to get a mangled name of a D function by 
`core.demangle.mangle`, but I'm in trouble because there are 
no ways to express a type of a function, which is used for a 
template argument of `mangle`.


For example, it is wrong to use the type `int 
function(int,int)` to express the type of `int add(int,int)`.
Because it expresses the type of a function POINTER, not just 
a function.


The fuction name in a binary compiled this function is 
"_D3addFiiZi", but `mangle!(int function(int,int))("add")` 
returns "_D3addPFiiZi", which includes "P" meaning POINTER.


How can I get the former one?

Thanks.


import std.stdio;
import std.process:executeShell;
import core.demangle;

void main()
{   
assert(mangle!(int function(int))("a.b") == "_D1a1bPFiZi");
executeShell("pause");
}

CODE END//
Yes,"_D1a1bPFiZi",which includes "P".





Re: How can I express the type of a function in D?

2019-01-29 Thread FrankLike via Digitalmars-d-learn

On Wednesday, 30 January 2019 at 05:14:20 UTC, Sobaya wrote:
I want to get a mangled name of a D function by 
`core.demangle.mangle`, but I'm in trouble because there are no 
ways to express a type of a function, which is used for a 
template argument of `mangle`.


For example, it is wrong to use the type `int 
function(int,int)` to express the type of `int add(int,int)`.
Because it expresses the type of a function POINTER, not just a 
function.


The fuction name in a binary compiled this function is 
"_D3addFiiZi", but `mangle!(int function(int,int))("add")` 
returns "_D3addPFiiZi", which includes "P" meaning POINTER.


How can I get the former one?

Thanks.


import std.stdio;
alias int*  PINT;

void main()
{
auto x= Add(1,2);
writeln(x);
writeln();
executeShell("pause");
}

private PINT Add(int a,int b)
{
return cast(PINT)(a+b);
}

CODE END//
It works ok.


How can I express the type of a function in D?

2019-01-29 Thread Sobaya via Digitalmars-d-learn
I want to get a mangled name of a D function by 
`core.demangle.mangle`, but I'm in trouble because there are no 
ways to express a type of a function, which is used for a 
template argument of `mangle`.


For example, it is wrong to use the type `int function(int,int)` 
to express the type of `int add(int,int)`.
Because it expresses the type of a function POINTER, not just a 
function.


The fuction name in a binary compiled this function is 
"_D3addFiiZi", but `mangle!(int function(int,int))("add")` 
returns "_D3addPFiiZi", which includes "P" meaning POINTER.


How can I get the former one?

Thanks.