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): | [EMAIL PROTECTED](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/ _______________________________________________________ złota zasada - kto się nie zna, niech się nie wypowiada
