Bibliografía

1
Lincoln D. Stein.
Network Programming with Perl.
Addison Wesley, USA, 2001.
ISBN 0-201-61571-1.

2
Casiano Rodriguez-León.
El Diseño y Análisis de Algoritmos Paralelos.
Gobierno de Canarias, DGUI, 1998.

3
Christiansen T. and Schwartz L.
Perl Cookbook.
O'Reilly, USA, 1998.
ISBN 1-56592-243-3.

4
D. Libes.
Exploring Expect.
O'Reilly and Associates, 1995.

5
Paul Bausch.
Amazon Hacks.
O'Reilly, 2003.

6
Simon Cozens.
Advanced Perl Programming, Second Edition.
O'Reilly Media, 2005.

7
Tim Jenness and Simon Cozens.
Extending and embedding Perl.
Manning Publications Co., Greenwich, CT, USA, 2003.

8
Brian Ingerson.
Pathollogically Polluting Perl with C, Python and Other Rubbish using Inline.pm.
http://nereida.deioc.ull.es/ lhp/pdfps/ingy.inline.pdf, 2001.

9
Gisle Aas.
PerlGuts Illustrated.
http://gisle.aas.no/perl/illguts/, 2001.
Casiano Rodríguez León
2010-04-19
IS->x; 375 #line 376 "Coord.c" 376 XSprePUSH; PUSHn((double)RETVAL); 377 } 378 XSRETURN(1); 379 }

La conversión mediante T_PTROBJ para rectangular * da lugar a que la referencia Perl sea convertida en un entero mediante SvIV y el entero en un puntero C mediante INT2PTR (líneas 362-363). Perl usa las macros PTR2INT y INT2PTR para convertir entre punteros e IVs. El tipo entero de Perl IV no es necesariamente igual al tipo int de C; La diferencia está en que Perl garantiza que el tipo entero tiene tamaño suficiente para guardar un puntero. Esta condición garantiza la corrección del código del typemap T_PTROBJ:



INPUT T_PTROBJ Traducción
if (sv_derived_from($arg, \"${ntype}\")) {
  IV tmp = SvIV((SV*)SvRV($arg));
  $var = INT2PTR($type,tmp);
}
else
  Perl_croak(aTHX_ 
   \"$var is not of type ${ntype}\")
if (sv_derived_from(ST(0), "rectangularPtr")) {
  IV tmp = SvIV((SV*)SvRV(ST(0)));
  THIS = INT2PTR(rectangular *,tmp);
}
else
  Perl_croak(aTHX_ 
    "THIS is not of type rectangularPtr");

El código para el campo y es similar al generado para x:

 82  double
 83  y(THIS, __value = NO_INIT)
 84          rectangular * THIS
 85          double __value
 86      PROTOTYPE: $;$
 87      CODE:
 88          if (items > 1)
 89              THIS->y = __value;
 90          RETVAL = THIS->y;
 91      OUTPUT:
 92          RETVAL
 93
 .. ............... identica estructura para polar
La siguiente sesión con el depurador muestra como la estructura permanece almacenada en el formato nativo en un valor escalar de tipo cadena:

lhp@nereida:~/Lperl/src/XSUB/h2xsexample/Coord/script$ perl -Mblib -MCoord -de 0
main::(-e:1):   0
  DB<1> $r=rectangular->new(); $rp = $r->_to_ptr()
  DB<2> $rp->x(4.5); $rp->y(3.2)
  DB<3> x $r
0  rectangular=SCALAR(0x8494068)
   -> "\c@\c@\c@\c@\c@\c@\cR\@\cI\@"
  DB<4> x pack("dd", (4.5, 3.2))
0  "\c@\c@\c@\c@\c@\c@\cR\@\cI\@"
  DB<5> x unpack("dd", $$r)
0  4.5
1  3.2

Casiano Rodríguez León
2011-02-07
x2html8" HREF="http://www.google.es/">googleetsiiullpcgullLHPLHP moodleperlcriticpbpblogsgoogle code project hosting
Sig: Mejora del Rendimiento Sup: El Código Generado por Ant: El código de _to_ptr
Casiano Rodríguez León
2011-02-21
asiano Rodríguez León
2011-02-21 ipo entero.

  • En la línea 52 se crea un nuevo array value (AV) usando newAV . Esta función tiene el prototipo AV* newAV(). Además de crearlo pone el contador de referencias a 1. Estamos creando así una referencia a un array. Para darle un ámbito léxico llamamos a la función sv_2mortal , la cual hace que el SV sea destruido cuando termine el contexto de la subrutina. Si no llamáramos a esta función la memoria alojada nunca sería liberada y se produciría una pérdida (leak).

  • En las líneas 53 y 54 usamos av_push para apilar los dos factores en el array apuntado por match La función void av_push(AV* ar, SV* val) además de apilar el valor apuntado por val hace que el array ar crezca automáticamente haciendo espacio para el nuevo valor.

  • En la línea 56 La macro PUSHs empuja el valor escalar newRV((SV*)match en la pila.
  • Casiano Rodríguez León
    2011-06-03