El Sistema de FLAGS de Perl

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);

Casiano Rodríguez León
2010-03-22