Re: struct and pointer to pointer in ATTR

2008-08-28 Thread Allison Randal

NotFound wrote:

Hello.

The current grammar for ATTR in pmc2c allows declarations of the form:
type * varname

In the perl6multisub pmc we have the attribute candidates_sorted whose
intended type is candidate_info **, having two problems:

The current grammar allows a single pointer, not a pointer to a
pointer. This can be easily solved.

candidate_info is a struct declared in the pmc file (as typedef struct
candidate_info { ... } candidate_info), then his declaration is not
viewable at the point of inclusion of the generated h file. This can
be solved by declaring the ATTR with type struct candidate_info
instead of candidate_info, but the grammar for ATTR does not allow it.

I think that allowing struct in ATTR is the simpler solution to the
second problem, because the intended usage is for struct used
internally in the pmc, not for his documented interface.

The attached patch changes the ATTR grammar and uses the changes to
clean the workarounds currently used in perl6multsub pmc. It passes
all coretest on my system, both building with C or with C++.


Approved for application. But, keep in mind that ATTRs other than 
INTVAL, FLOATVAL, STRING *, and PMC * cannot have automatic 
GET_ATTR/SET_ATTR accessor macros generated for them, and any C PMCs 
with these low-level ATTRs cannot be subclassed from PIR/HLLs.


Allison


Re: struct and pointer to pointer in ATTR

2008-08-28 Thread NotFound
On Thu, Aug 28, 2008 at 11:33 AM, Allison Randal [EMAIL PROTECTED] wrote:

 Approved for application. But, keep in mind that ATTRs other than INTVAL,
 FLOATVAL, STRING *, and PMC * cannot have automatic GET_ATTR/SET_ATTR
 accessor macros generated for them, and any C PMCs with these low-level
 ATTRs cannot be subclassed from PIR/HLLs.

Applied in r30617 the pmc2c part and in r30618 the perl6multisub part.

-- 
Salu2


struct and pointer to pointer in ATTR

2008-08-27 Thread NotFound
Hello.

The current grammar for ATTR in pmc2c allows declarations of the form:
type * varname

In the perl6multisub pmc we have the attribute candidates_sorted whose
intended type is candidate_info **, having two problems:

The current grammar allows a single pointer, not a pointer to a
pointer. This can be easily solved.

candidate_info is a struct declared in the pmc file (as typedef struct
candidate_info { ... } candidate_info), then his declaration is not
viewable at the point of inclusion of the generated h file. This can
be solved by declaring the ATTR with type struct candidate_info
instead of candidate_info, but the grammar for ATTR does not allow it.

I think that allowing struct in ATTR is the simpler solution to the
second problem, because the intended usage is for struct used
internally in the pmc, not for his documented interface.

The attached patch changes the ATTR grammar and uses the changes to
clean the workarounds currently used in perl6multsub pmc. It passes
all coretest on my system, both building with C or with C++.

-- 
Salu2
Index: lib/Parrot/Pmc2c/Parser.pm
===
--- lib/Parrot/Pmc2c/Parser.pm	(revisión: 30584)
+++ lib/Parrot/Pmc2c/Parser.pm	(copia de trabajo)
@@ -105,7 +105,7 @@
 
 # type
 \s+
-(INTVAL|FLOATVAL|STRING\s+\*|PMC\s+\*|\w+\s+\*|Parrot_\w*)
+(INTVAL|FLOATVAL|STRING\s+\*|PMC\s+\*|(?:struct\s+)?\w+\s+\*+|Parrot_\w*)
 
 # name
 \s*
Index: languages/perl6/src/pmc/perl6multisub.pmc
===
--- languages/perl6/src/pmc/perl6multisub.pmc	(revisión: 30584)
+++ languages/perl6/src/pmc/perl6multisub.pmc	(copia de trabajo)
@@ -553,7 +553,7 @@
 
 pmclass Perl6MultiSub extends MultiSub need_ext dynpmc group perl6_group {
 ATTR PMC  *candidates;
-ATTR void *candidates_sorted;
+ATTR struct candidate_info **candidates_sorted;
 
 /*
 
@@ -618,15 +618,7 @@
 /* Make sure that we have a candidate list built. */
 candidate_info **candidates = NULL;
 PMC *unsorted;
-{
-/* Use an aux var to get the attribute, because of
- * current problems with the declaration of
- * attributes.
- */
-void *aux;
-GETATTR_Perl6MultiSub_candidates_sorted(interp, SELF, aux);
-candidates = (candidate_info **)aux;
-}
+GETATTR_Perl6MultiSub_candidates_sorted(interp, SELF, candidates);
 GETATTR_Perl6MultiSub_candidates(interp, SELF, unsorted);
 if (!candidates) {
 candidates = sort_candidiates(interp, unsorted);