Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: Concatenation with empty string -- good enough to force physical copy?

by ikegami (Patriarch)
on Dec 03, 2020 at 07:05 UTC ( [id://11124571]=note: print w/replies, xml ) Need Help??


in reply to Concatenation with empty string -- good enough to force physical copy?

This is forward-compatible:

use Inline C => <<'__EOS__'; void force_ordinary_string(SV *sv) { SvPV_force(sv); } __EOS__ force_ordinary_string($$buf);
  • Comment on Re: Concatenation with empty string -- good enough to force physical copy?
  • Download Code

Replies are listed 'Best First'.
Re^2: Concatenation with empty string -- good enough to force physical copy?
by ikegami (Patriarch) on Dec 03, 2020 at 07:09 UTC

    I just noticed the footnote in the OP. Sounds like you have C/XS code that modifies the string buffer which uses SvPV, SvPVbyte or SvPVutf8 instead of SvPV_force, SvPVbyte_force or SvPVutf8_force. Bad!

      Can you please explain, why is it bad? Pointer to string buffer goes "as is" to 3d party function, and even with explicit flag (there is one) not to make a copy in data structures created somewhere in 3d party code: "if FALSE, wrap the user's pixel buffer, otherwise, make a deep copy". I was actually proud because of this "no copying, low memory, fast code" thing. All works as expected, no leaks with long running code, no failures, etc. After images are saved, piddles themselves are not needed (nor checked what happened to them). The only issue was when identical piddles happened in original list, then every other channel was mirrored, but I don't know if it means buffer itself gets modified or image coder gets confused.

      And thank you for C recipe for forcing a copy.

        You seem to have answered your own question. All kinds of weird things can happen, including modifying scalars you didn't intend to modify. You could even change what string literals return!

        They don't force a copy; they force the scalar to contain a modifiable string. If that's already the case, they do nothing more than the non-force equivalents.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11124571]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (6)
As of 2024-04-18 13:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found