perl: Math::Pari vs Data::Dumper

Jakub Bogusz qboosh w pld-linux.org
Sob, 15 Maj 2004, 21:57:42 CEST


Jak jest z obsługą obiektów w Data::Dumper?

Wyszło przy okazji Crypt::Random na architekturach 64-bitowych
- Crypt::Random do ładowania swoich modułów używa modułu Class::Loader,
który parametry przekazuje przebudowując je właśnie przy użyciu
Data::Dumpera - a część parametrów jest typu Math::Pari.

"Działa" to tak:

| $ cat t1.pl
| use Data::Dumper;
| use Math::Pari;
| 
| my $x = PARI('2345');
| 
| print Dumper($x);
| eval Dumper($x);
| 
| print Dumper($VAR1);
| print $VAR1 . "\n";

| $ perl t1.pl
| $VAR1 = bless( do{\(my $o = 1085544688)}, 'Math::Pari' );
| $VAR1 = bless( do{\(my $o = 1085544688)}, 'Math::Pari' );
| 2345

To $o to wskaźnik do jakiegoś istniejącego obiektu Math::Pari.
Przy czym na architekturach 64-bitowych $o jest przypisywany łańcuch,
a nie liczba (chyba z powodu nie mieszczenia się na 32 bitach):

| [qboosh w x8664(playground) qboosh]$ perl t1.pl
| $VAR1 = bless( do{\(my $o = '182914509024')}, 'Math::Pari' );
| $VAR1 = bless( do{\(my $o = '182914509024')}, 'Math::Pari' );
| 2345
| Segmentation fault

Ostatnia linijka to efekt wywołania DESTROY na tak otrzymanym obiekcie
(w pierwszym przypadku SEGV nie było, bo Math::Pari::DESTROY ignoruje
parametr będący tylko liczbą (prawdziwe obiekty Pari mają zapisane coś
teoretycznie będące łańcuchem, ale tak naprawdę wskaźnikiem do jakichś
struktur w wewnętrznym formacie pari).

Ale to nie jedyny objaw. Weźmy bardziej skomplikowany program - nie
działa dobrze nawet na x86:

| $ cat t.pl
| use Data::Dumper;
| use Math::Pari;
| 
| my $VAR1;
| 
| sub xxx
| {
| my $x = PARI('2345');
| 
| print Dumper($x);
| eval Dumper($x);
| print $VAR1 . "\n";
| }
| 
| xxx();
| print Dumper($VAR1);
| print $VAR1 . "\n";

| $ perl /tmp/t.pl
| $VAR1 = bless( do{\(my $o = 1085544688)}, 'Math::Pari' );
| 2345
| $VAR1 = bless( do{\(my $o = 1085544688)}, 'Math::Pari' );
| 1073744169

Ktoś wie, co z tym zrobić, żeby działało?
Gdyby zamiast bless(...) było PARI('liczba odczytana z obiektu'),
powinno być dobrze. Ale czy da się do tego przekonać Data::Dumpera?


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl