Properties don't behave like variables?

Artur Skawina art.08.09 at gmail.com
Mon May 7 15:43:12 PDT 2012


On 05/08/12 00:32, Iain Buclaw wrote:
> On 7 May 2012 23:23, Artur Skawina <art.08.09 at gmail.com> wrote:
>>> On 2012-05-07 21:53, Steven Schveighoffer wrote:
>>>
>>>> How do you overload the operator for a property? For example:
>>
>> It can of course be done [1], but i think the question was whether the
>> compiler should do the obvious rewrite from 'prop() |= 2' to 'prop(prop()|2)'.
>> Unconditionally, as not doing it every time would be confusing and lead
>> to bugs where the setter gets bypassed.
>> But what about the case where you want to return a ref to /different/
>> objects? I guess mandating a setter wouldn't be problem, and still better
>> than the alternative.
>>
>> artur
>>
>> [1] I shouldn't even be posting this, as someone might actually think about
>> using something like it...
>>
>>   struct S {
>>      int i;
>>      @property ref p() { return *cast(PropProxy!(typeof(this),"i")*)&this; }
>>   }
>>
>>   int main()
>>   {
>>      S s;
>>      s.p |= 2;
>>      return s.p;
>>   }
>>
>>   struct PropProxy(RT, string sym) {
>>      @property ref data() { return *cast(RT*)&this; }
>>      @property ref get() { return __traits(getMember, data, sym); }
>>      alias get this;
>>      auto opOpAssign(string op, T)(T b) {
>>         return mixin("data." ~ sym ~ " " ~ op ~ "= b");
>>      }
>>   }
>>
>> Keep in mind this isn't a serious suggestion, more of a joke; i wrote it just
>> out of curiosity, to check if GDC would be able to turn it all into
>> "mov $0x2, %eax; ret;". ;)
>>
> 
> Your wishful thinking serves you well. :-)
> 

Just to make it clear - the above results in:

08049e50 <_Dmain>:
 8049e50:       55                      push   %ebp
 8049e51:       b8 02 00 00 00          mov    $0x2,%eax
 8049e56:       89 e5                   mov    %esp,%ebp
 8049e58:       5d                      pop    %ebp
 8049e59:       c3                      ret    

and i believe that after Iain's recent GDC ABI changes the frame pointer
manipulation is gone, so it all *really* compiles down to just one instruction.
But i haven't checked with a current GDC. r748:ab99d67f04c2 generates the above
asm sequence, which is good enough for this quick test, ;)

artur


More information about the Digitalmars-d mailing list