in reply to readonly access to C-level strings
So, this is how it works:
sv=newSV(0); SvUPGRADE(sv, SVt_PV); SvPOK_only(sv); SvPV_set(sv, pointer); SvLEN_set(sv, 0); SvCUR_set(sv, length); SvREADONLY_on(sv);
pointer is the address of the first byte of the string and length its length.
The trick is the SvLEN_set(sv, 0) statement. It prevents Safefree() to be called on the pointer during destruction of the SV.
If you work with such variables and want to avoid copying even further in the perl code you have to be quite careful. A simple $x=$y or sub x {my ($x)=@_;} x($y) where $y is such a read-only SV will copy it.
So, I found the best way to avoid copying is to work with references: $x=\$y; substr $$x, ... or sub x {my ($x)=@_; substr $$x, ...} x(\$y)
Torsten
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: [SOLUTION] readonly access to C-level strings
by Anonymous Monk on Jul 03, 2009 at 07:51 UTC | |
by roboticus (Chancellor) on Jul 03, 2009 at 11:42 UTC |