Re: [Vala] error on property;



Yu Feng wrote:
Hi Alex,

Fortunately I was dealing with the same problem too.
The key is for a property, you almost always want a weak string, and
manage the string in the object. In other words, this code will be fine:

public class Info.PersonInfo {
  private string fio_;
  public weak string fio {
    get {
       fio_ = get_fio();
       return fio_;
  
I don't think that is safe.
You are returning a weak string, but the owner will free it before the return actually happens.

I posted an example but it had some typos, I post a correct version here:

private string _fio;
public weak string get_fio() {
  if (_fio == null) {
    _fio = "%s %C. %C".printf(l_name,f_name.get_char(),m_name.get_char());
  }
  return _fio;
}

the object will keep _fio for it's lifetime after which we *hope* all weak references will have gone away.

I agree that it is problematic; part of the issue seems to be that strings can't be reference counted and (apart from "weak") are also immutable. The strdup's in generated code drive me mad.

I shall mention again that the talloc allocator not only ref-counts and has owners but has destructors AND is type-safe. Talloc for string management at least would make things much simpler. However it could complicate transferring ownership to glib libraries which would use the wrong free function.

I plan to do this anyway for samba.

The way out might be how Delphi handled conversion between String and char*, when the string is cast to char* it get's strdup'd to a single reference string (but ownership is not transferred, but could be).

It's not a complete solution, my thinking cap is still on.

Sam
    }
  }
  public string get_fio(){
     // bluh bluh bluh
  }
}

I have to doubt that the memory management model for non-ref-counted
objects in VALA has some problem. I always go into trouble to use the
managed strings (string without weak), ending up with either compilation
failure or garbage C code that do a lot of useless strdup.

Yu
On Wed, 2008-08-20 at 19:46 +0400, Alexey Lubimov wrote:
  
public class Info.PersonInfo {
  public string f_name;
  public string m_name;
  public string l_name;
  public string fio  {get {return this.get_fio();}}

  public string get_fio() {
    return "%s %C. %C".printf(l_name,f_name.get_char(),m_name.get_char());
  }
}



PersonInfo.vala:12.7-12.28: error: Return value transfers ownership but 
method return type hasn't been declared to transfer ownership

That's wrong?
any tips?


_______________________________________________
Vala-list mailing list
Vala-list gnome org
http://mail.gnome.org/mailman/listinfo/vala-list
    

_______________________________________________
Vala-list mailing list
Vala-list gnome org
http://mail.gnome.org/mailman/listinfo/vala-list
  



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]