# New Ticket Created by  Vladimir Marek 
# Please include the string:  [perl #128815]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=128815 >


class A is repr<CPPStruct>{
    has $x;
}

I don't want $x mapped to C++ object attribute, I want it to be only part of 
it's perl 6 representation. I was thinking about adding a trait, something like.

multi sub trait_mod:<is>(Attribute $r, :$native-private!) is export(:DEFAULT){}
class A is repr<CPPStruct>{
    has $x is native-private;
}

But I'm not enough skilled to implement it :) I was not able to find in 
CPPStruct.c how to detect that attribute has given trait. So I have tried to 
disable the warnings

diff --git a/src/6model/reprs/CPPStruct.c b/src/6model/reprs/CPPStruct.c
index f987734..5c0d6a5 100644
--- a/src/6model/reprs/CPPStruct.c
+++ b/src/6model/reprs/CPPStruct.c
@@ -235,8 +235,8 @@ static void compute_allocation_strategy(MVMThreadContext 
*tc, MVMObject *repr_in
                     repr_data->member_types[i] = type;
                 }
                 else {
-                    MVM_exception_throw_adhoc(tc,
-                        "CPPStruct representation only handles int, num, 
CArray, CPointer, CStruct, CPPStruct and CUnion");
+//                    MVM_exception_throw_adhoc(tc,
+//                       "CPPStruct representation only handles int, num, 
CArray, CPointer, CStruct, CPPStruct and CUnion");
                 }
             }
             else {
@@ -393,8 +393,8 @@ static void get_attribute(MVMThreadContext *tc, MVMSTable 
*st, MVMObject *root,
             MVMint32 real_slot = repr_data->attribute_locations[slot] >> 
MVM_CPPSTRUCT_ATTR_SHIFT;
 
             if (type == MVM_CPPSTRUCT_ATTR_IN_STRUCT) {
-                MVM_exception_throw_adhoc(tc,
-                    "CPPStruct can't perform boxed get on flattened attributes 
yet");
+//                MVM_exception_throw_adhoc(tc,
+//                    "CPPStruct can't perform boxed get on flattened 
attributes yet");
             }
             else {
                 MVMObject *typeobj = repr_data->member_types[slot];



That at first seems to work:

class A is repr<CPPStruct>{
    has $x;

    method m() {
        $x //= do {
            my $s = Supplier.new;
            $s.Supply;
        }
    }
}

my $x=A.new();
say $x.m();

But now my method does not return Supply.new, but rather A.new;

If I replace 'has $x' by 'my $x', it returns what I would expect - Supply.new

And I got stuck :)

Thank you
__ 
  Vlad

Reply via email to