Thread overview
static member functions
Jun 15, 2004
John Fletcher
Jun 15, 2004
Ben Hinkle
Jun 16, 2004
john
Jun 18, 2004
John Fletcher
Jun 18, 2004
Norbert Nemec
June 15, 2004
I am working with some automatically generated D interface code where code for each C++ class being wrapped is put into a different file.  The problem is that the classes interact, and that I have a problem with permission to see a specific static member function between classes.  It all works if the code is all in one file.

Example:

  public class A {
    private void* Ptr;
    private static void* getPtr(A obj) {
     return (obj === null) ? null : Ptr; }
  }

is an extract from automatically generated code.

If a second class B has a constructor with an A as an argument the code generated is

  public class B {
  // ...
    public this(A a)  {
    // contains   A.getPtr(a) which fails unless the code for B is in
the same file as the code for A.
    // This applies even if I change the permission of the static
function to public.
    }
  }

One workaround is to put into the defintion of A the extra member function

  public void* Ptr() { return getPtr(this); }

which can be seen from the other file, i.e. putting a.Ptr() for
A.getPtr().

I am in a position to edit the code which does the automatic generation, and the aim is to find a general solution which would result in the generation of valid code which works.  There should be no need to edit the result.

At the moment the question is, is there a way in which the code of class A could be altered so that class B can see  A.setPtr(obj) even when they are in separate files?

More details of the background to this are on

http://www.prowiki.org/wiki4d/wiki.cgi?DwithSwig

Thanks

John Fletcher


June 15, 2004
Declaring getPtr as static and public should work. I recommend getting an example of the problem with as few lines as possible and post it on digitalmars.D.bugs.

John Fletcher wrote:

> I am working with some automatically generated D interface code where code for each C++ class being wrapped is put into a different file.  The problem is that the classes interact, and that I have a problem with permission to see a specific static member function between classes.  It all works if the code is all in one file.
> 
> Example:
> 
>   public class A {
>     private void* Ptr;
>     private static void* getPtr(A obj) {
>      return (obj === null) ? null : Ptr; }
>   }
> 
> is an extract from automatically generated code.
> 
> If a second class B has a constructor with an A as an argument the code generated is
> 
>   public class B {
>   // ...
>     public this(A a)  {
>     // contains   A.getPtr(a) which fails unless the code for B is in
> the same file as the code for A.
>     // This applies even if I change the permission of the static
> function to public.
>     }
>   }
> 
> One workaround is to put into the defintion of A the extra member function
> 
>   public void* Ptr() { return getPtr(this); }
>
> which can be seen from the other file, i.e. putting a.Ptr() for
> A.getPtr().
> 
> I am in a position to edit the code which does the automatic generation, and the aim is to find a general solution which would result in the generation of valid code which works.  There should be no need to edit the result.
> 
> At the moment the question is, is there a way in which the code of class A could be altered so that class B can see  A.setPtr(obj) even when they are in separate files?
> 
> More details of the background to this are on
> 
> http://www.prowiki.org/wiki4d/wiki.cgi?DwithSwig
> 
> Thanks
> 
> John Fletcher

June 16, 2004
In article <camq9o$1sb1$1@digitaldaemon.com>, Ben Hinkle says...
>
>
>Declaring getPtr as static and public should work. I recommend getting an example of the problem with as few lines as possible and post it on digitalmars.D.bugs.
>

Thanks for the hint. It isn't a bug, but a misunderstanding of mine.  The problem is that the automatically generated file has the same name as the class within it. When class A has a public static member e.g.

class A
{

public static void* getPtr(A obj)  {
//  something
}

}

The structure in a class B importing a class A is that A is the module and the class is referred to as A.A

import A;

class B
{

public void* getAPtr(A obj) {
return A.A.getPtr(a);   // This works.
}

//public void* getAPtr(A obj) {
//   return A.getPtr(a);   This fails.
//}

}

I now need to alter the SWIG code generator for D to do the correct thing.

Thanks again.

John


June 18, 2004

john@bunbury28.plus.com wrote:

> In article <camq9o$1sb1$1@digitaldaemon.com>, Ben Hinkle says...
> >
> >
> >Declaring getPtr as static and public should work. I recommend getting an example of the problem with as few lines as possible and post it on digitalmars.D.bugs.
> >
>
> Thanks for the hint. It isn't a bug, but a misunderstanding of mine.  The problem is that the automatically generated file has the same name as the class within it.
>
> I now need to alter the SWIG code generator for D to do the correct thing.
>
> Thanks again.
>
> John

The alternative is to rename the file e.g. classA.d instead of A.d

This is what I have done.

John


June 18, 2004
John Fletcher wrote:

> I am working with some automatically generated D interface code where code for each C++ class being wrapped is put into a different file.  The problem is that the classes interact, and that I have a problem with permission to see a specific static member function between classes.  It all works if the code is all in one file.
> 
> Example:
> 
>   public class A {
>     private void* Ptr;
>     private static void* getPtr(A obj) {
>      return (obj === null) ? null : Ptr; }
>   }

It might just be a typo in the post, but still: accessing "Ptr" within a static function will not work. Instead, it should be "obj.Ptr".