Thread overview
Bug? package attribute half working on child packages.
Mar 15, 2009
Jeremie Pelletier
Mar 15, 2009
Daniel Keep
March 15, 2009
I don't know if it's really a bug, but the package protection attribute seems to have a different semantic in the current packages than in nested packages.

For example, say you have the module test which declares the following:
---
module test.Foo;

package uint myVar;
package class MyClass {}

package void MyFunc();

class Foo {
    package void MyFoo();
}
---

All declarations are accessible from any module in the test package, but if you try and access them from a child package, say test.somepackage.Foo, then only myVar and MyClass are accessible, both MyFunc and Foo.MyFoo says they aren't accessible from test.somepackage.Foo.

I'm using the latest DMD version 2.
March 15, 2009
On Sun, Mar 15, 2009 at 5:55 PM, Jeremie Pelletier <jeremiep@gmail.com> wrote:
> I don't know if it's really a bug, but the package protection attribute seems to have a different semantic in the current packages than in nested packages.
>
> For example, say you have the module test which declares the following:
> ---
> module test.Foo;
>
> package uint myVar;
> package class MyClass {}
>
> package void MyFunc();
>
> class Foo {
>    package void MyFoo();
> }
> ---
>
> All declarations are accessible from any module in the test package, but if you try and access them from a child package, say test.somepackage.Foo, then only myVar and MyClass are accessible, both MyFunc and Foo.MyFoo says they aren't accessible from test.somepackage.Foo.
>
> I'm using the latest DMD version 2.
>

http://d.puremagic.com/issues/show_bug.cgi?id=2529

Feel free to comment or vote.
March 15, 2009

Jarrett Billingsley wrote:
> On Sun, Mar 15, 2009 at 5:55 PM, Jeremie Pelletier <jeremiep@gmail.com> wrote:
>> I don't know if it's really a bug, but the package protection attribute seems to have a different semantic in the current packages than in nested packages.
>>
>> For example, say you have the module test which declares the following:
>> ---
>> module test.Foo;
>>
>> package uint myVar;
>> package class MyClass {}
>>
>> package void MyFunc();
>>
>> class Foo {
>>    package void MyFoo();
>> }
>> ---
>>
>> All declarations are accessible from any module in the test package, but if you try and access them from a child package, say test.somepackage.Foo, then only myVar and MyClass are accessible, both MyFunc and Foo.MyFoo says they aren't accessible from test.somepackage.Foo.
>>
>> I'm using the latest DMD version 2.
>>
> 
> http://d.puremagic.com/issues/show_bug.cgi?id=2529
> 
> Feel free to comment or vote.

A quick poke in the source code reveals a hasPackageAccess function in access.c.  Haven't tried this, but maybe the attached patch (made against the 1.041 release) will get the desired behaviour; I just quickly changed it to search not just the scope's package, but also its ancestors.

  -- Daniel




March 16, 2009
On Sun, Mar 15, 2009 at 7:53 PM, Daniel Keep <daniel.keep.lists@gmail.com> wrote:
>
>
> Jarrett Billingsley wrote:
>> On Sun, Mar 15, 2009 at 5:55 PM, Jeremie Pelletier <jeremiep@gmail.com> wrote:
>>> I don't know if it's really a bug, but the package protection attribute seems to have a different semantic in the current packages than in nested packages.
>>>
>>> For example, say you have the module test which declares the following:
>>> ---
>>> module test.Foo;
>>>
>>> package uint myVar;
>>> package class MyClass {}
>>>
>>> package void MyFunc();
>>>
>>> class Foo {
>>>    package void MyFoo();
>>> }
>>> ---
>>>
>>> All declarations are accessible from any module in the test package, but if you try and access them from a child package, say test.somepackage.Foo, then only myVar and MyClass are accessible, both MyFunc and Foo.MyFoo says they aren't accessible from test.somepackage.Foo.
>>>
>>> I'm using the latest DMD version 2.
>>>
>>
>> http://d.puremagic.com/issues/show_bug.cgi?id=2529
>>
>> Feel free to comment or vote.
>
> A quick poke in the source code reveals a hasPackageAccess function in access.c.  Haven't tried this, but maybe the attached patch (made against the 1.041 release) will get the desired behaviour; I just quickly changed it to search not just the scope's package, but also its ancestors.
>
>  -- Daniel
>
>
>
> --- access.c    2009-03-05 01:56:46.000000000 +1100
> +++ access.c    2009-03-16 10:47:56.187500000 +1100
> @@ -305,12 +305,21 @@
>        printf("\tthis is in package '%s'\n", s->toChars());
>  #endif
>
> -    if (s && s == sc->module->parent)
> +    if (s)
>     {
> -#if LOG
> -       printf("\ts is in same package as sc\n");
> -#endif
> -       return 1;
> +        Dsymbol scp = sc->module->parent;
> +        for (Dsymbol scp = sc->module->parent;
> +             scp && scp->isPackage() && !scp->isModule();
> +             scp = scp->parent)
> +        {
> +            if (s && s == scp)
> +            {
> +#if LOG
> +               printf("\ts is in same package as or ancestor package of sc\n");
> +#endif
> +               return 1;
> +            }
> +        }
>     }

Oh!  I suppose we can now.. give this a shot, and recompile the thing!  :D