allow optional XSUB parameters without being forced to use a
Gurusamy Sarathy [Mon, 21 Feb 2000 18:31:42 +0000 (18:31 +0000)]
default (from Hugo van der Sanden)

p4raw-id: //depot/perl@5183

lib/ExtUtils/xsubpp
pod/perlfunc.pod
pod/perlxs.pod

index 431d75a..4ff0d38 100755 (executable)
@@ -1576,7 +1576,11 @@ sub generate_init {
              eval qq/print "\\t$var;\\n"/;
              warn $@   if  $@;
            }
-           $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+           if ($defaults{$var} eq 'undef') {
+               $deferred .= eval qq/"\\n\\tif (items >= $num) {\\n$expr;\\n\\t}\\n"/;
+           } else {
+               $deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
+           }
            warn $@   if  $@;
     } elsif ($ScopeThisXSUB or $expr !~ /^\t\$var =/) {
            if ($name_printed) {
index 2dd496a..42bbd46 100644 (file)
@@ -4362,7 +4362,7 @@ and the conversion letter:
    h       interpret integer as C type "short" or "unsigned short"
            If no flags, interpret integer as C type "int" or "unsigned"
 
-There is also two Perl-specific flags:
+There are also two Perl-specific flags:
 
    V       interpret integer as Perl's standard integer type
    v       interpret string as a vector of integers, output as
index a2755b8..2055ce6 100644 (file)
@@ -502,9 +502,9 @@ C<ST(1)>.
 
 =head2 Default Parameter Values
 
-Default values for XSUB arguments can be specified by
-placing an assignment statement in the parameter list.  The
-default value may be a number or a string.  Defaults should
+Default values for XSUB arguments can be specified by placing an
+assignment statement in the parameter list.  The default value may
+be a number, a string or the special string C<undef>.  Defaults should
 always be used on the right-most parameters only.
 
 To allow the XSUB for rpcb_gettime() to have a default host
@@ -1314,6 +1314,19 @@ methods will be called as this:
 
      THIS->set_blue( val );
 
+You could also write a single get/set method using an optional argument:
+
+     int
+     color::blue( val = undef )
+         int val
+         PROTOTYPE $;$
+         CODE:
+             if (items > 1)
+                 THIS->set_blue( val );
+             RETVAL = THIS->blue();
+         OUTPUT:
+             RETVAL
+
 If the function's name is B<DESTROY> then the C++ C<delete> function will be
 called and C<THIS> will be given as its parameter.  The generated C++ code for