Skip to content

Commit 959e115

Browse files
committed
Avoid unnecessary destruction in bc_add()
1 parent a604d1d commit 959e115

File tree

4 files changed

+12
-10
lines changed

4 files changed

+12
-10
lines changed

ext/bcmath/bcmath.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ PHP_FUNCTION(bcadd)
148148
zend_string *left, *right;
149149
zend_long scale_param;
150150
bool scale_param_is_null = 1;
151-
bc_num first = NULL, second = NULL, result;
151+
bc_num first = NULL, second = NULL, result = NULL;
152152
int scale;
153153

154154
ZEND_PARSE_PARAMETERS_START(2, 3)
@@ -167,8 +167,6 @@ PHP_FUNCTION(bcadd)
167167
scale = (int) scale_param;
168168
}
169169

170-
bc_init_num(&result);
171-
172170
if (php_str2num(&first, ZSTR_VAL(left)) == FAILURE) {
173171
zend_argument_value_error(1, "is not well-formed");
174172
goto cleanup;
@@ -179,7 +177,7 @@ PHP_FUNCTION(bcadd)
179177
goto cleanup;
180178
}
181179

182-
bc_add (first, second, &result, scale);
180+
result = bc_add (first, second, scale);
183181

184182
RETVAL_NEW_STR(bc_num2str_ex(result, scale));
185183

ext/bcmath/libbcmath/src/add.c

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

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

@@ -67,7 +67,5 @@ void bc_add(bc_num n1, bc_num n2, bc_num *result, size_t scale_min)
6767
}
6868
}
6969

70-
/* Clean up and return. */
71-
bc_free_num (result);
72-
*result = sum;
70+
return sum;
7371
}

ext/bcmath/libbcmath/src/bcmath.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,13 @@ bool bc_is_near_zero(bc_num num, size_t scale);
115115

116116
bool bc_is_neg(bc_num num);
117117

118-
void bc_add(bc_num n1, bc_num n2, bc_num *result, size_t scale_min);
118+
bc_num bc_add(bc_num n1, bc_num n2, size_t scale_min);
119+
120+
#define bc_add_ex(n1, n2, result, scale_min) do { \
121+
bc_num add_ex = bc_add(n1, n2, scale_min); \
122+
bc_free_num (result); \
123+
*(result) = add_ex; \
124+
} while (0)
119125

120126
void bc_sub(bc_num n1, bc_num n2, bc_num *result, size_t scale_min);
121127

ext/bcmath/libbcmath/src/sqrt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ bool bc_sqrt(bc_num *num, size_t scale)
9292
bc_free_num (&guess1);
9393
guess1 = bc_copy_num(guess);
9494
bc_divide(*num, guess, &guess, cscale);
95-
bc_add(guess, guess1, &guess, 0);
95+
bc_add_ex(guess, guess1, &guess, 0);
9696
bc_multiply(guess, point5, &guess, cscale);
9797
bc_sub(guess, guess1, &diff, cscale + 1);
9898
if (bc_is_near_zero(diff, cscale)) {

0 commit comments

Comments
 (0)