76 lines
2.9 KiB
Diff
76 lines
2.9 KiB
Diff
From 8a60d77c284822dae6291f1c8a8145a0d480212b Mon Sep 17 00:00:00 2001
|
|
From: Hugo Heuzard <hugo.heuzard@gmail.com>
|
|
Date: Sat, 23 Nov 2019 17:55:45 +0800
|
|
Subject: [PATCH 2/5] Fix usage of bytes vs string
|
|
|
|
Don't reuse strings after they get unsafely converted to bytes for mutation.
|
|
Intead, explicitly refer to the mutated bytes
|
|
---
|
|
src/ratio.ml | 20 ++++++++++----------
|
|
1 file changed, 10 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/src/ratio.ml b/src/ratio.ml
|
|
index 04f9c5e..491cb96 100644
|
|
--- a/src/ratio.ml
|
|
+++ b/src/ratio.ml
|
|
@@ -438,13 +438,13 @@ let approx_ratio_fix n r =
|
|
(base_power_big_int
|
|
10 (succ n) (abs_big_int r.numerator))
|
|
r.denominator)) in
|
|
+ let s1 = Bytes.unsafe_of_string s1 in
|
|
(* Round up and add 1 in front if needed *)
|
|
let s2 =
|
|
- if round_futur_last_digit (Bytes.unsafe_of_string s1) 0
|
|
- (String.length s1)
|
|
- then "1" ^ s1
|
|
+ if round_futur_last_digit s1 0 (Bytes.length s1)
|
|
+ then Bytes.cat (Bytes.of_string "1") s1
|
|
else s1 in
|
|
- let l2 = String.length s2 - 1 in
|
|
+ let l2 = Bytes.length s2 - 1 in
|
|
(* if s2 without last digit is xxxxyyy with n 'yyy' digits:
|
|
<sign> xxxx . yyy
|
|
if s2 without last digit is yy with <= n digits:
|
|
@@ -452,15 +452,15 @@ let approx_ratio_fix n r =
|
|
if l2 > n then begin
|
|
let s = Bytes.make (l2 + 2) '0' in
|
|
Bytes.set s 0 (if sign_r = -1 then '-' else '+');
|
|
- String.blit s2 0 s 1 (l2 - n);
|
|
+ Bytes.blit s2 0 s 1 (l2 - n);
|
|
Bytes.set s (l2 - n + 1) '.';
|
|
- String.blit s2 (l2 - n) s (l2 - n + 2) n;
|
|
+ Bytes.blit s2 (l2 - n) s (l2 - n + 2) n;
|
|
Bytes.unsafe_to_string s
|
|
end else begin
|
|
let s = Bytes.make (n + 3) '0' in
|
|
Bytes.set s 0 (if sign_r = -1 then '-' else '+');
|
|
Bytes.set s 2 '.';
|
|
- String.blit s2 0 s (n + 3 - l2) l2;
|
|
+ Bytes.blit s2 0 s (n + 3 - l2) l2;
|
|
Bytes.unsafe_to_string s
|
|
end
|
|
end else begin
|
|
@@ -508,8 +508,8 @@ let approx_ratio_exp n r =
|
|
10 k (abs_big_int r.numerator))
|
|
r.denominator) in
|
|
string_of_nat nat) in
|
|
- if round_futur_last_digit (Bytes.unsafe_of_string s) 0
|
|
- (String.length s)
|
|
+ let s = Bytes.unsafe_of_string s in
|
|
+ if round_futur_last_digit s 0 (Bytes.length s)
|
|
then
|
|
let m = num_decimal_digits_int (succ msd) in
|
|
let str = Bytes.make (n + m + 4) '0' in
|
|
@@ -525,7 +525,7 @@ let approx_ratio_exp n r =
|
|
and p = n + 3 in
|
|
let str = Bytes.make (succ (m + p)) '0' in
|
|
(String.blit (if sign_r = -1 then "-0." else "+0.") 0 str 0 3);
|
|
- (String.blit s 0 str 3 n);
|
|
+ (Bytes.blit s 0 str 3 n);
|
|
Bytes.set str p 'e';
|
|
(if m = 0
|
|
then Bytes.set str (succ p) '0'
|
|
--
|
|
2.24.1
|
|
|