[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c
iliaa Wed Jan 30 18:25:51 2008 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c Log: Fixed bug #43981 (gmp_div_r() does not preserve the sign of 1st argument) http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.8&r2=1.49.2.2.2.11.2.9&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.8 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.9 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.8 Mon Dec 31 07:17:08 2007 +++ php-src/ext/gmp/gmp.c Wed Jan 30 18:25:51 2008 @@ -569,6 +569,9 @@ if (use_ui && gmp_ui_op) { if (allow_ui_return) { long_result = gmp_ui_op(*gmpnum_result, *gmpnum_a, (unsigned long)Z_LVAL_PP(b_arg)); + if (mpz_sgn(*gmpnum_a) == -1) { + long_result = -long_result; + } } else { gmp_ui_op(*gmpnum_result, *gmpnum_a, (unsigned long)Z_LVAL_PP(b_arg)); } -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c
stasThu Nov 1 20:25:11 2007 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c Log: fix 64-bit http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.6&r2=1.49.2.2.2.11.2.7&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.6 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.7 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.6 Thu Nov 1 18:36:24 2007 +++ php-src/ext/gmp/gmp.c Thu Nov 1 20:25:11 2007 @@ -1523,7 +1523,7 @@ ZEND_FUNCTION(gmp_testbit) { zval **a_arg; - int index; + long index; mpz_t *gmpnum_a; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg, &index) == FAILURE){ -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c
stasThu Nov 1 18:36:24 2007 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c Log: fix gcd - can return larger than long with long arg http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.5&r2=1.49.2.2.2.11.2.6&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.5 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.6 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.5 Thu Nov 1 17:51:34 2007 +++ php-src/ext/gmp/gmp.c Thu Nov 1 18:36:24 2007 @@ -1239,7 +1239,7 @@ return; } - gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd, (gmp_binary_ui_op_t)mpz_gcd_ui, 1, 0 TSRMLS_CC); + gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd, (gmp_binary_ui_op_t)mpz_gcd_ui, 0, 0 TSRMLS_CC); } /* }}} */ -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c
stasThu Nov 1 17:51:34 2007 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c Log: merge gmp_testbit() http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.4&r2=1.49.2.2.2.11.2.5&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.4 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.5 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.4 Thu Nov 1 09:34:18 2007 +++ php-src/ext/gmp/gmp.c Thu Nov 1 17:51:34 2007 @@ -238,6 +238,12 @@ ZEND_END_ARG_INFO() static +ZEND_BEGIN_ARG_INFO(arginfo_gmp_testbit, 0) + ZEND_ARG_INFO(0, a) + ZEND_ARG_INFO(0, index) +ZEND_END_ARG_INFO() + +static ZEND_BEGIN_ARG_INFO(arginfo_gmp_popcount, 0) ZEND_ARG_INFO(0, a) ZEND_END_ARG_INFO() @@ -308,8 +314,9 @@ ZEND_FE(gmp_xor,arginfo_gmp_xor) ZEND_FE(gmp_setbit, arginfo_gmp_setbit) ZEND_FE(gmp_clrbit, arginfo_gmp_clrbit) - ZEND_FE(gmp_scan0, arginfo_gmp_scan0) - ZEND_FE(gmp_scan1, arginfo_gmp_scan1) + ZEND_FE(gmp_scan0, arginfo_gmp_scan0) + ZEND_FE(gmp_scan1, arginfo_gmp_scan1) + ZEND_FE(gmp_testbit,arginfo_gmp_testbit) ZEND_FE(gmp_popcount, arginfo_gmp_popcount) ZEND_FE(gmp_hamdist, arginfo_gmp_hamdist) ZEND_FE(gmp_nextprime, arginfo_gmp_nextprime) @@ -1511,6 +1518,32 @@ } /* }}} */ +/* {{{ proto bool gmp_testbit(resource a, int index) + Tests if bit is set in a */ +ZEND_FUNCTION(gmp_testbit) +{ + zval **a_arg; + int index; + mpz_t *gmpnum_a; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg, &index) == FAILURE){ + return; + } + + ZEND_FETCH_RESOURCE(gmpnum_a, mpz_t *, a_arg, -1, GMP_RESOURCE_NAME, le_gmp); + + if (index < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index must be greater than or equal to zero"); + RETURN_FALSE; + } + + if (mpz_tstbit(*gmpnum_a, index)) { + RETURN_TRUE; + } + RETURN_FALSE; +} +/* }}} */ + /* {{{ proto int gmp_popcount(resource a) Calculates the population count of a */ ZEND_FUNCTION(gmp_popcount) -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c
tony2001Thu Nov 1 09:34:19 2007 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c Log: fix reading uninitialized values http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.3&r2=1.49.2.2.2.11.2.4&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.3 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.4 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.3 Thu Nov 1 09:25:09 2007 +++ php-src/ext/gmp/gmp.c Thu Nov 1 09:34:18 2007 @@ -1064,8 +1064,8 @@ mpz_ui_pow_ui(*gmpnum_result, Z_LVAL_PP(base_arg), exp); } else { mpz_pow_ui(*gmpnum_result, *gmpnum_base, exp); + FREE_GMP_TEMP(temp_base); } - FREE_GMP_TEMP(temp_base); ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp); } /* }}} */ @@ -1098,7 +1098,9 @@ if (!mpz_cmp_ui(*gmpnum_mod, 0)) { FREE_GMP_TEMP(temp_base); - FREE_GMP_TEMP(temp_exp); + if (use_ui) { + FREE_GMP_TEMP(temp_exp); + } FREE_GMP_TEMP(temp_mod); RETURN_FALSE; } @@ -1108,10 +1110,10 @@ mpz_powm_ui(*gmpnum_result, *gmpnum_base, (unsigned long)Z_LVAL_PP(exp_arg), *gmpnum_mod); } else { mpz_powm(*gmpnum_result, *gmpnum_base, *gmpnum_exp, *gmpnum_mod); + FREE_GMP_TEMP(temp_exp); } FREE_GMP_TEMP(temp_base); - FREE_GMP_TEMP(temp_exp); FREE_GMP_TEMP(temp_mod); ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp); -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c /ext/gmp/tests 015.phpt 021.phpt 024.phpt 025.phpt 026.phpt
tony2001Thu Nov 1 09:25:11 2007 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c /php-src/ext/gmp/tests 015.phpt 021.phpt 024.phpt 025.phpt 026.phpt Log: fix 64bit issues & tests http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.2&r2=1.49.2.2.2.11.2.3&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.2 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.3 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.2 Thu Nov 1 00:46:12 2007 +++ php-src/ext/gmp/gmp.c Thu Nov 1 09:25:09 2007 @@ -770,14 +770,14 @@ { zval **number_arg; mpz_t * gmpnumber; - int base=0; + long base=0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l", &number_arg, &base) == FAILURE) { return; } if (base && (base < 2 || base > 36)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for conversion: %d (should be between 2 and 36)", base); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for conversion: %ld (should be between 2 and 36)", base); RETURN_FALSE; } @@ -816,7 +816,8 @@ ZEND_FUNCTION(gmp_strval) { zval **gmpnumber_arg; - int base=10, num_len; + int num_len; + long base = 10; mpz_t * gmpnum; char *out_string; int temp_a; @@ -826,7 +827,7 @@ } if (base < 2 || base > 36) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for conversion: %d", base); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for conversion: %ld", base); RETURN_FALSE; } @@ -887,7 +888,7 @@ ZEND_FUNCTION(gmp_div_qr) { zval **a_arg, **b_arg; - int round = GMP_ROUND_ZERO; + long round = GMP_ROUND_ZERO; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg, &b_arg, &round) == FAILURE) { return; @@ -913,7 +914,7 @@ ZEND_FUNCTION(gmp_div_r) { zval **a_arg, **b_arg; - int round = GMP_ROUND_ZERO; + long round = GMP_ROUND_ZERO; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg, &b_arg, &round) == FAILURE) { return; @@ -938,7 +939,7 @@ ZEND_FUNCTION(gmp_div_q) { zval **a_arg, **b_arg; - int round = GMP_ROUND_ZERO; + long round = GMP_ROUND_ZERO; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg, &b_arg, &round) == FAILURE) { return; @@ -1037,12 +1038,13 @@ Raise base to power exp */ ZEND_FUNCTION(gmp_pow) { - zval **base_arg, **exp_arg; + zval **base_arg; mpz_t *gmpnum_result, *gmpnum_base; int use_ui = 0; int temp_base; + long exp; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &base_arg, &exp_arg) == FAILURE){ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &base_arg, &exp) == FAILURE) { return; } @@ -1052,18 +1054,16 @@ FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base); } - convert_to_long_ex(exp_arg); - - if (Z_LVAL_PP(exp_arg) < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Negative exponent not supported"); + if (exp < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Negative exponent not supported"); RETURN_FALSE; } INIT_GMP_NUM(gmpnum_result); if (use_ui) { - mpz_ui_pow_ui(*gmpnum_result, Z_LVAL_PP(base_arg), Z_LVAL_PP(exp_arg)); + mpz_ui_pow_ui(*gmpnum_result, Z_LVAL_PP(base_arg), exp); } else { - mpz_pow_ui(*gmpnum_result, *gmpnum_base, Z_LVAL_PP(exp_arg)); + mpz_pow_ui(*gmpnum_result, *gmpnum_base, exp); } FREE_GMP_TEMP(temp_base); ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp); @@ -1206,7 +1206,7 @@ { zval **gmpnumber_arg; mpz_t *gmpnum_a; - int reps = 10; + long reps = 10; int temp_a; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l", &gmpnumber_arg, &reps) == FAILURE) { @@ -1369,7 +1369,7 @@ Gets random number */ ZEND_FUNCTION(gmp_random) { - int limiter = 20; + long limiter = 20; mpz_t *gmpnum_result; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &limiter) == FAILURE) { @@ -1463,7 +1463,8 @@ ZEND_FUNCTION(gmp_setbit) { zval **a_arg; - int index, set = 1; + long index; + zend_bool set = 1; mpz_t *gmpnum_a; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl|b", &a_arg, &index, &set) == FAILURE) { @@ -1490,7 +1491,7 @@ ZEND_FUNCTION(gmp_clrbit) { zval **a_arg; - int index; + long index; mpz_t *gmpnum_a; if (zend_parse_param
[PHP-CVS] cvs: php-src(PHP_5_3) /ext/gmp gmp.c /ext/gmp/tests 004.phpt 005.phpt 006.phpt 007.phpt 008.phpt 009.phpt 010.phpt 011.phpt 012.phpt 013.phpt 014.phpt 015.phpt 016.phpt 017.phpt 018.phpt 01
stasThu Nov 1 00:46:13 2007 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/gmpgmp.c /php-src/ext/gmp/tests 004.phpt 005.phpt 006.phpt 007.phpt 008.phpt 009.phpt 010.phpt 011.phpt 012.phpt 013.phpt 014.phpt 015.phpt 016.phpt 017.phpt 018.phpt 019.phpt 020.phpt 021.phpt 022.phpt 023.phpt 024.phpt 025.phpt 026.phpt 027.phpt 028.phpt 029.phpt 030.phpt 031.phpt 032.phpt 033.phpt 034.phpt 035.phpt 036.phpt 037.phpt 038.phpt 039.phpt Log: - Fix memory leaks (bug #42509) - Fix _gmp_binary_opl - Use modern parameter parsing http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.49.2.2.2.11.2.1&r2=1.49.2.2.2.11.2.2&diff_format=u Index: php-src/ext/gmp/gmp.c diff -u php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.1 php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.2 --- php-src/ext/gmp/gmp.c:1.49.2.2.2.11.2.1 Thu Sep 27 18:00:39 2007 +++ php-src/ext/gmp/gmp.c Thu Nov 1 00:46:12 2007 @@ -423,16 +423,23 @@ /* Fetch zval to be GMP number. Initially, zval can be also number or string */ -#define FETCH_GMP_ZVAL(gmpnumber, zval) \ -if (Z_TYPE_PP(zval) == IS_RESOURCE) { \ - ZEND_FETCH_RESOURCE(gmpnumber, mpz_t *, zval, -1, GMP_RESOURCE_NAME, le_gmp);\ -} else {\ - if (convert_to_gmp(&gmpnumber, zval, 0 TSRMLS_CC) == FAILURE) {\ - RETURN_FALSE;\ - }\ - ZEND_REGISTER_RESOURCE(NULL, gmpnumber, le_gmp);\ +#define FETCH_GMP_ZVAL(gmpnumber, zval, tmp_resource) \ +if (Z_TYPE_PP(zval) == IS_RESOURCE) { \ + ZEND_FETCH_RESOURCE(gmpnumber, mpz_t *, zval, -1, GMP_RESOURCE_NAME, le_gmp); \ + tmp_resource = 0; \ +} else { \ + if (convert_to_gmp(&gmpnumber, zval, 0 TSRMLS_CC) == FAILURE) { \ + RETURN_FALSE; \ + } \ + tmp_resource = ZEND_REGISTER_RESOURCE(NULL, gmpnumber, le_gmp); \ } +#define FREE_GMP_TEMP(tmp_resource)\ + if(tmp_resource) { \ + zend_list_delete(tmp_resource); \ + } + + /* create a new initialized GMP number */ #define INIT_GMP_NUM(gmpnumber) { gmpnumber=emalloc(sizeof(mpz_t)); mpz_init(*gmpnumber); } #define FREE_GMP_NUM(gmpnumber) { mpz_clear(*gmpnumber); efree(gmpnumber); } @@ -524,13 +531,14 @@ mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result; unsigned long long_result = 0; int use_ui = 0; + int arga_tmp = 0, argb_tmp = 0; - FETCH_GMP_ZVAL(gmpnum_a, a_arg); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, arga_tmp); if (gmp_ui_op && Z_TYPE_PP(b_arg) == IS_LONG && Z_LVAL_PP(b_arg) >= 0) { use_ui = 1; } else { - FETCH_GMP_ZVAL(gmpnum_b, b_arg); + FETCH_GMP_ZVAL(gmpnum_b, b_arg, argb_tmp); } if(check_b_zero) { @@ -543,6 +551,8 @@ if(b_is_zero) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero operand not allowed"); + FREE_GMP_TEMP(arga_tmp); + FREE_GMP_TEMP(argb_tmp); RETURN_FALSE; } } @@ -559,6 +569,9 @@ gmp_op(*gmpnum_result, *gmpnum_a, *gmpnum_b); } + FREE_GMP_TEMP(arga_tmp); + FREE_GMP_TEMP(argb_tmp); + if (use_ui && allow_ui_return) { FREE_GMP_NUM(gmpnum_result); RETURN_LONG((long)long_result); @@ -578,14 +591,15 @@ zval r; int use_ui = 0; unsigned long long_result = 0; + int arga_tmp = 0, argb_tmp = 0; - FETCH_GMP_ZVAL(gmpnum_a, a_arg); + FETCH_GMP_ZVAL(gmpnum_a, a_arg, arga_tmp); if (gmp_ui_op && Z_TYPE_PP(b_arg) == IS_LONG && Z_LVAL_PP(b_arg) >= 0) { /* use _ui function */ use_ui = 1; } else { - FETCH_GMP_ZVAL(gmpnum_b, b_arg); + FETCH_GMP_ZVAL(gmpnum_b, b_arg, argb_tmp); } if(check_b_zero) { @@ -598,6 +612,8 @@