Skip to content

Commit 0cd952d

Browse files
committed
Avoid unnecessary destruction in bc_sub()
1 parent 959e115 commit 0cd952d

File tree

7 files changed

+19
-20
lines changed

7 files changed

+19
-20
lines changed

ext/bcmath/bcmath.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ PHP_FUNCTION(bcsub)
195195
zend_string *left, *right;
196196
zend_long scale_param;
197197
bool scale_param_is_null = 1;
198-
bc_num first = NULL, second = NULL, result;
198+
bc_num first = NULL, second = NULL, result = NULL;
199199
int scale;
200200

201201
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -214,8 +214,6 @@ PHP_FUNCTION(bcsub)
214214
scale = (int) scale_param;
215215
}
216216

217-
bc_init_num(&result);
218-
219217
if (php_str2num(&first, ZSTR_VAL(left)) == FAILURE) {
220218
zend_argument_value_error(1, "is not well-formed");
221219
goto cleanup;
@@ -226,7 +224,7 @@ PHP_FUNCTION(bcsub)
226224
goto cleanup;
227225
}
228226

229-
bc_sub (first, second, &result, scale);
227+
result = bc_sub (first, second, scale);
230228

231229
RETVAL_NEW_STR(bc_num2str_ex(result, scale));
232230

ext/bcmath/libbcmath/src/bcmath.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,13 @@ bc_num bc_add(bc_num n1, bc_num n2, size_t scale_min);
123123
*(result) = add_ex; \
124124
} while (0)
125125

126-
void bc_sub(bc_num n1, bc_num n2, bc_num *result, size_t scale_min);
126+
bc_num bc_sub(bc_num n1, bc_num n2, size_t scale_min);
127+
128+
#define bc_sub_ex(n1, n2, result, scale_min) do { \
129+
bc_num sub_ex = bc_sub(n1, n2, scale_min); \
130+
bc_free_num (result); \
131+
*(result) = sub_ex; \
132+
} while (0)
127133

128134
void bc_multiply(bc_num n1, bc_num n2, bc_num *prod, size_t scale);
129135

ext/bcmath/libbcmath/src/divmod.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ bool bc_divmod(bc_num num1, bc_num num2, bc_num *quot, bc_num *rem, size_t scale
6262
quotient = bc_copy_num(temp);
6363
}
6464
bc_multiply(temp, num2, &temp, rscale);
65-
bc_sub(num1, temp, rem, rscale);
65+
bc_sub_ex(num1, temp, rem, rscale);
6666
bc_free_num (&temp);
6767

6868
if (quot) {

ext/bcmath/libbcmath/src/output.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void bc_out_num(bc_num num, int o_base, void (*out_char)(char), bool leading_zer
7979
int index, fdigit;
8080
bool pre_space;
8181
stk_rec *digits, *temp;
82-
bc_num int_part, frac_part, base, cur_dig, t_num, max_o_digit;
82+
bc_num int_part, base, cur_dig, t_num, max_o_digit;
8383

8484
/* The negative sign if needed. */
8585
if (num->n_sign == MINUS) (*out_char)('-');
@@ -120,10 +120,9 @@ void bc_out_num(bc_num num, int o_base, void (*out_char)(char), bool leading_zer
120120
digits = NULL;
121121
bc_init_num(&int_part);
122122
bc_divide(num, BCG(_one_), &int_part, 0);
123-
bc_init_num(&frac_part);
124123
bc_init_num(&cur_dig);
125124
bc_init_num(&base);
126-
bc_sub(num, int_part, &frac_part, 0);
125+
bc_num frac_part = bc_sub(num, int_part, 0);
127126
/* Make the INT_PART and FRAC_PART positive. */
128127
int_part->n_sign = PLUS;
129128
frac_part->n_sign = PLUS;
@@ -166,7 +165,7 @@ void bc_out_num(bc_num num, int o_base, void (*out_char)(char), bool leading_zer
166165
bc_multiply(frac_part, base, &frac_part, num->n_scale);
167166
fdigit = bc_num2long(frac_part);
168167
bc_int2num(&int_part, fdigit);
169-
bc_sub(frac_part, int_part, &frac_part, 0);
168+
bc_sub_ex(frac_part, int_part, &frac_part, 0);
170169
if (o_base <= 16) {
171170
(*out_char)(ref_str[fdigit]);
172171
} else {

ext/bcmath/libbcmath/src/recmul.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ static void _bc_shift_addsub(bc_num accum, bc_num val, int shift, bool sub)
163163
static void _bc_rec_mul(bc_num u, size_t ulen, bc_num v, size_t vlen, bc_num *prod)
164164
{
165165
bc_num u0, u1, v0, v1;
166-
bc_num m1, m2, m3, d1, d2;
166+
bc_num m1, m2, m3;
167167
size_t n;
168168
bool m1zero;
169169

@@ -203,10 +203,8 @@ static void _bc_rec_mul(bc_num u, size_t ulen, bc_num v, size_t vlen, bc_num *pr
203203

204204
/* Calculate sub results ... */
205205

206-
bc_init_num(&d1);
207-
bc_init_num(&d2);
208-
bc_sub(u1, u0, &d1, 0);
209-
bc_sub(v0, v1, &d2, 0);
206+
bc_num d1 = bc_sub(u1, u0, 0);
207+
bc_num d2 = bc_sub(v0, v1, 0);
210208

211209

212210
/* Do recursive multiplies and shifted adds. */

ext/bcmath/libbcmath/src/sqrt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ bool bc_sqrt(bc_num *num, size_t scale)
9494
bc_divide(*num, guess, &guess, cscale);
9595
bc_add_ex(guess, guess1, &guess, 0);
9696
bc_multiply(guess, point5, &guess, cscale);
97-
bc_sub(guess, guess1, &diff, cscale + 1);
97+
bc_sub_ex(guess, guess1, &diff, cscale + 1);
9898
if (bc_is_near_zero(diff, cscale)) {
9999
if (cscale < rscale + 1) {
100100
cscale = MIN (cscale * 3, rscale + 1);

ext/bcmath/libbcmath/src/sub.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
N2 is subtracted from N1 and the result placed in RESULT. SCALE_MIN
4040
is the minimum scale for the result. */
4141

42-
void bc_sub(bc_num n1, bc_num n2, bc_num *result, size_t scale_min)
42+
bc_num bc_sub(bc_num n1, bc_num n2, size_t scale_min)
4343
{
4444
bc_num diff = NULL;
4545

@@ -70,7 +70,5 @@ void bc_sub(bc_num n1, bc_num n2, bc_num *result, size_t scale_min)
7070
}
7171
}
7272

73-
/* Clean up and return. */
74-
bc_free_num (result);
75-
*result = diff;
73+
return diff;
7674
}

0 commit comments

Comments
 (0)