@@ -844,7 +844,7 @@ BigDecimal_dump(int argc, VALUE *argv, VALUE self)
844844 GUARD_OBJ (v , GetBDValueMust (self ));
845845 dump = rb_str_new (0 , VpNumOfChars (v .real , "E" )+ 50 );
846846 psz = RSTRING_PTR (dump );
847- snprintf (psz , RSTRING_LEN (dump ), "%" PRIuSIZE ":" , VpMaxPrec (v .real )* VpBaseFig ());
847+ snprintf (psz , RSTRING_LEN (dump ), "%" PRIuSIZE ":" , VpPrec (v .real )* VpBaseFig ());
848848 len = strlen (psz );
849849 VpToString (v .real , psz + len , RSTRING_LEN (dump )- len , 0 , 0 );
850850 rb_str_resize (dump , strlen (psz ));
@@ -861,22 +861,15 @@ BigDecimal_load(VALUE self, VALUE str)
861861 BDVALUE v ;
862862 unsigned char * pch ;
863863 unsigned char ch ;
864- unsigned long m = 0 ;
865864
866865 pch = (unsigned char * )StringValueCStr (str );
867- /* First get max prec */
866+ /* First skip max prec. Don't trust the value. */
868867 while ((* pch ) != (unsigned char )'\0' && (ch = * pch ++ ) != (unsigned char )':' ) {
869868 if (!ISDIGIT (ch )) {
870869 rb_raise (rb_eTypeError , "load failed: invalid character in the marshaled string" );
871870 }
872- m = m * 10 + (unsigned long )(ch - '0' );
873- }
874- if (m > VpBaseFig ()) m -= VpBaseFig ();
875- GUARD_OBJ (v , bdvalue_nonnullable (CreateFromString (m , (char * )pch , self , true, true)));
876- m /= VpBaseFig ();
877- if (m && v .real -> MaxPrec > m ) {
878- v .real -> MaxPrec = m + 1 ;
879871 }
872+ GUARD_OBJ (v , bdvalue_nonnullable (CreateFromString (0 , (char * )pch , self , true, true)));
880873 return CheckGetValue (v );
881874}
882875
0 commit comments