summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod')
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/pods/perlcall.pod1935
1 files changed, 0 insertions, 1935 deletions
diff --git a/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod b/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod
deleted file mode 100755
index 06f3aa33c74..00000000000
--- a/Master/tlpkg/tlperl.straw/lib/pods/perlcall.pod
+++ /dev/null
@@ -1,1935 +0,0 @@
-=head1 NAME
-
-perlcall - Perl calling conventions from C
-
-=head1 DESCRIPTION
-
-The purpose of this document is to show you how to call Perl subroutines
-directly from C, i.e., how to write I<callbacks>.
-
-Apart from discussing the C interface provided by Perl for writing
-callbacks the document uses a series of examples to show how the
-interface actually works in practice. In addition some techniques for
-coding callbacks are covered.
-
-Examples where callbacks are necessary include
-
-=over 5
-
-=item * An Error Handler
-
-You have created an XSUB interface to an application's C API.
-
-A fairly common feature in applications is to allow you to define a C
-function that will be called whenever something nasty occurs. What we
-would like is to be able to specify a Perl subroutine that will be
-called instead.
-
-=item * An Event Driven Program
-
-The classic example of where callbacks are used is when writing an
-event driven program like for an X windows application. In this case
-you register functions to be called whenever specific events occur,
-e.g., a mouse button is pressed, the cursor moves into a window or a
-menu item is selected.
-
-=back
-
-Although the techniques described here are applicable when embedding
-Perl in a C program, this is not the primary goal of this document.
-There are other details that must be considered and are specific to
-embedding Perl. For details on embedding Perl in C refer to
-L<perlembed>.
-
-Before you launch yourself head first into the rest of this document,
-it would be a good idea to have read the following two documents -
-L<perlxs> and L<perlguts>.
-
-=head1 THE CALL_ FUNCTIONS
-
-Although this stuff is easier to explain using examples, you first need
-be aware of a few important definitions.
-
-Perl has a number of C functions that allow you to call Perl
-subroutines. They are
-
- I32 call_sv(SV* sv, I32 flags);
- I32 call_pv(char *subname, I32 flags);
- I32 call_method(char *methname, I32 flags);
- I32 call_argv(char *subname, I32 flags, register char **argv);
-
-The key function is I<call_sv>. All the other functions are
-fairly simple wrappers which make it easier to call Perl subroutines in
-special cases. At the end of the day they will all call I<call_sv>
-to invoke the Perl subroutine.
-
-All the I<call_*> functions have a C<flags> parameter which is
-used to pass a bit mask of options to Perl. This bit mask operates
-identically for each of the functions. The settings available in the
-bit mask are discussed in L<FLAG VALUES>.
-
-Each of the functions will now be discussed in turn.
-
-=over 5
-
-=item call_sv
-
-I<call_sv> takes two parameters, the first, C<sv>, is an SV*.
-This allows you to specify the Perl subroutine to be called either as a
-C string (which has first been converted to an SV) or a reference to a
-subroutine. The section, I<Using call_sv>, shows how you can make
-use of I<call_sv>.
-
-=item call_pv
-
-The function, I<call_pv>, is similar to I<call_sv> except it
-expects its first parameter to be a C char* which identifies the Perl
-subroutine you want to call, e.g., C<call_pv("fred", 0)>. If the
-subroutine you want to call is in another package, just include the
-package name in the string, e.g., C<"pkg::fred">.
-
-=item call_method
-
-The function I<call_method> is used to call a method from a Perl
-class. The parameter C<methname> corresponds to the name of the method
-to be called. Note that the class that the method belongs to is passed
-on the Perl stack rather than in the parameter list. This class can be
-either the name of the class (for a static method) or a reference to an
-object (for a virtual method). See L<perlobj> for more information on
-static and virtual methods and L<Using call_method> for an example
-of using I<call_method>.
-
-=item call_argv
-
-I<call_argv> calls the Perl subroutine specified by the C string
-stored in the C<subname> parameter. It also takes the usual C<flags>
-parameter. The final parameter, C<argv>, consists of a NULL terminated
-list of C strings to be passed as parameters to the Perl subroutine.
-See I<Using call_argv>.
-
-=back
-
-All the functions return an integer. This is a count of the number of
-items returned by the Perl subroutine. The actual items returned by the
-subroutine are stored on the Perl stack.
-
-As a general rule you should I<always> check the return value from
-these functions. Even if you are expecting only a particular number of
-values to be returned from the Perl subroutine, there is nothing to
-stop someone from doing something unexpected--don't say you haven't
-been warned.
-
-=head1 FLAG VALUES
-
-The C<flags> parameter in all the I<call_*> functions is a bit mask
-which can consist of any combination of the symbols defined below,
-OR'ed together.
-
-
-=head2 G_VOID
-
-Calls the Perl subroutine in a void context.
-
-This flag has 2 effects:
-
-=over 5
-
-=item 1.
-
-It indicates to the subroutine being called that it is executing in
-a void context (if it executes I<wantarray> the result will be the
-undefined value).
-
-=item 2.
-
-It ensures that nothing is actually returned from the subroutine.
-
-=back
-
-The value returned by the I<call_*> function indicates how many
-items have been returned by the Perl subroutine - in this case it will
-be 0.
-
-
-=head2 G_SCALAR
-
-Calls the Perl subroutine in a scalar context. This is the default
-context flag setting for all the I<call_*> functions.
-
-This flag has 2 effects:
-
-=over 5
-
-=item 1.
-
-It indicates to the subroutine being called that it is executing in a
-scalar context (if it executes I<wantarray> the result will be false).
-
-=item 2.
-
-It ensures that only a scalar is actually returned from the subroutine.
-The subroutine can, of course, ignore the I<wantarray> and return a
-list anyway. If so, then only the last element of the list will be
-returned.
-
-=back
-
-The value returned by the I<call_*> function indicates how many
-items have been returned by the Perl subroutine - in this case it will
-be either 0 or 1.
-
-If 0, then you have specified the G_DISCARD flag.
-
-If 1, then the item actually returned by the Perl subroutine will be
-stored on the Perl stack - the section I<Returning a Scalar> shows how
-to access this value on the stack. Remember that regardless of how
-many items the Perl subroutine returns, only the last one will be
-accessible from the stack - think of the case where only one value is
-returned as being a list with only one element. Any other items that
-were returned will not exist by the time control returns from the
-I<call_*> function. The section I<Returning a list in a scalar
-context> shows an example of this behavior.
-
-
-=head2 G_ARRAY
-
-Calls the Perl subroutine in a list context.
-
-As with G_SCALAR, this flag has 2 effects:
-
-=over 5
-
-=item 1.
-
-It indicates to the subroutine being called that it is executing in a
-list context (if it executes I<wantarray> the result will be true).
-
-
-=item 2.
-
-It ensures that all items returned from the subroutine will be
-accessible when control returns from the I<call_*> function.
-
-=back
-
-The value returned by the I<call_*> function indicates how many
-items have been returned by the Perl subroutine.
-
-If 0, then you have specified the G_DISCARD flag.
-
-If not 0, then it will be a count of the number of items returned by
-the subroutine. These items will be stored on the Perl stack. The
-section I<Returning a list of values> gives an example of using the
-G_ARRAY flag and the mechanics of accessing the returned items from the
-Perl stack.
-
-=head2 G_DISCARD
-
-By default, the I<call_*> functions place the items returned from
-by the Perl subroutine on the stack. If you are not interested in
-these items, then setting this flag will make Perl get rid of them
-automatically for you. Note that it is still possible to indicate a
-context to the Perl subroutine by using either G_SCALAR or G_ARRAY.
-
-If you do not set this flag then it is I<very> important that you make
-sure that any temporaries (i.e., parameters passed to the Perl
-subroutine and values returned from the subroutine) are disposed of
-yourself. The section I<Returning a Scalar> gives details of how to
-dispose of these temporaries explicitly and the section I<Using Perl to
-dispose of temporaries> discusses the specific circumstances where you
-can ignore the problem and let Perl deal with it for you.
-
-=head2 G_NOARGS
-
-Whenever a Perl subroutine is called using one of the I<call_*>
-functions, it is assumed by default that parameters are to be passed to
-the subroutine. If you are not passing any parameters to the Perl
-subroutine, you can save a bit of time by setting this flag. It has
-the effect of not creating the C<@_> array for the Perl subroutine.
-
-Although the functionality provided by this flag may seem
-straightforward, it should be used only if there is a good reason to do
-so. The reason for being cautious is that even if you have specified
-the G_NOARGS flag, it is still possible for the Perl subroutine that
-has been called to think that you have passed it parameters.
-
-In fact, what can happen is that the Perl subroutine you have called
-can access the C<@_> array from a previous Perl subroutine. This will
-occur when the code that is executing the I<call_*> function has
-itself been called from another Perl subroutine. The code below
-illustrates this
-
- sub fred
- { print "@_\n" }
-
- sub joe
- { &fred }
-
- &joe(1,2,3);
-
-This will print
-
- 1 2 3
-
-What has happened is that C<fred> accesses the C<@_> array which
-belongs to C<joe>.
-
-
-=head2 G_EVAL
-
-It is possible for the Perl subroutine you are calling to terminate
-abnormally, e.g., by calling I<die> explicitly or by not actually
-existing. By default, when either of these events occurs, the
-process will terminate immediately. If you want to trap this
-type of event, specify the G_EVAL flag. It will put an I<eval { }>
-around the subroutine call.
-
-Whenever control returns from the I<call_*> function you need to
-check the C<$@> variable as you would in a normal Perl script.
-
-The value returned from the I<call_*> function is dependent on
-what other flags have been specified and whether an error has
-occurred. Here are all the different cases that can occur:
-
-=over 5
-
-=item *
-
-If the I<call_*> function returns normally, then the value
-returned is as specified in the previous sections.
-
-=item *
-
-If G_DISCARD is specified, the return value will always be 0.
-
-=item *
-
-If G_ARRAY is specified I<and> an error has occurred, the return value
-will always be 0.
-
-=item *
-
-If G_SCALAR is specified I<and> an error has occurred, the return value
-will be 1 and the value on the top of the stack will be I<undef>. This
-means that if you have already detected the error by checking C<$@> and
-you want the program to continue, you must remember to pop the I<undef>
-from the stack.
-
-=back
-
-See I<Using G_EVAL> for details on using G_EVAL.
-
-=head2 G_KEEPERR
-
-You may have noticed that using the G_EVAL flag described above will
-B<always> clear the C<$@> variable and set it to a string describing
-the error iff there was an error in the called code. This unqualified
-resetting of C<$@> can be problematic in the reliable identification of
-errors using the C<eval {}> mechanism, because the possibility exists
-that perl will call other code (end of block processing code, for
-example) between the time the error causes C<$@> to be set within
-C<eval {}>, and the subsequent statement which checks for the value of
-C<$@> gets executed in the user's script.
-
-This scenario will mostly be applicable to code that is meant to be
-called from within destructors, asynchronous callbacks, signal
-handlers, C<__DIE__> or C<__WARN__> hooks, and C<tie> functions. In
-such situations, you will not want to clear C<$@> at all, but simply to
-append any new errors to any existing value of C<$@>.
-
-The G_KEEPERR flag is meant to be used in conjunction with G_EVAL in
-I<call_*> functions that are used to implement such code. This flag
-has no effect when G_EVAL is not used.
-
-When G_KEEPERR is used, any errors in the called code will be prefixed
-with the string "\t(in cleanup)", and appended to the current value
-of C<$@>. an error will not be appended if that same error string is
-already at the end of C<$@>.
-
-In addition, a warning is generated using the appended string. This can be
-disabled using C<no warnings 'misc'>.
-
-The G_KEEPERR flag was introduced in Perl version 5.002.
-
-See I<Using G_KEEPERR> for an example of a situation that warrants the
-use of this flag.
-
-=head2 Determining the Context
-
-As mentioned above, you can determine the context of the currently
-executing subroutine in Perl with I<wantarray>. The equivalent test
-can be made in C by using the C<GIMME_V> macro, which returns
-C<G_ARRAY> if you have been called in a list context, C<G_SCALAR> if
-in a scalar context, or C<G_VOID> if in a void context (i.e. the
-return value will not be used). An older version of this macro is
-called C<GIMME>; in a void context it returns C<G_SCALAR> instead of
-C<G_VOID>. An example of using the C<GIMME_V> macro is shown in
-section I<Using GIMME_V>.
-
-=head1 EXAMPLES
-
-Enough of the definition talk, let's have a few examples.
-
-Perl provides many macros to assist in accessing the Perl stack.
-Wherever possible, these macros should always be used when interfacing
-to Perl internals. We hope this should make the code less vulnerable
-to any changes made to Perl in the future.
-
-Another point worth noting is that in the first series of examples I
-have made use of only the I<call_pv> function. This has been done
-to keep the code simpler and ease you into the topic. Wherever
-possible, if the choice is between using I<call_pv> and
-I<call_sv>, you should always try to use I<call_sv>. See
-I<Using call_sv> for details.
-
-=head2 No Parameters, Nothing returned
-
-This first trivial example will call a Perl subroutine, I<PrintUID>, to
-print out the UID of the process.
-
- sub PrintUID
- {
- print "UID is $<\n";
- }
-
-and here is a C function to call it
-
- static void
- call_PrintUID()
- {
- dSP;
-
- PUSHMARK(SP);
- call_pv("PrintUID", G_DISCARD|G_NOARGS);
- }
-
-Simple, eh.
-
-A few points to note about this example.
-
-=over 5
-
-=item 1.
-
-Ignore C<dSP> and C<PUSHMARK(SP)> for now. They will be discussed in
-the next example.
-
-=item 2.
-
-We aren't passing any parameters to I<PrintUID> so G_NOARGS can be
-specified.
-
-=item 3.
-
-We aren't interested in anything returned from I<PrintUID>, so
-G_DISCARD is specified. Even if I<PrintUID> was changed to
-return some value(s), having specified G_DISCARD will mean that they
-will be wiped by the time control returns from I<call_pv>.
-
-=item 4.
-
-As I<call_pv> is being used, the Perl subroutine is specified as a
-C string. In this case the subroutine name has been 'hard-wired' into the
-code.
-
-=item 5.
-
-Because we specified G_DISCARD, it is not necessary to check the value
-returned from I<call_pv>. It will always be 0.
-
-=back
-
-=head2 Passing Parameters
-
-Now let's make a slightly more complex example. This time we want to
-call a Perl subroutine, C<LeftString>, which will take 2 parameters--a
-string ($s) and an integer ($n). The subroutine will simply
-print the first $n characters of the string.
-
-So the Perl subroutine would look like this
-
- sub LeftString
- {
- my($s, $n) = @_;
- print substr($s, 0, $n), "\n";
- }
-
-The C function required to call I<LeftString> would look like this.
-
- static void
- call_LeftString(a, b)
- char * a;
- int b;
- {
- dSP;
-
- ENTER;
- SAVETMPS;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpv(a, 0)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK;
-
- call_pv("LeftString", G_DISCARD);
-
- FREETMPS;
- LEAVE;
- }
-
-Here are a few notes on the C function I<call_LeftString>.
-
-=over 5
-
-=item 1.
-
-Parameters are passed to the Perl subroutine using the Perl stack.
-This is the purpose of the code beginning with the line C<dSP> and
-ending with the line C<PUTBACK>. The C<dSP> declares a local copy
-of the stack pointer. This local copy should B<always> be accessed
-as C<SP>.
-
-=item 2.
-
-If you are going to put something onto the Perl stack, you need to know
-where to put it. This is the purpose of the macro C<dSP>--it declares
-and initializes a I<local> copy of the Perl stack pointer.
-
-All the other macros which will be used in this example require you to
-have used this macro.
-
-The exception to this rule is if you are calling a Perl subroutine
-directly from an XSUB function. In this case it is not necessary to
-use the C<dSP> macro explicitly--it will be declared for you
-automatically.
-
-=item 3.
-
-Any parameters to be pushed onto the stack should be bracketed by the
-C<PUSHMARK> and C<PUTBACK> macros. The purpose of these two macros, in
-this context, is to count the number of parameters you are
-pushing automatically. Then whenever Perl is creating the C<@_> array for the
-subroutine, it knows how big to make it.
-
-The C<PUSHMARK> macro tells Perl to make a mental note of the current
-stack pointer. Even if you aren't passing any parameters (like the
-example shown in the section I<No Parameters, Nothing returned>) you
-must still call the C<PUSHMARK> macro before you can call any of the
-I<call_*> functions--Perl still needs to know that there are no
-parameters.
-
-The C<PUTBACK> macro sets the global copy of the stack pointer to be
-the same as our local copy. If we didn't do this I<call_pv>
-wouldn't know where the two parameters we pushed were--remember that
-up to now all the stack pointer manipulation we have done is with our
-local copy, I<not> the global copy.
-
-=item 4.
-
-Next, we come to XPUSHs. This is where the parameters actually get
-pushed onto the stack. In this case we are pushing a string and an
-integer.
-
-See L<perlguts/"XSUBs and the Argument Stack"> for details
-on how the XPUSH macros work.
-
-=item 5.
-
-Because we created temporary values (by means of sv_2mortal() calls)
-we will have to tidy up the Perl stack and dispose of mortal SVs.
-
-This is the purpose of
-
- ENTER;
- SAVETMPS;
-
-at the start of the function, and
-
- FREETMPS;
- LEAVE;
-
-at the end. The C<ENTER>/C<SAVETMPS> pair creates a boundary for any
-temporaries we create. This means that the temporaries we get rid of
-will be limited to those which were created after these calls.
-
-The C<FREETMPS>/C<LEAVE> pair will get rid of any values returned by
-the Perl subroutine (see next example), plus it will also dump the
-mortal SVs we have created. Having C<ENTER>/C<SAVETMPS> at the
-beginning of the code makes sure that no other mortals are destroyed.
-
-Think of these macros as working a bit like using C<{> and C<}> in Perl
-to limit the scope of local variables.
-
-See the section I<Using Perl to dispose of temporaries> for details of
-an alternative to using these macros.
-
-=item 6.
-
-Finally, I<LeftString> can now be called via the I<call_pv> function.
-The only flag specified this time is G_DISCARD. Because we are passing
-2 parameters to the Perl subroutine this time, we have not specified
-G_NOARGS.
-
-=back
-
-=head2 Returning a Scalar
-
-Now for an example of dealing with the items returned from a Perl
-subroutine.
-
-Here is a Perl subroutine, I<Adder>, that takes 2 integer parameters
-and simply returns their sum.
-
- sub Adder
- {
- my($a, $b) = @_;
- $a + $b;
- }
-
-Because we are now concerned with the return value from I<Adder>, the C
-function required to call it is now a bit more complex.
-
- static void
- call_Adder(a, b)
- int a;
- int b;
- {
- dSP;
- int count;
-
- ENTER;
- SAVETMPS;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK;
-
- count = call_pv("Adder", G_SCALAR);
-
- SPAGAIN;
-
- if (count != 1)
- croak("Big trouble\n");
-
- printf ("The sum of %d and %d is %d\n", a, b, POPi);
-
- PUTBACK;
- FREETMPS;
- LEAVE;
- }
-
-Points to note this time are
-
-=over 5
-
-=item 1.
-
-The only flag specified this time was G_SCALAR. That means the C<@_>
-array will be created and that the value returned by I<Adder> will
-still exist after the call to I<call_pv>.
-
-=item 2.
-
-The purpose of the macro C<SPAGAIN> is to refresh the local copy of the
-stack pointer. This is necessary because it is possible that the memory
-allocated to the Perl stack has been reallocated whilst in the
-I<call_pv> call.
-
-If you are making use of the Perl stack pointer in your code you must
-always refresh the local copy using SPAGAIN whenever you make use
-of the I<call_*> functions or any other Perl internal function.
-
-=item 3.
-
-Although only a single value was expected to be returned from I<Adder>,
-it is still good practice to check the return code from I<call_pv>
-anyway.
-
-Expecting a single value is not quite the same as knowing that there
-will be one. If someone modified I<Adder> to return a list and we
-didn't check for that possibility and take appropriate action the Perl
-stack would end up in an inconsistent state. That is something you
-I<really> don't want to happen ever.
-
-=item 4.
-
-The C<POPi> macro is used here to pop the return value from the stack.
-In this case we wanted an integer, so C<POPi> was used.
-
-
-Here is the complete list of POP macros available, along with the types
-they return.
-
- POPs SV
- POPp pointer
- POPn double
- POPi integer
- POPl long
-
-=item 5.
-
-The final C<PUTBACK> is used to leave the Perl stack in a consistent
-state before exiting the function. This is necessary because when we
-popped the return value from the stack with C<POPi> it updated only our
-local copy of the stack pointer. Remember, C<PUTBACK> sets the global
-stack pointer to be the same as our local copy.
-
-=back
-
-
-=head2 Returning a list of values
-
-Now, let's extend the previous example to return both the sum of the
-parameters and the difference.
-
-Here is the Perl subroutine
-
- sub AddSubtract
- {
- my($a, $b) = @_;
- ($a+$b, $a-$b);
- }
-
-and this is the C function
-
- static void
- call_AddSubtract(a, b)
- int a;
- int b;
- {
- dSP;
- int count;
-
- ENTER;
- SAVETMPS;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK;
-
- count = call_pv("AddSubtract", G_ARRAY);
-
- SPAGAIN;
-
- if (count != 2)
- croak("Big trouble\n");
-
- printf ("%d - %d = %d\n", a, b, POPi);
- printf ("%d + %d = %d\n", a, b, POPi);
-
- PUTBACK;
- FREETMPS;
- LEAVE;
- }
-
-If I<call_AddSubtract> is called like this
-
- call_AddSubtract(7, 4);
-
-then here is the output
-
- 7 - 4 = 3
- 7 + 4 = 11
-
-Notes
-
-=over 5
-
-=item 1.
-
-We wanted list context, so G_ARRAY was used.
-
-=item 2.
-
-Not surprisingly C<POPi> is used twice this time because we were
-retrieving 2 values from the stack. The important thing to note is that
-when using the C<POP*> macros they come off the stack in I<reverse>
-order.
-
-=back
-
-=head2 Returning a list in a scalar context
-
-Say the Perl subroutine in the previous section was called in a scalar
-context, like this
-
- static void
- call_AddSubScalar(a, b)
- int a;
- int b;
- {
- dSP;
- int count;
- int i;
-
- ENTER;
- SAVETMPS;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK;
-
- count = call_pv("AddSubtract", G_SCALAR);
-
- SPAGAIN;
-
- printf ("Items Returned = %d\n", count);
-
- for (i = 1; i <= count; ++i)
- printf ("Value %d = %d\n", i, POPi);
-
- PUTBACK;
- FREETMPS;
- LEAVE;
- }
-
-The other modification made is that I<call_AddSubScalar> will print the
-number of items returned from the Perl subroutine and their value (for
-simplicity it assumes that they are integer). So if
-I<call_AddSubScalar> is called
-
- call_AddSubScalar(7, 4);
-
-then the output will be
-
- Items Returned = 1
- Value 1 = 3
-
-In this case the main point to note is that only the last item in the
-list is returned from the subroutine, I<AddSubtract> actually made it back to
-I<call_AddSubScalar>.
-
-
-=head2 Returning Data from Perl via the parameter list
-
-It is also possible to return values directly via the parameter list -
-whether it is actually desirable to do it is another matter entirely.
-
-The Perl subroutine, I<Inc>, below takes 2 parameters and increments
-each directly.
-
- sub Inc
- {
- ++ $_[0];
- ++ $_[1];
- }
-
-and here is a C function to call it.
-
- static void
- call_Inc(a, b)
- int a;
- int b;
- {
- dSP;
- int count;
- SV * sva;
- SV * svb;
-
- ENTER;
- SAVETMPS;
-
- sva = sv_2mortal(newSViv(a));
- svb = sv_2mortal(newSViv(b));
-
- PUSHMARK(SP);
- XPUSHs(sva);
- XPUSHs(svb);
- PUTBACK;
-
- count = call_pv("Inc", G_DISCARD);
-
- if (count != 0)
- croak ("call_Inc: expected 0 values from 'Inc', got %d\n",
- count);
-
- printf ("%d + 1 = %d\n", a, SvIV(sva));
- printf ("%d + 1 = %d\n", b, SvIV(svb));
-
- FREETMPS;
- LEAVE;
- }
-
-To be able to access the two parameters that were pushed onto the stack
-after they return from I<call_pv> it is necessary to make a note
-of their addresses--thus the two variables C<sva> and C<svb>.
-
-The reason this is necessary is that the area of the Perl stack which
-held them will very likely have been overwritten by something else by
-the time control returns from I<call_pv>.
-
-
-
-
-=head2 Using G_EVAL
-
-Now an example using G_EVAL. Below is a Perl subroutine which computes
-the difference of its 2 parameters. If this would result in a negative
-result, the subroutine calls I<die>.
-
- sub Subtract
- {
- my ($a, $b) = @_;
-
- die "death can be fatal\n" if $a < $b;
-
- $a - $b;
- }
-
-and some C to call it
-
- static void
- call_Subtract(a, b)
- int a;
- int b;
- {
- dSP;
- int count;
-
- ENTER;
- SAVETMPS;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK;
-
- count = call_pv("Subtract", G_EVAL|G_SCALAR);
-
- SPAGAIN;
-
- /* Check the eval first */
- if (SvTRUE(ERRSV))
- {
- printf ("Uh oh - %s\n", SvPV_nolen(ERRSV));
- POPs;
- }
- else
- {
- if (count != 1)
- croak("call_Subtract: wanted 1 value from 'Subtract', got %d\n",
- count);
-
- printf ("%d - %d = %d\n", a, b, POPi);
- }
-
- PUTBACK;
- FREETMPS;
- LEAVE;
- }
-
-If I<call_Subtract> is called thus
-
- call_Subtract(4, 5)
-
-the following will be printed
-
- Uh oh - death can be fatal
-
-Notes
-
-=over 5
-
-=item 1.
-
-We want to be able to catch the I<die> so we have used the G_EVAL
-flag. Not specifying this flag would mean that the program would
-terminate immediately at the I<die> statement in the subroutine
-I<Subtract>.
-
-=item 2.
-
-The code
-
- if (SvTRUE(ERRSV))
- {
- printf ("Uh oh - %s\n", SvPV_nolen(ERRSV));
- POPs;
- }
-
-is the direct equivalent of this bit of Perl
-
- print "Uh oh - $@\n" if $@;
-
-C<PL_errgv> is a perl global of type C<GV *> that points to the
-symbol table entry containing the error. C<ERRSV> therefore
-refers to the C equivalent of C<$@>.
-
-=item 3.
-
-Note that the stack is popped using C<POPs> in the block where
-C<SvTRUE(ERRSV)> is true. This is necessary because whenever a
-I<call_*> function invoked with G_EVAL|G_SCALAR returns an error,
-the top of the stack holds the value I<undef>. Because we want the
-program to continue after detecting this error, it is essential that
-the stack is tidied up by removing the I<undef>.
-
-=back
-
-
-=head2 Using G_KEEPERR
-
-Consider this rather facetious example, where we have used an XS
-version of the call_Subtract example above inside a destructor:
-
- package Foo;
- sub new { bless {}, $_[0] }
- sub Subtract {
- my($a,$b) = @_;
- die "death can be fatal" if $a < $b;
- $a - $b;
- }
- sub DESTROY { call_Subtract(5, 4); }
- sub foo { die "foo dies"; }
-
- package main;
- eval { Foo->new->foo };
- print "Saw: $@" if $@; # should be, but isn't
-
-This example will fail to recognize that an error occurred inside the
-C<eval {}>. Here's why: the call_Subtract code got executed while perl
-was cleaning up temporaries when exiting the eval block, and because
-call_Subtract is implemented with I<call_pv> using the G_EVAL
-flag, it promptly reset C<$@>. This results in the failure of the
-outermost test for C<$@>, and thereby the failure of the error trap.
-
-Appending the G_KEEPERR flag, so that the I<call_pv> call in
-call_Subtract reads:
-
- count = call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
-
-will preserve the error and restore reliable error handling.
-
-=head2 Using call_sv
-
-In all the previous examples I have 'hard-wired' the name of the Perl
-subroutine to be called from C. Most of the time though, it is more
-convenient to be able to specify the name of the Perl subroutine from
-within the Perl script.
-
-Consider the Perl code below
-
- sub fred
- {
- print "Hello there\n";
- }
-
- CallSubPV("fred");
-
-Here is a snippet of XSUB which defines I<CallSubPV>.
-
- void
- CallSubPV(name)
- char * name
- CODE:
- PUSHMARK(SP);
- call_pv(name, G_DISCARD|G_NOARGS);
-
-That is fine as far as it goes. The thing is, the Perl subroutine
-can be specified as only a string. For Perl 4 this was adequate,
-but Perl 5 allows references to subroutines and anonymous subroutines.
-This is where I<call_sv> is useful.
-
-The code below for I<CallSubSV> is identical to I<CallSubPV> except
-that the C<name> parameter is now defined as an SV* and we use
-I<call_sv> instead of I<call_pv>.
-
- void
- CallSubSV(name)
- SV * name
- CODE:
- PUSHMARK(SP);
- call_sv(name, G_DISCARD|G_NOARGS);
-
-Because we are using an SV to call I<fred> the following can all be used
-
- CallSubSV("fred");
- CallSubSV(\&fred);
- $ref = \&fred;
- CallSubSV($ref);
- CallSubSV( sub { print "Hello there\n" } );
-
-As you can see, I<call_sv> gives you much greater flexibility in
-how you can specify the Perl subroutine.
-
-You should note that if it is necessary to store the SV (C<name> in the
-example above) which corresponds to the Perl subroutine so that it can
-be used later in the program, it not enough just to store a copy of the
-pointer to the SV. Say the code above had been like this
-
- static SV * rememberSub;
-
- void
- SaveSub1(name)
- SV * name
- CODE:
- rememberSub = name;
-
- void
- CallSavedSub1()
- CODE:
- PUSHMARK(SP);
- call_sv(rememberSub, G_DISCARD|G_NOARGS);
-
-The reason this is wrong is that by the time you come to use the
-pointer C<rememberSub> in C<CallSavedSub1>, it may or may not still refer
-to the Perl subroutine that was recorded in C<SaveSub1>. This is
-particularly true for these cases
-
- SaveSub1(\&fred);
- CallSavedSub1();
-
- SaveSub1( sub { print "Hello there\n" } );
- CallSavedSub1();
-
-By the time each of the C<SaveSub1> statements above have been executed,
-the SV*s which corresponded to the parameters will no longer exist.
-Expect an error message from Perl of the form
-
- Can't use an undefined value as a subroutine reference at ...
-
-for each of the C<CallSavedSub1> lines.
-
-Similarly, with this code
-
- $ref = \&fred;
- SaveSub1($ref);
- $ref = 47;
- CallSavedSub1();
-
-you can expect one of these messages (which you actually get is dependent on
-the version of Perl you are using)
-
- Not a CODE reference at ...
- Undefined subroutine &main::47 called ...
-
-The variable $ref may have referred to the subroutine C<fred>
-whenever the call to C<SaveSub1> was made but by the time
-C<CallSavedSub1> gets called it now holds the number C<47>. Because we
-saved only a pointer to the original SV in C<SaveSub1>, any changes to
-$ref will be tracked by the pointer C<rememberSub>. This means that
-whenever C<CallSavedSub1> gets called, it will attempt to execute the
-code which is referenced by the SV* C<rememberSub>. In this case
-though, it now refers to the integer C<47>, so expect Perl to complain
-loudly.
-
-A similar but more subtle problem is illustrated with this code
-
- $ref = \&fred;
- SaveSub1($ref);
- $ref = \&joe;
- CallSavedSub1();
-
-This time whenever C<CallSavedSub1> get called it will execute the Perl
-subroutine C<joe> (assuming it exists) rather than C<fred> as was
-originally requested in the call to C<SaveSub1>.
-
-To get around these problems it is necessary to take a full copy of the
-SV. The code below shows C<SaveSub2> modified to do that
-
- static SV * keepSub = (SV*)NULL;
-
- void
- SaveSub2(name)
- SV * name
- CODE:
- /* Take a copy of the callback */
- if (keepSub == (SV*)NULL)
- /* First time, so create a new SV */
- keepSub = newSVsv(name);
- else
- /* Been here before, so overwrite */
- SvSetSV(keepSub, name);
-
- void
- CallSavedSub2()
- CODE:
- PUSHMARK(SP);
- call_sv(keepSub, G_DISCARD|G_NOARGS);
-
-To avoid creating a new SV every time C<SaveSub2> is called,
-the function first checks to see if it has been called before. If not,
-then space for a new SV is allocated and the reference to the Perl
-subroutine, C<name> is copied to the variable C<keepSub> in one
-operation using C<newSVsv>. Thereafter, whenever C<SaveSub2> is called
-the existing SV, C<keepSub>, is overwritten with the new value using
-C<SvSetSV>.
-
-=head2 Using call_argv
-
-Here is a Perl subroutine which prints whatever parameters are passed
-to it.
-
- sub PrintList
- {
- my(@list) = @_;
-
- foreach (@list) { print "$_\n" }
- }
-
-and here is an example of I<call_argv> which will call
-I<PrintList>.
-
- static char * words[] = {"alpha", "beta", "gamma", "delta", NULL};
-
- static void
- call_PrintList()
- {
- dSP;
-
- call_argv("PrintList", G_DISCARD, words);
- }
-
-Note that it is not necessary to call C<PUSHMARK> in this instance.
-This is because I<call_argv> will do it for you.
-
-=head2 Using call_method
-
-Consider the following Perl code
-
- {
- package Mine;
-
- sub new
- {
- my($type) = shift;
- bless [@_]
- }
-
- sub Display
- {
- my ($self, $index) = @_;
- print "$index: $$self[$index]\n";
- }
-
- sub PrintID
- {
- my($class) = @_;
- print "This is Class $class version 1.0\n";
- }
- }
-
-It implements just a very simple class to manage an array. Apart from
-the constructor, C<new>, it declares methods, one static and one
-virtual. The static method, C<PrintID>, prints out simply the class
-name and a version number. The virtual method, C<Display>, prints out a
-single element of the array. Here is an all Perl example of using it.
-
- $a = Mine->new('red', 'green', 'blue');
- $a->Display(1);
- Mine->PrintID;
-
-will print
-
- 1: green
- This is Class Mine version 1.0
-
-Calling a Perl method from C is fairly straightforward. The following
-things are required
-
-=over 5
-
-=item *
-
-a reference to the object for a virtual method or the name of the class
-for a static method.
-
-=item *
-
-the name of the method.
-
-=item *
-
-any other parameters specific to the method.
-
-=back
-
-Here is a simple XSUB which illustrates the mechanics of calling both
-the C<PrintID> and C<Display> methods from C.
-
- void
- call_Method(ref, method, index)
- SV * ref
- char * method
- int index
- CODE:
- PUSHMARK(SP);
- XPUSHs(ref);
- XPUSHs(sv_2mortal(newSViv(index)));
- PUTBACK;
-
- call_method(method, G_DISCARD);
-
- void
- call_PrintID(class, method)
- char * class
- char * method
- CODE:
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpv(class, 0)));
- PUTBACK;
-
- call_method(method, G_DISCARD);
-
-
-So the methods C<PrintID> and C<Display> can be invoked like this
-
- $a = Mine->new('red', 'green', 'blue');
- call_Method($a, 'Display', 1);
- call_PrintID('Mine', 'PrintID');
-
-The only thing to note is that in both the static and virtual methods,
-the method name is not passed via the stack--it is used as the first
-parameter to I<call_method>.
-
-=head2 Using GIMME_V
-
-Here is a trivial XSUB which prints the context in which it is
-currently executing.
-
- void
- PrintContext()
- CODE:
- I32 gimme = GIMME_V;
- if (gimme == G_VOID)
- printf ("Context is Void\n");
- else if (gimme == G_SCALAR)
- printf ("Context is Scalar\n");
- else
- printf ("Context is Array\n");
-
-and here is some Perl to test it
-
- PrintContext;
- $a = PrintContext;
- @a = PrintContext;
-
-The output from that will be
-
- Context is Void
- Context is Scalar
- Context is Array
-
-=head2 Using Perl to dispose of temporaries
-
-In the examples given to date, any temporaries created in the callback
-(i.e., parameters passed on the stack to the I<call_*> function or
-values returned via the stack) have been freed by one of these methods
-
-=over 5
-
-=item *
-
-specifying the G_DISCARD flag with I<call_*>.
-
-=item *
-
-explicitly disposed of using the C<ENTER>/C<SAVETMPS> -
-C<FREETMPS>/C<LEAVE> pairing.
-
-=back
-
-There is another method which can be used, namely letting Perl do it
-for you automatically whenever it regains control after the callback
-has terminated. This is done by simply not using the
-
- ENTER;
- SAVETMPS;
- ...
- FREETMPS;
- LEAVE;
-
-sequence in the callback (and not, of course, specifying the G_DISCARD
-flag).
-
-If you are going to use this method you have to be aware of a possible
-memory leak which can arise under very specific circumstances. To
-explain these circumstances you need to know a bit about the flow of
-control between Perl and the callback routine.
-
-The examples given at the start of the document (an error handler and
-an event driven program) are typical of the two main sorts of flow
-control that you are likely to encounter with callbacks. There is a
-very important distinction between them, so pay attention.
-
-In the first example, an error handler, the flow of control could be as
-follows. You have created an interface to an external library.
-Control can reach the external library like this
-
- perl --> XSUB --> external library
-
-Whilst control is in the library, an error condition occurs. You have
-previously set up a Perl callback to handle this situation, so it will
-get executed. Once the callback has finished, control will drop back to
-Perl again. Here is what the flow of control will be like in that
-situation
-
- perl --> XSUB --> external library
- ...
- error occurs
- ...
- external library --> call_* --> perl
- |
- perl <-- XSUB <-- external library <-- call_* <----+
-
-After processing of the error using I<call_*> is completed,
-control reverts back to Perl more or less immediately.
-
-In the diagram, the further right you go the more deeply nested the
-scope is. It is only when control is back with perl on the extreme
-left of the diagram that you will have dropped back to the enclosing
-scope and any temporaries you have left hanging around will be freed.
-
-In the second example, an event driven program, the flow of control
-will be more like this
-
- perl --> XSUB --> event handler
- ...
- event handler --> call_* --> perl
- |
- event handler <-- call_* <----+
- ...
- event handler --> call_* --> perl
- |
- event handler <-- call_* <----+
- ...
- event handler --> call_* --> perl
- |
- event handler <-- call_* <----+
-
-In this case the flow of control can consist of only the repeated
-sequence
-
- event handler --> call_* --> perl
-
-for practically the complete duration of the program. This means that
-control may I<never> drop back to the surrounding scope in Perl at the
-extreme left.
-
-So what is the big problem? Well, if you are expecting Perl to tidy up
-those temporaries for you, you might be in for a long wait. For Perl
-to dispose of your temporaries, control must drop back to the
-enclosing scope at some stage. In the event driven scenario that may
-never happen. This means that as time goes on, your program will
-create more and more temporaries, none of which will ever be freed. As
-each of these temporaries consumes some memory your program will
-eventually consume all the available memory in your system--kapow!
-
-So here is the bottom line--if you are sure that control will revert
-back to the enclosing Perl scope fairly quickly after the end of your
-callback, then it isn't absolutely necessary to dispose explicitly of
-any temporaries you may have created. Mind you, if you are at all
-uncertain about what to do, it doesn't do any harm to tidy up anyway.
-
-
-=head2 Strategies for storing Callback Context Information
-
-
-Potentially one of the trickiest problems to overcome when designing a
-callback interface can be figuring out how to store the mapping between
-the C callback function and the Perl equivalent.
-
-To help understand why this can be a real problem first consider how a
-callback is set up in an all C environment. Typically a C API will
-provide a function to register a callback. This will expect a pointer
-to a function as one of its parameters. Below is a call to a
-hypothetical function C<register_fatal> which registers the C function
-to get called when a fatal error occurs.
-
- register_fatal(cb1);
-
-The single parameter C<cb1> is a pointer to a function, so you must
-have defined C<cb1> in your code, say something like this
-
- static void
- cb1()
- {
- printf ("Fatal Error\n");
- exit(1);
- }
-
-Now change that to call a Perl subroutine instead
-
- static SV * callback = (SV*)NULL;
-
- static void
- cb1()
- {
- dSP;
-
- PUSHMARK(SP);
-
- /* Call the Perl sub to process the callback */
- call_sv(callback, G_DISCARD);
- }
-
-
- void
- register_fatal(fn)
- SV * fn
- CODE:
- /* Remember the Perl sub */
- if (callback == (SV*)NULL)
- callback = newSVsv(fn);
- else
- SvSetSV(callback, fn);
-
- /* register the callback with the external library */
- register_fatal(cb1);
-
-where the Perl equivalent of C<register_fatal> and the callback it
-registers, C<pcb1>, might look like this
-
- # Register the sub pcb1
- register_fatal(\&pcb1);
-
- sub pcb1
- {
- die "I'm dying...\n";
- }
-
-The mapping between the C callback and the Perl equivalent is stored in
-the global variable C<callback>.
-
-This will be adequate if you ever need to have only one callback
-registered at any time. An example could be an error handler like the
-code sketched out above. Remember though, repeated calls to
-C<register_fatal> will replace the previously registered callback
-function with the new one.
-
-Say for example you want to interface to a library which allows asynchronous
-file i/o. In this case you may be able to register a callback whenever
-a read operation has completed. To be of any use we want to be able to
-call separate Perl subroutines for each file that is opened. As it
-stands, the error handler example above would not be adequate as it
-allows only a single callback to be defined at any time. What we
-require is a means of storing the mapping between the opened file and
-the Perl subroutine we want to be called for that file.
-
-Say the i/o library has a function C<asynch_read> which associates a C
-function C<ProcessRead> with a file handle C<fh>--this assumes that it
-has also provided some routine to open the file and so obtain the file
-handle.
-
- asynch_read(fh, ProcessRead)
-
-This may expect the C I<ProcessRead> function of this form
-
- void
- ProcessRead(fh, buffer)
- int fh;
- char * buffer;
- {
- ...
- }
-
-To provide a Perl interface to this library we need to be able to map
-between the C<fh> parameter and the Perl subroutine we want called. A
-hash is a convenient mechanism for storing this mapping. The code
-below shows a possible implementation
-
- static HV * Mapping = (HV*)NULL;
-
- void
- asynch_read(fh, callback)
- int fh
- SV * callback
- CODE:
- /* If the hash doesn't already exist, create it */
- if (Mapping == (HV*)NULL)
- Mapping = newHV();
-
- /* Save the fh -> callback mapping */
- hv_store(Mapping, (char*)&fh, sizeof(fh), newSVsv(callback), 0);
-
- /* Register with the C Library */
- asynch_read(fh, asynch_read_if);
-
-and C<asynch_read_if> could look like this
-
- static void
- asynch_read_if(fh, buffer)
- int fh;
- char * buffer;
- {
- dSP;
- SV ** sv;
-
- /* Get the callback associated with fh */
- sv = hv_fetch(Mapping, (char*)&fh , sizeof(fh), FALSE);
- if (sv == (SV**)NULL)
- croak("Internal error...\n");
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv(fh)));
- XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
- PUTBACK;
-
- /* Call the Perl sub */
- call_sv(*sv, G_DISCARD);
- }
-
-For completeness, here is C<asynch_close>. This shows how to remove
-the entry from the hash C<Mapping>.
-
- void
- asynch_close(fh)
- int fh
- CODE:
- /* Remove the entry from the hash */
- (void) hv_delete(Mapping, (char*)&fh, sizeof(fh), G_DISCARD);
-
- /* Now call the real asynch_close */
- asynch_close(fh);
-
-So the Perl interface would look like this
-
- sub callback1
- {
- my($handle, $buffer) = @_;
- }
-
- # Register the Perl callback
- asynch_read($fh, \&callback1);
-
- asynch_close($fh);
-
-The mapping between the C callback and Perl is stored in the global
-hash C<Mapping> this time. Using a hash has the distinct advantage that
-it allows an unlimited number of callbacks to be registered.
-
-What if the interface provided by the C callback doesn't contain a
-parameter which allows the file handle to Perl subroutine mapping? Say
-in the asynchronous i/o package, the callback function gets passed only
-the C<buffer> parameter like this
-
- void
- ProcessRead(buffer)
- char * buffer;
- {
- ...
- }
-
-Without the file handle there is no straightforward way to map from the
-C callback to the Perl subroutine.
-
-In this case a possible way around this problem is to predefine a
-series of C functions to act as the interface to Perl, thus
-
- #define MAX_CB 3
- #define NULL_HANDLE -1
- typedef void (*FnMap)();
-
- struct MapStruct {
- FnMap Function;
- SV * PerlSub;
- int Handle;
- };
-
- static void fn1();
- static void fn2();
- static void fn3();
-
- static struct MapStruct Map [MAX_CB] =
- {
- { fn1, NULL, NULL_HANDLE },
- { fn2, NULL, NULL_HANDLE },
- { fn3, NULL, NULL_HANDLE }
- };
-
- static void
- Pcb(index, buffer)
- int index;
- char * buffer;
- {
- dSP;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
- PUTBACK;
-
- /* Call the Perl sub */
- call_sv(Map[index].PerlSub, G_DISCARD);
- }
-
- static void
- fn1(buffer)
- char * buffer;
- {
- Pcb(0, buffer);
- }
-
- static void
- fn2(buffer)
- char * buffer;
- {
- Pcb(1, buffer);
- }
-
- static void
- fn3(buffer)
- char * buffer;
- {
- Pcb(2, buffer);
- }
-
- void
- array_asynch_read(fh, callback)
- int fh
- SV * callback
- CODE:
- int index;
- int null_index = MAX_CB;
-
- /* Find the same handle or an empty entry */
- for (index = 0; index < MAX_CB; ++index)
- {
- if (Map[index].Handle == fh)
- break;
-
- if (Map[index].Handle == NULL_HANDLE)
- null_index = index;
- }
-
- if (index == MAX_CB && null_index == MAX_CB)
- croak ("Too many callback functions registered\n");
-
- if (index == MAX_CB)
- index = null_index;
-
- /* Save the file handle */
- Map[index].Handle = fh;
-
- /* Remember the Perl sub */
- if (Map[index].PerlSub == (SV*)NULL)
- Map[index].PerlSub = newSVsv(callback);
- else
- SvSetSV(Map[index].PerlSub, callback);
-
- asynch_read(fh, Map[index].Function);
-
- void
- array_asynch_close(fh)
- int fh
- CODE:
- int index;
-
- /* Find the file handle */
- for (index = 0; index < MAX_CB; ++ index)
- if (Map[index].Handle == fh)
- break;
-
- if (index == MAX_CB)
- croak ("could not close fh %d\n", fh);
-
- Map[index].Handle = NULL_HANDLE;
- SvREFCNT_dec(Map[index].PerlSub);
- Map[index].PerlSub = (SV*)NULL;
-
- asynch_close(fh);
-
-In this case the functions C<fn1>, C<fn2>, and C<fn3> are used to
-remember the Perl subroutine to be called. Each of the functions holds
-a separate hard-wired index which is used in the function C<Pcb> to
-access the C<Map> array and actually call the Perl subroutine.
-
-There are some obvious disadvantages with this technique.
-
-Firstly, the code is considerably more complex than with the previous
-example.
-
-Secondly, there is a hard-wired limit (in this case 3) to the number of
-callbacks that can exist simultaneously. The only way to increase the
-limit is by modifying the code to add more functions and then
-recompiling. None the less, as long as the number of functions is
-chosen with some care, it is still a workable solution and in some
-cases is the only one available.
-
-To summarize, here are a number of possible methods for you to consider
-for storing the mapping between C and the Perl callback
-
-=over 5
-
-=item 1. Ignore the problem - Allow only 1 callback
-
-For a lot of situations, like interfacing to an error handler, this may
-be a perfectly adequate solution.
-
-=item 2. Create a sequence of callbacks - hard wired limit
-
-If it is impossible to tell from the parameters passed back from the C
-callback what the context is, then you may need to create a sequence of C
-callback interface functions, and store pointers to each in an array.
-
-=item 3. Use a parameter to map to the Perl callback
-
-A hash is an ideal mechanism to store the mapping between C and Perl.
-
-=back
-
-
-=head2 Alternate Stack Manipulation
-
-
-Although I have made use of only the C<POP*> macros to access values
-returned from Perl subroutines, it is also possible to bypass these
-macros and read the stack using the C<ST> macro (See L<perlxs> for a
-full description of the C<ST> macro).
-
-Most of the time the C<POP*> macros should be adequate, the main
-problem with them is that they force you to process the returned values
-in sequence. This may not be the most suitable way to process the
-values in some cases. What we want is to be able to access the stack in
-a random order. The C<ST> macro as used when coding an XSUB is ideal
-for this purpose.
-
-The code below is the example given in the section I<Returning a list
-of values> recoded to use C<ST> instead of C<POP*>.
-
- static void
- call_AddSubtract2(a, b)
- int a;
- int b;
- {
- dSP;
- I32 ax;
- int count;
-
- ENTER;
- SAVETMPS;
-
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK;
-
- count = call_pv("AddSubtract", G_ARRAY);
-
- SPAGAIN;
- SP -= count;
- ax = (SP - PL_stack_base) + 1;
-
- if (count != 2)
- croak("Big trouble\n");
-
- printf ("%d + %d = %d\n", a, b, SvIV(ST(0)));
- printf ("%d - %d = %d\n", a, b, SvIV(ST(1)));
-
- PUTBACK;
- FREETMPS;
- LEAVE;
- }
-
-Notes
-
-=over 5
-
-=item 1.
-
-Notice that it was necessary to define the variable C<ax>. This is
-because the C<ST> macro expects it to exist. If we were in an XSUB it
-would not be necessary to define C<ax> as it is already defined for
-you.
-
-=item 2.
-
-The code
-
- SPAGAIN;
- SP -= count;
- ax = (SP - PL_stack_base) + 1;
-
-sets the stack up so that we can use the C<ST> macro.
-
-=item 3.
-
-Unlike the original coding of this example, the returned
-values are not accessed in reverse order. So C<ST(0)> refers to the
-first value returned by the Perl subroutine and C<ST(count-1)>
-refers to the last.
-
-=back
-
-=head2 Creating and calling an anonymous subroutine in C
-
-As we've already shown, C<call_sv> can be used to invoke an
-anonymous subroutine. However, our example showed a Perl script
-invoking an XSUB to perform this operation. Let's see how it can be
-done inside our C code:
-
- ...
-
- SV *cvrv = eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
-
- ...
-
- call_sv(cvrv, G_VOID|G_NOARGS);
-
-C<eval_pv> is used to compile the anonymous subroutine, which
-will be the return value as well (read more about C<eval_pv> in
-L<perlapi/eval_pv>). Once this code reference is in hand, it
-can be mixed in with all the previous examples we've shown.
-
-=head1 LIGHTWEIGHT CALLBACKS
-
-Sometimes you need to invoke the same subroutine repeatedly.
-This usually happens with a function that acts on a list of
-values, such as Perl's built-in sort(). You can pass a
-comparison function to sort(), which will then be invoked
-for every pair of values that needs to be compared. The first()
-and reduce() functions from L<List::Util> follow a similar
-pattern.
-
-In this case it is possible to speed up the routine (often
-quite substantially) by using the lightweight callback API.
-The idea is that the calling context only needs to be
-created and destroyed once, and the sub can be called
-arbitrarily many times in between.
-
-It is usual to pass parameters using global variables -- typically
-$_ for one parameter, or $a and $b for two parameters -- rather
-than via @_. (It is possible to use the @_ mechanism if you know
-what you're doing, though there is as yet no supported API for
-it. It's also inherently slower.)
-
-The pattern of macro calls is like this:
-
- dMULTICALL; /* Declare local variables */
- I32 gimme = G_SCALAR; /* context of the call: G_SCALAR,
- * G_LIST, or G_VOID */
-
- PUSH_MULTICALL(cv); /* Set up the context for calling cv,
- and set local vars appropriately */
-
- /* loop */ {
- /* set the value(s) af your parameter variables */
- MULTICALL; /* Make the actual call */
- } /* end of loop */
-
- POP_MULTICALL; /* Tear down the calling context */
-
-For some concrete examples, see the implementation of the
-first() and reduce() functions of List::Util 1.18. There you
-will also find a header file that emulates the multicall API
-on older versions of perl.
-
-=head1 SEE ALSO
-
-L<perlxs>, L<perlguts>, L<perlembed>
-
-=head1 AUTHOR
-
-Paul Marquess
-
-Special thanks to the following people who assisted in the creation of
-the document.
-
-Jeff Okamoto, Tim Bunce, Nick Gianniotis, Steve Kelem, Gurusamy Sarathy
-and Larry Wall.
-
-=head1 DATE
-
-Version 1.3, 14th Apr 1997