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