in reply to Re: XS/Inline::C concat *any* two SVs.
in thread XS/Inline::C concat *any* two SVs.

he scalar is having its reference count dropped twice -- once when you leave the XS function, and once when @_ is cleaned up after that function returns.

Thankyou. That was the bit I was not getting.

The reason for wanting to handle the case of readonly inputs is that I cannot guarentee that the caller (should this ever get into the wild), won't pass a constant that becomes the first parameter.

The reason for wanting to return the argument is the same reason that I can do

print $scalar1 .= $scalar2;

I hate modules that force me to do

my $arg = 1; someMutator( $arg ); print $arg;

Instead of

print someMutator( 1 );

Try using Tk if its methods did not return the object:

my $widget = Tk::SomeWidget->new( ... ); $widget->Add( ... ); $widget->pack( ... );

Instead of

my $widget = Tk::SomeWidget->new( ... )->Add( ... )->pack( ... );

So, now I understand why the increment is necessary, can you clarify what is wrong (technically rather than preference), with doing an increment to counter one of the decrements?


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^3: XS/Inline::C concat *any* two SVs.
by dragonchild (Archbishop) on May 29, 2006 at 02:21 UTC
    The reason for wanting to handle the case of readonly inputs is that I cannot guarentee that the caller (should this ever get into the wild), won't pass a constant that becomes the first parameter.

    YAGNI - if you don't need, don't code for it. It's only causing you issues. Instead, the better solution would be to, for the nonce:

    • die a horrible death if the first param is readonly
    • Write a comment as to why
    • Finish the coding task and move on

    My criteria for good software:
    1. Does it work?
    2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

      The problem of dealing with readonly inputs is a wide-spread one with XS code. Win32::API demonstrates this. In order to ensure against traps when passing parameters from Perl that are destined for system APIs written in C that will expect to be able to use strlen to determine string lengths, the author chooses to append a null to string inputs. In most cases this is unneccessary as Perl already does this, but given the unknowable nature of the APIs called through that interface, and the parameters they can take, it's good insurance.

      The downside is that even when passing string constants that are never modified, it forces the user to do

      my $stringConstant = 'the constant'; $api->Call( $stringConstant, ... );

      In order that the module can append the insurance null. This is a necessary precaution, but a PITA for the user. I wish to avoid that scenario. Creamygoodness has explained the cause of the problem I was encountering, so my post has equiped me with the information I need to deal with this situation correctly.

      The problem is a generic one with all XS code, and as I am not under time pressure to provide the solution, it is my nature to try and understand the nitty gritty of the problems I encounter so that I will be equiped to deal with them in the future. I'm a strong proponent of YAGNI when designing code, but in this case, the problem is generic enough that I will definitely need it at some point in the future, even if I decided that it isn't critical to the project that raised it.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
Re^3: XS/Inline::C concat *any* two SVs.
by vkon (Curate) on May 28, 2006 at 22:13 UTC
    perl/Tk is messy