| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
March 15, 2009 Bug? package attribute half working on child packages. | ||||
|---|---|---|---|---|
| ||||
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 Re: Bug? package attribute half working on child packages. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jeremie Pelletier | 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 Re: Bug? package attribute half working on child packages. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley Attachments: |
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 Re: Bug? package attribute half working on child packages. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Daniel Keep | 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
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply