Re: static function and access frame

2018-01-23 Thread Alex via Digitalmars-d-learn
On Tuesday, 23 January 2018 at 23:22:09 UTC, Steven Schveighoffer 
wrote:


So, if change the fun to static, it cannot pickup the pointer 
and therefore can't call anything of the aliased object. If I 
get it right...


I think so. But this is a guess, as the generated call clearly 
never uses that 'this' member. Interesting to me that it calls 
that member 'this', when 'this' is already defined!



Hmm... yes, I see...



cool option, by the way... didn't know anything about it. What 
does -ast do?


-vcg-ast means take the generated AST before optimization (I 
think), and output a d-source-like file (called file.d.cg) that 
shows the representation. Super useful when you are trying to 
figure out what the compiler does to your code. It only happens 
if compilation succeeds.


-ast, I don't think does anything, but not sure if that's what 
your question was.


The reason you don't know anything about it is because it's a 
debugging option and not documented :) At least, that's what I 
was told...



:)

If you click on the AST button on run.dlang.io, you get the 
same thing.




bug filed
https://issues.dlang.org/show_bug.cgi?id=18289

Thanks a lot.



Re: static function and access frame

2018-01-23 Thread Steven Schveighoffer via Digitalmars-d-learn

On 1/23/18 6:08 PM, Alex wrote:

On Tuesday, 23 January 2018 at 22:59:31 UTC, Steven Schveighoffer wrote:

On 1/23/18 5:52 PM, Steven Schveighoffer wrote:
I don't know the reason. You would think that accessing s would be 
relative to T.fun's stack frame, and have nothing to do with an 
instance of T.




using -vcg-ast gives a hint:

https://run.dlang.io/is/MZHPTY

Note that the T!(s) struct has a void *this member, that is probably 
the main stack frame pointer.




So, if change the fun to static, it cannot pickup the pointer and 
therefore can't call anything of the aliased object. If I get it right...


I think so. But this is a guess, as the generated call clearly never 
uses that 'this' member. Interesting to me that it calls that member 
'this', when 'this' is already defined!




cool option, by the way... didn't know anything about it. What does -ast 
do?


-vcg-ast means take the generated AST before optimization (I think), and 
output a d-source-like file (called file.d.cg) that shows the 
representation. Super useful when you are trying to figure out what the 
compiler does to your code. It only happens if compilation succeeds.


-ast, I don't think does anything, but not sure if that's what your 
question was.


The reason you don't know anything about it is because it's a debugging 
option and not documented :) At least, that's what I was told...


If you click on the AST button on run.dlang.io, you get the same thing.

-Steve


Re: static function and access frame

2018-01-23 Thread Alex via Digitalmars-d-learn
On Tuesday, 23 January 2018 at 22:59:31 UTC, Steven Schveighoffer 
wrote:

On 1/23/18 5:52 PM, Steven Schveighoffer wrote:
I don't know the reason. You would think that accessing s 
would be relative to T.fun's stack frame, and have nothing to 
do with an instance of T.




using -vcg-ast gives a hint:

https://run.dlang.io/is/MZHPTY

Note that the T!(s) struct has a void *this member, that is 
probably the main stack frame pointer.


-Steve


So, if change the fun to static, it cannot pickup the pointer and 
therefore can't call anything of the aliased object. If I get it 
right...


cool option, by the way... didn't know anything about it. What 
does -ast do?


Re: static function and access frame

2018-01-23 Thread Steven Schveighoffer via Digitalmars-d-learn

On 1/23/18 5:52 PM, Steven Schveighoffer wrote:
I don't know the reason. You would think that accessing s would be 
relative to T.fun's stack frame, and have nothing to do with an instance 
of T.




using -vcg-ast gives a hint:

https://run.dlang.io/is/MZHPTY

Note that the T!(s) struct has a void *this member, that is probably the 
main stack frame pointer.


-Steve


Re: static function and access frame

2018-01-23 Thread Alex via Digitalmars-d-learn
On Tuesday, 23 January 2018 at 22:52:47 UTC, Steven Schveighoffer 
wrote:


No:

void main()
{
auto s = S();
auto t = T!s();
t.fun;
}
struct S { void fun(){} }
struct T(alias s){ static fun() { s.fun; } }

Fails in 2.078.

I don't know the reason. You would think that accessing s would 
be relative to T.fun's stack frame, and have nothing to do with 
an instance of T.


Right. This was the intention.



I would file a bug, and see what the compiler devs say.


ok, thanks.



Re: static function and access frame

2018-01-23 Thread Steven Schveighoffer via Digitalmars-d-learn

On 1/23/18 5:33 PM, Ali Çehreli wrote:

On 01/23/2018 01:51 PM, Alex wrote:
 > Ok, I'm quite sure, I overlooked something.
 >
 > First version, working
 >
 > [code]
 > void main()
 > {
 >  auto s = S();
 >  auto t = T!s();
 >  t.fun;
 > }
 > struct S { void fun(){} }
 > struct T(alias s){ auto fun() { s.fun; } }
 > [/code]
 >
 > Now, the fun method of struct T has to become static and the problems
 > begin:
 > Error: static function app.main.T!(s).T.fun cannot access frame of
 > function D main

Good news: Works at least with 2.078 as it should:

void main()
{
     auto s = S();
     auto t = T!s();
     t.fun;
}
struct S { static void fun(){} }
struct T(alias s){ auto fun() { s.fun; } }

Ali



No:

void main()
{
auto s = S();
auto t = T!s();
t.fun;
}
struct S { void fun(){} }
struct T(alias s){ static fun() { s.fun; } }

Fails in 2.078.

I don't know the reason. You would think that accessing s would be 
relative to T.fun's stack frame, and have nothing to do with an instance 
of T.


I would file a bug, and see what the compiler devs say.

-Steve


Re: static function and access frame

2018-01-23 Thread Alex via Digitalmars-d-learn

On Tuesday, 23 January 2018 at 22:33:31 UTC, Ali Çehreli wrote:

On 01/23/2018 01:51 PM, Alex wrote:
> Ok, I'm quite sure, I overlooked something.
>
> First version, working
>
> [code]
> void main()
> {
>  auto s = S();
>  auto t = T!s();
>  t.fun;
> }
> struct S { void fun(){} }
> struct T(alias s){ auto fun() { s.fun; } }
> [/code]
>
> Now, the fun method of struct T has to become static and the
problems
> begin:
> Error: static function app.main.T!(s).T.fun cannot access
frame of
> function D main

Good news: Works at least with 2.078 as it should:

void main()
{
auto s = S();
auto t = T!s();
t.fun;
}
struct S { static void fun(){} }
struct T(alias s){ auto fun() { s.fun; } }

Ali


the other fun is meant to be static :)
so, the fun inside T.


Re: static function and access frame

2018-01-23 Thread Ali Çehreli via Digitalmars-d-learn

On 01/23/2018 01:51 PM, Alex wrote:
> Ok, I'm quite sure, I overlooked something.
>
> First version, working
>
> [code]
> void main()
> {
>  auto s = S();
>  auto t = T!s();
>  t.fun;
> }
> struct S { void fun(){} }
> struct T(alias s){ auto fun() { s.fun; } }
> [/code]
>
> Now, the fun method of struct T has to become static and the problems
> begin:
> Error: static function app.main.T!(s).T.fun cannot access frame of
> function D main

Good news: Works at least with 2.078 as it should:

void main()
{
auto s = S();
auto t = T!s();
t.fun;
}
struct S { static void fun(){} }
struct T(alias s){ auto fun() { s.fun; } }

Ali