En Perl el sistema de banderas utiliza los primeros 24 bits de un entero de 32 bits. Los restantes 8 bits se utilizan para almacenar información sobre el tipo. Las banderas nunca se acceden directamente: La API de Perl provee un conjunto de macros para su lectura y modificación (Véase la sección SV Flags de la documentación en perlapi).
Por ejemplo, el módulo Readonly provee una forma alternativa de tener constantes en Perl 5. En el caso de los escalares lo hace manipulando la bandera READONLY :
lhp@nereida:~/Lperl/src/XSUB/Example$ perl -MDevel::Peek -MReadonly -de 0 main::(-e:1): 0 DB<1> Readonly::Scalar $sca => 4 DB<2> Dump $sca SV = IV(0x838349c) at 0x8462efc REFCNT = 1 FLAGS = (IOK,READONLY,pIOK) IV = 4
El código del submódulo Readonly::XS que se encarga de las constantes escalares es extraordinariamente compacto:
#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" MODULE = Readonly::XS PACKAGE = Readonly::XS int is_sv_readonly(sv) SV *sv PROTOTYPE: $ CODE: RETVAL = SvREADONLY(sv); OUTPUT: RETVAL void make_sv_readonly(sv) SV *sv PROTOTYPE: $ CODE: SvREADONLY_on(sv);
xsubpp
que debe generar
un prototipo para la interface Perl a la subrutina. El prototipo indica que se espera
un único argumento escalar.
RETVAL
casa con el tipo de retorno declarado para la función.
Por defecto la función C generada usará RETVAL
para guardar el
valor de retorno. En los casos sencillos el valor de RETVAL
será colocado en la primera posición disponible de la pila,
para que sea recibido por Perl como
el valor retornado por la XSUB.
CODE:
como ocurre en este ejemplo,
el valor en RETVAL
no es devuelto automáticamente y es necesario
explicitarlo en una sección OUTPUT:
.
READONLY
es accedida por medio
de las macros SvREADONLY y SvREADONLY_on y nunca
por acceso directo del valor en SVf_READONLY .
Casiano Rodríguez León