From:

Date:

October 13, 2003 10:20Subject:

Re: Data::Dumper, BigInt, GMP and Dumper()Message ID:

200310131916.59859@bloodgate.com-----BEGIN PGP SIGNED MESSAGE----- Moin Orton, thanx for the answer. Below is my reply: On Monday 13 October 2003 11:54, you wrote: > > v5.8.1 does Dump Math::BigInt variables wrong when their > > internal data typ is > > a Math::BigInt::GMP: > > > > te@null:~> perl -MMath::BigInt=lib,GMP -MData::Dumper -le '$a = > > Math::BigInt->new(123); print Dumper( $a )' > > $VAR1 = bless( { > > 'sign' => '+', > > 'value' => bless( do{\(my $o = 137245040)}, > > 'Math::BigInt::GMP' ) > > }, 'Math::BigInt' ); > > Could you tell me what this _should_ look like please? I am working a new > dumper to resolve certain problems in Data::Dumper (Its mostly complete > now) and I will endeavour to ensure that Math::BigInt objects are dumped > correctly. I have to think about this. Now, the easiest way (to write it) would be: 'value' => 'Math::BigInt::GMP->_new(\"123")', But I guess this is not possible for Data::Dumper to find out. > > Is there any way to specifiy how an object (c/sh)ould be > > dumped? Like adding a > > DUMPME routine that returns the string for Dumper()? Hm, the doc says > > Data::Dumper::Freezer might be usefull. Let's try it: > > > > te@null:~> perl -MMath::BigInt=lib,GMP -MData::Dumper -le '$a = > > Math::BigInt->new('12345678901234567890'); > > $Data::Dumper::Freezer = 'bstr'; > > print Dumper( $a ) > > Segmentation fault > > > > Oops. Maybe it wants a coderef despite the doc claiming otherwise? > > No it doesnt want a coderef. Freezer is a subroutine that needs to change > the INTERNAL state of the object. 'bstr' if I understand correctly returns > a string. This is not the same thing as collapsing the internals of the > object into a format that can be dumped. > > Think of it this way. Freezer tells the object to pack itself up into a > portable format. Toaster tells the object that it is in a portable format > and that it should now unpack itself into a real object for use. > > So given what ive seen of the dump above you might want something like > this: > > sub Math::BigInt::Freezer { > my $self=shift; > my $bstr=$self->bstr(); > %$self=(FROZEN=>$bstr); > } > > sub Math::BigInt::Toaster { > my $self=shift; > # ... contents left as an excercise for the student :-) ... > } > > So now you would say > > $Data::Dumper::Freezer="Freezer"; > $Data::Dumper::Toaster="Toaster"; > > And things should work Yes, but the problem is that the doc does nowhere specify this and I couldn't find it out by trial and error or *gasp* delving in the code :) In any event, I think if you are building a new dumper, that would be cool. Especially if you could think of or (get?) reserve names that can be specified on a per-class basis like FREEZME or THAWME. I think Data::Storable has something like this. Actually, for Dumper you need only one, like DUMPE. Each class could than provide a method that returns a hash, array or string that can be dumped. Chaning the internal state of the object might _not_work, because that would surely destroy the object in the process...which might cause all sorts of failures later on.. > > No. Maybe let's try 'print'. Just for kickers: > > > > te@null:~> perl -MMath::BigInt=lib,GMP -MData::Dumper -le '$a = > > Math::BigInt->new('12345678901234567890'); > > $Data::Dumper::Freezer = 'print'; > > print Dumper( $a )' > > WARNING(Freezer method call failed): Can't locate > > object method "1" via > > I find this interesting. I dont see why it happened like that at all. It > should say cant find method 'print' via Math::BigInt... > > BTW, the perl code for freezing in DD is really simple: > > if (my $freezer = $s->{freezer}) { > $val->$freezer() if UNIVERSAL::can($val, $freezer); > } > > The weird bugreports youve recieved are beyond me as I dont understand the > DD XS code that well. Try using the latest DD and set > $Data::Dumper::Useperl=1 to force it to use the perl code only. (This also > relieves some memory leaks encountered in the XS code on Win32.) I am under Linux :) I have: # perl -MData::Dumper -le 'print $Data::Dumper::VERSION' 2.121 First, my example above had some quotation issues with the shell, but reversing them also leads to a segfault. However, the pureperl version does not segfault: # perl -MMath::BigInt=lib,GMP -MData::Dumper -le '$a = Math::BigInt->new("12345678901234567890"); $Data::Dumper::Freezer = "bstr"; print Dumper($a)' Segmentation fault # perl -MMath::BigInt=lib,GMP -MData::Dumper -le '$a = Math::BigInt->new("12345678901234567890"); $Data::Dumper::Useperl=1; $Data::Dumper::Freezer = "bstr"; print Dumper($a)' $VAR1 = bless( { 'sign' => '+', 'value' => bless( do{\(my $o = 137303504)}, 'Math::BigInt::GMP' ) }, 'Math::BigInt' ); > So, what you _might_ want to do is define a freezer/toaster method for > Math::BigInt in general. If you add support f.i. for DUMPE(), then I would certainly be happy to add this. > This would be useful becuase _my_ dumper (Data::BFDump v0.6, not the > version on CPAN), handles per class Freezer methods (instead of DD's one > per all classes being dumped), and given that Math::BigInt is part of core > I would have no problem preseeding the table with the appropriate methods. I didn't quite understand your last comment. However, I realize that I probably need to add something to Math::BigInt::GMP (BigInt alone works fine), but I am not sure what. For your information, Math::BigInt::GMP does this in XS: # _new() mpz_t * _new(class,x) SV* class SV* x INIT: SV* s; CODE: s = (SV*)SvRV(x); /* ref to string, don't check ref */ RETVAL = malloc (sizeof(mpz_t)); mpz_init_set_str(*RETVAL, SvPV_nolen(s), 0); OUTPUT: RETVAL (I am not even sure if this is "proper" XS - my XS is basically Cute&Paste spiced up with trial-and-error :-) Thank you for your time! Tels - -- Signed on Mon Oct 13 19:03:48 2003 with key 0x93B84C15. Visit my photo gallery at http://bloodgate.com/photos/ PGP key on http://bloodgate.com/tels.asc or per email. "Now, _you_ behave!" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) Comment: When cryptography is outlawed, bayl bhgynjf jvyy unir cevinpl. iQEVAwUBP4reCncLPEOTuEwVAQG6wAf/U7wY+et7MIdeB2ajT9VstThqtS5Wa1zj Ln1u4LOaTH6q1bK/KEgH/LC812+A01/ECRwp+1Gft6J3gKq4VUYkHprdbQrrPO+6 jDgviCKfK2W5VB0CLlZ+SEZFZxN9uqRf3WwAHEZnOtSbGZd2em5AdBUQmciKzgjF pbPnscr57T7AAIK4g+0teZXxz3auZRgtn9hUiB97+OsJJcHffMH8qk0W4UMd0OoG Sd+VUFDcnT1rNBK851Tp71P6YabIetpfsEr5SqkJaBV2qAJ3mwOEYoNnSz7KvVsy EvnzBRgRokCIt8ZgtCKhEHh4ibDEFt5UwwuT7QtjWa+O8WZBDkSaVw== =QGV5 -----END PGP SIGNATURE-----Thread Previous

- Data::Dumper, BigInt, GMP and Dumper() by Tels
- RE: Data::Dumper, BigInt, GMP and Dumper() by Orton, Yves
**Re: Data::Dumper, BigInt, GMP and Dumper()**by Tels

nntp.perl.org: Perl Programming lists via nntp and http.

Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About