Hi,
The Inline::C cookbook presents an example that contains the following new() 
function which creates the Soldier object:

----------------------------------
SV* new(char* class, char* name, char* rank, long serial) {
    Soldier* soldier;
    New(42, soldier, 1, Soldier);
    SV*      obj_ref = newSViv(0);
    SV*      obj = newSVrv(obj_ref, class);

    soldier->name = savepv(name);
    soldier->rank = savepv(rank);
    soldier->serial = serial;
        
    sv_setiv(obj, (IV)soldier);
    SvREADONLY_on(obj);
    return obj_ref;
}
---------------------------------

A while back, at http://www.mail-archive.com/[EMAIL PROTECTED]/msg01370.html 
Ken Williams suggested the following (more succinct) rewrite:

--------------------------------- 
SV* new(char* class, char* name, char* rank, long serial) {
    Soldier* soldier;
    New(42, soldier, 1, Soldier);

    soldier->name = savepv(name);
    soldier->rank = savepv(rank);
    soldier->serial = serial;

    return sv_setref_pv(newSViv(0), class, (void *)soldier);
}
----------------------------------

But the 2 versions of new() return slightly different objects. The original 
(cookbook) version returns this:

----------------------------------
SV = PVIV(0x2f5b8c) at 0x2f4940
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,ROK)
  IV = 0
  RV = 0x2f3ca4
  SV = PVMG(0x2febbc) at 0x2f3ca4
    REFCNT = 1
    FLAGS = (OBJECT,IOK,READONLY,pIOK)
    IV = 3143860
    NV = 0
    PV = 0
    STASH = 0x45fca8    "Soldier"
  PV = 0x2f3ca4 ""
  CUR = 0
  LEN = 0
----------------------------------

But, in Ken's rewrite, that READONLY flag is absent in the returned object.

1) What are the likely/possible ramifications of that READONLY flag being unset 
? (I note that the cookbook version explicitly sets that READONLY flag ... 
presumably for a good reason.)

2) How does one modify Ken's rewrite so that it sets that READONLY flag ?

I recently asked about this at perlmonks ( 
http://www.perlmonks.org/index.pl?node_id=635113 ) but didn't receive any 
responses on the matter.

It's doubtful that I really *need* to know the answers (as I'm quite happy to 
stick with the cookbook approach) but I am, nevertheless, curious about it.

Note: I've also changed a couple of things in the versions of new() that I've 
presented above. The original versions used strdup(), which I've replaced with 
savepv() - and they used malloc(), which I've replaced with new().

Cheers,
Rob

Reply via email to