}
/* }}} */
-static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zval *op1, zval *op2) {
+static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zval *op1, zval *op2, zend_uchar opcode) {
zend_long shift = zval_get_long(op2);
if (shift < 0) {
- php_error_docref(NULL, E_WARNING, "Shift cannot be negative");
- RETVAL_FALSE;
+ zend_throw_error(
+ zend_ce_value_error, "%s must be greater than or equal to 0",
+ opcode == ZEND_POW ? "Exponent" : "Shift"
+ );
+ ZVAL_UNDEF(return_value);
+ return;
} else {
mpz_ptr gmpnum_op, gmpnum_result;
gmp_temp_t temp;
case ZEND_MUL:
DO_BINARY_UI_OP(mpz_mul);
case ZEND_POW:
- shift_operator_helper(mpz_pow_ui, result, op1, op2);
+ shift_operator_helper(mpz_pow_ui, result, op1, op2, opcode);
return SUCCESS;
case ZEND_DIV:
DO_BINARY_UI_OP_EX(mpz_tdiv_q, gmp_mpz_tdiv_q_ui, 1);
case ZEND_MOD:
DO_BINARY_UI_OP_EX(mpz_mod, gmp_mpz_mod_ui, 1);
case ZEND_SL:
- shift_operator_helper(mpz_mul_2exp, result, op1, op2);
+ shift_operator_helper(mpz_mul_2exp, result, op1, op2, opcode);
return SUCCESS;
case ZEND_SR:
- shift_operator_helper(mpz_fdiv_q_2exp, result, op1, op2);
+ shift_operator_helper(mpz_fdiv_q_2exp, result, op1, op2, opcode);
return SUCCESS;
case ZEND_BW_OR:
DO_BINARY_OP(mpz_ior);
ZEND_MINIT_FUNCTION(gmp)
{
zend_class_entry tmp_ce;
- INIT_CLASS_ENTRY(tmp_ce, "GMP", NULL);
+ INIT_CLASS_ENTRY(tmp_ce, "GMP", class_GMP_methods);
gmp_ce = zend_register_internal_class(&tmp_ce);
gmp_ce->create_object = gmp_create_object;
gmp_ce->serialize = gmp_serialize;
}
if (exp < 0) {
- php_error_docref(NULL, E_WARNING, "Negative exponent not supported");
- RETURN_FALSE;
+ zend_argument_value_error(2, "must be greater than or equal to 0");
+ RETURN_THROWS();
}
if (Z_TYPE_P(base_arg) == IS_LONG && Z_LVAL_P(base_arg) >= 0) {
var_dump(gmp_strval(gmp_pow(-2,11)));
var_dump(gmp_strval(gmp_pow("2",10)));
var_dump(gmp_strval(gmp_pow("2",0)));
-var_dump(gmp_strval(gmp_pow("2",-1)));
+try {
+ gmp_pow("2", -1);
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
var_dump(gmp_strval(gmp_pow("-2",10)));
var_dump(gmp_strval(gmp_pow(20,10)));
var_dump(gmp_strval(gmp_pow(50,10)));
-var_dump(gmp_strval(gmp_pow(50,-5)));
+try {
+ gmp_pow(50,-5);
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
$n = gmp_init("20");
var_dump(gmp_strval(gmp_pow($n,10)));
string(5) "-2048"
string(4) "1024"
string(1) "1"
-
-Warning: gmp_pow(): Negative exponent not supported in %s on line %d
-string(1) "0"
+gmp_pow(): Argument #2 ($exp) must be greater than or equal to 0
string(4) "1024"
string(14) "10240000000000"
string(17) "97656250000000000"
-
-Warning: gmp_pow(): Negative exponent not supported in %s on line %d
-string(1) "0"
+gmp_pow(): Argument #2 ($exp) must be greater than or equal to 0
string(14) "10240000000000"
string(14) "10240000000000"
gmp_pow(): Argument #2 ($exp) must be of type int, array given
--- /dev/null
+--TEST--
+Test pow() with gmp object
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+$n = gmp_init(2);
+var_dump(pow($n, 10));
+var_dump($n ** 10);
+
+try {
+ pow($n, -10);
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
+
+try {
+ $n ** -10;
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
+
+?>
+--EXPECTF--
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "1024"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "1024"
+}
+Exponent must be greater than or equal to 0
+Exponent must be greater than or equal to 0
var_dump($a >> 2);
var_dump(-$a >> 2);
-var_dump($a << -1);
-var_dump($a >> -1);
+try {
+ $a << -1;
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
+
+try {
+ $a >> -1;
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
var_dump(~$a);
var_dump(-$a);
["num"]=>
string(3) "-11"
}
-
-Warning: main(): Shift cannot be negative in %s on line %d
-bool(false)
-
-Warning: main(): Shift cannot be negative in %s on line %d
-bool(false)
+Shift must be greater than or equal to 0
+Shift must be greater than or equal to 0
object(GMP)#%d (1) {
["num"]=>
string(3) "-43"