1
0
mirror of https://github.com/php/php-src.git synced 2026-04-17 13:01:02 +02:00

Merge branch 'PHP-7.0' of https://git.php.net/repository/php-src into PHP-7.0

This commit is contained in:
Christopher Jones
2016-04-14 13:43:13 +10:00
8 changed files with 140 additions and 7 deletions

3
NEWS
View File

@@ -2,6 +2,9 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2016 PHP 7.0.7
- SQLite3:
. Fixed bug #68849 (bindValue is not using the right data type).
(Anatol)
28 Apr 2016 PHP 7.0.6

View File

@@ -1,7 +1,7 @@
--TEST--
bug #71428.2: inheritance of ye olde dynamic interfaces
--SKIPIF--
<?php if (!extension_loaded('pdo')) ?>
<?php if (!extension_loaded('pdo')) die("skip PDO is not available"); ?>
--FILE--
<?php
interface StatementInterface {

View File

@@ -0,0 +1,25 @@
--TEST--
Indirect modification of isref by-value return value not possible
--FILE--
<?php
class A {
public $b;
}
$arr = [];
$a = new A;
$a->b =& $arr;
(new ReflectionProperty('A', 'b'))->getValue($a)[] = 42;
var_dump($a);
?>
--EXPECT--
object(A)#1 (1) {
["b"]=>
&array(0) {
}
}

View File

@@ -7301,11 +7301,12 @@ ZEND_VM_HANDLER(156, ZEND_SEPARATE, VAR, UNUSED)
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
if (UNEXPECTED(Z_REFCOUNT_P(var_ptr) == 1)) {
ZVAL_UNREF(var_ptr);
} else if (!(Z_VAR_FLAGS_P(var_ptr) & IS_VAR_RET_REF)) {
Z_DELREF_P(var_ptr);
ZVAL_COPY(var_ptr, Z_REFVAL_P(var_ptr));
}
} else if (Z_COPYABLE_P(var_ptr) && Z_REFCOUNT_P(var_ptr) > 1) {
Z_DELREF_P(var_ptr);
ZVAL_DUP(EX_VAR(opline->op1.var), var_ptr);
}
ZEND_VM_NEXT_OPCODE();
}

View File

@@ -19509,11 +19509,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDL
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
if (UNEXPECTED(Z_REFCOUNT_P(var_ptr) == 1)) {
ZVAL_UNREF(var_ptr);
} else if (!(Z_VAR_FLAGS_P(var_ptr) & IS_VAR_RET_REF)) {
Z_DELREF_P(var_ptr);
ZVAL_COPY(var_ptr, Z_REFVAL_P(var_ptr));
}
} else if (Z_COPYABLE_P(var_ptr) && Z_REFCOUNT_P(var_ptr) > 1) {
Z_DELREF_P(var_ptr);
ZVAL_DUP(EX_VAR(opline->op1.var), var_ptr);
}
ZEND_VM_NEXT_OPCODE();
}

View File

@@ -1406,6 +1406,26 @@ static int register_bound_parameter_to_sqlite(struct php_sqlite3_bound_param *pa
}
/* }}} */
/* {{{ Best try to map between PHP and SQLite. Default is still text. */
#define PHP_SQLITE3_SET_TYPE(z, p) \
switch (Z_TYPE_P(z)) { \
default: \
(p).type = SQLITE_TEXT; \
break; \
case IS_LONG: \
case IS_TRUE: \
case IS_FALSE: \
(p).type = SQLITE_INTEGER; \
break; \
case IS_DOUBLE: \
(p).type = SQLITE_FLOAT; \
break; \
case IS_NULL: \
(p).type = SQLITE_NULL; \
break; \
}
/* }}} */
/* {{{ proto bool SQLite3Stmt::bindParam(int parameter_number, mixed parameter [, int type])
Bind Parameter to a stmt variable. */
PHP_METHOD(sqlite3stmt, bindParam)
@@ -1430,6 +1450,10 @@ PHP_METHOD(sqlite3stmt, bindParam)
ZVAL_COPY(&param.parameter, parameter);
if (ZEND_NUM_ARGS() < 3) {
PHP_SQLITE3_SET_TYPE(parameter, param);
}
if (!register_bound_parameter_to_sqlite(&param, stmt_obj)) {
if (!Z_ISUNDEF(param.parameter)) {
zval_ptr_dtor(&(param.parameter));
@@ -1465,6 +1489,10 @@ PHP_METHOD(sqlite3stmt, bindValue)
ZVAL_COPY(&param.parameter, parameter);
if (ZEND_NUM_ARGS() < 3) {
PHP_SQLITE3_SET_TYPE(parameter, param);
}
if (!register_bound_parameter_to_sqlite(&param, stmt_obj)) {
if (!Z_ISUNDEF(param.parameter)) {
zval_ptr_dtor(&(param.parameter));
@@ -1476,6 +1504,8 @@ PHP_METHOD(sqlite3stmt, bindValue)
}
/* }}} */
#undef PHP_SQLITE3_SET_TYPE
/* {{{ proto SQLite3Result SQLite3Stmt::execute()
Executes a prepared statement and returns a result set object. */
PHP_METHOD(sqlite3stmt, execute)

View File

@@ -0,0 +1,71 @@
--TEST--
Bug #68849 bindValue is not using the right data type
--SKIPIF--
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
--FILE--
<?php
$db = new SQLite3(':memory:');
$db->exec("CREATE TABLE test (a INTEGER, b TEXT, c REAL);" .
"INSERT INTO test VALUES (1, 'hello', 3.14);" .
"INSERT INTO test VALUES (3, 'world', 3.15);" .
"INSERT INTO test VALUES (0, '42', 0.42);"
);
$s = $db->prepare('SELECT * FROM test WHERE (a+2) = ?;');
$s->bindValue(1, 3);
$r = $s->execute();
var_dump($r->fetchArray(SQLITE3_ASSOC));
$s = $db->prepare('SELECT * FROM test WHERE a = ?;');
$s->bindValue(1, true);
$r = $s->execute();
var_dump($r->fetchArray(SQLITE3_ASSOC));
$s = $db->prepare('SELECT * FROM test WHERE a = ?;');
$s->bindValue(1, false);
$r = $s->execute();
var_dump($r->fetchArray(SQLITE3_ASSOC));
$s = $db->prepare('SELECT * FROM test WHERE c = ?;');
$s->bindValue(1, 3.15);
$r = $s->execute();
var_dump($r->fetchArray(SQLITE3_ASSOC));
?>
==DONE==
--EXPECTF--
array(3) {
["a"]=>
int(1)
["b"]=>
string(5) "hello"
["c"]=>
float(3.14)
}
array(3) {
["a"]=>
int(1)
["b"]=>
string(5) "hello"
["c"]=>
float(3.14)
}
array(3) {
["a"]=>
int(0)
["b"]=>
string(2) "42"
["c"]=>
float(0.42)
}
array(3) {
["a"]=>
int(3)
["b"]=>
string(5) "world"
["c"]=>
float(3.15)
}
==DONE==

View File

@@ -242,6 +242,7 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
char resolved_path_buf[MAXPATHLEN];
if (zend_stream_fixup(file, &bufptr, &data.len) == FAILURE) {
zend_file_handle_dtor(file);
return NULL;
}
@@ -288,6 +289,7 @@ zend_op_array *phpdbg_compile_file(zend_file_handle *file, int type) {
fake.opened_path = NULL;
zend_file_handle_dtor(&fake);
zend_file_handle_dtor(file);
return ret;
}