@@ -942,10 +942,12 @@ function decode_0ct(x::BigInt, digits)
942
942
pt = Base. ndigits0z (x, 8 ) + 1
943
943
length (digits) < pt+ 1 && resize! (digits, pt+ 1 )
944
944
neg && (x. size = - x. size)
945
- p = convert (Ptr{UInt8}, digits) + 1
946
- GMP. MPZ. get_str! (p, 8 , x)
945
+ GC. @preserve digits begin
946
+ p = pointer (digits,2 )
947
+ GMP. MPZ. get_str! (p, 8 , x)
948
+ end
947
949
neg && (x. size = - x. size)
948
- return neg, Int32 (pt), Int32 (pt)
950
+ return Int32 (pt), Int32 (pt), neg
949
951
end
950
952
951
953
# ## decoding functions directly used by printf generated code ###
@@ -1059,13 +1061,16 @@ function ini_dec(x::BigInt, n::Int, digits)
1059
1061
end
1060
1062
d = Base. ndigits0z (x)
1061
1063
if d <= n
1062
- info = decode_dec (x)
1063
- d == n && return info
1064
- p = convert (Ptr{Cvoid}, digits) + info[2 ]
1065
- ccall (:memset , Ptr{Cvoid}, (Ptr{Cvoid}, Cint, Csize_t), p, ' 0' , n - info[2 ])
1066
- return info
1064
+ len,pt,neg = decode_dec (x, digits)
1065
+ d == n && return (len,pt,neg)
1066
+
1067
+ GC. @preserve digits begin
1068
+ ccall (:memset , Ptr{Cvoid}, (Ptr{Cvoid}, Cint, Csize_t), pointer (digits, pt+ 1 ), ' 0' , n - pt)
1069
+ end
1070
+ return (len,pt,neg)
1067
1071
end
1068
- return (n, d, decode_dec (round (BigInt,x/ big (10 )^ (d- n)))[3 ])
1072
+ _, _, neg = decode_dec (round (BigInt,x/ big (10 )^ (d- n)), digits)
1073
+ return (n, d, neg)
1069
1074
end
1070
1075
1071
1076
0 commit comments