Skip to content

Commit 766eb01

Browse files
committed
Merge remote-tracking branch 'origin/master' into native-tls
* origin/master: fix several datatype mismatch warnings fix signed/unsigned mismatch warning more signed/unsigned mismatch fix fix signed/unsigned mismatch warning fix signed/unsigned mismatch fix some signed/unsigned mismatch missing include for strlen proto More fixes for array/object casts with temporary variables Fix array/object cast of refcounted tmp var Deref right value for compound assign ops
2 parents 19c41e1 + 65eb8ef commit 766eb01

13 files changed

+197
-117
lines changed

Zend/tests/bw_or_assign_with_ref.phpt

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Bitwise or assign with referenced value
3+
--FILE--
4+
<?php
5+
6+
$num1 = 1;
7+
$num2 = '2';
8+
$ref =& $num2;
9+
$num1 |= $num2;
10+
var_dump($num1);
11+
12+
?>
13+
--EXPECT--
14+
int(3)

Zend/tests/double_array_cast.phpt

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Double array cast
3+
--FILE--
4+
<?php
5+
6+
$array = [1, 2, $x = 3];
7+
var_dump((array) (array) $array);
8+
9+
?>
10+
--EXPECT--
11+
array(3) {
12+
[0]=>
13+
int(1)
14+
[1]=>
15+
int(2)
16+
[2]=>
17+
int(3)
18+
}

Zend/tests/object_array_cast.phpt

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
--TEST--
2+
(object) (array) and (array) (object) casts
3+
--FILE--
4+
<?php
5+
6+
$arr = [1, 2, 3];
7+
var_dump((object) (array) $arr);
8+
var_dump($arr);
9+
10+
$obj = (object) [1, 2, 3];
11+
var_dump((array) (object) $obj);
12+
var_dump($obj);
13+
14+
?>
15+
--EXPECT--
16+
object(stdClass)#1 (3) {
17+
[0]=>
18+
int(1)
19+
[1]=>
20+
int(2)
21+
[2]=>
22+
int(3)
23+
}
24+
array(3) {
25+
[0]=>
26+
int(1)
27+
[1]=>
28+
int(2)
29+
[2]=>
30+
int(3)
31+
}
32+
array(3) {
33+
[0]=>
34+
int(1)
35+
[1]=>
36+
int(2)
37+
[2]=>
38+
int(3)
39+
}
40+
object(stdClass)#1 (3) {
41+
[0]=>
42+
int(1)
43+
[1]=>
44+
int(2)
45+
[2]=>
46+
int(3)
47+
}

Zend/zend_execute.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1522,7 +1522,7 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
15221522
}
15231523

15241524
/* Initialize CV variables (skip arguments) */
1525-
if (EXPECTED(num_args < op_array->last_var)) {
1525+
if (EXPECTED((int)num_args < op_array->last_var)) {
15261526
zval *var = EX_VAR_NUM(num_args);
15271527
zval *end = EX_VAR_NUM(op_array->last_var);
15281528

@@ -1621,7 +1621,7 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
16211621
}
16221622

16231623
/* Initialize CV variables (skip arguments) */
1624-
if (EXPECTED(num_args < op_array->last_var)) {
1624+
if (EXPECTED((int)num_args < op_array->last_var)) {
16251625
zval *var = EX_VAR_NUM(num_args);
16261626
zval *end = EX_VAR_NUM(op_array->last_var);
16271627

Zend/zend_generators.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ static void zend_generator_cleanup_unfinished_execution(zend_generator *generato
5252

5353
if (brk_cont->start < 0) {
5454
continue;
55-
} else if (brk_cont->start > op_num) {
55+
} else if ((uint32_t)brk_cont->start > op_num) {
5656
break;
57-
} else if (brk_cont->brk > op_num) {
57+
} else if (brk_cont->brk >= 0 && (uint32_t)brk_cont->brk > op_num) {
5858
zend_op *brk_opline = op_array->opcodes + brk_cont->brk;
5959

6060
if (brk_opline->opcode == ZEND_FREE) {

Zend/zend_indent.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ ZEND_API void zend_indent(TSRMLS_D)
5252
zval token;
5353
int token_type;
5454
int in_string=0;
55-
int nest_level=0;
56-
int emit_whitespace[256];
57-
int i;
55+
unsigned int nest_level=0;
56+
unsigned int emit_whitespace[256];
57+
unsigned int i;
5858

5959
memset(emit_whitespace, 0, sizeof(int)*256);
6060

Zend/zend_vm_def.h

+9-16
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
343343
object = make_real_object(object TSRMLS_CC);
344344
}
345345

346-
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
346+
value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
347347

348348
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
349349
zend_error(E_WARNING, "Attempt to assign property of non-object");
@@ -444,7 +444,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMP|VAR
444444
zval *dim = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
445445

446446
zend_fetch_dimension_address_RW(EX_VAR((opline+1)->op2.var), container, dim, OP2_TYPE TSRMLS_CC);
447-
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
447+
value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
448448
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
449449
}
450450

@@ -497,7 +497,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU
497497
zval *value;
498498

499499
SAVE_OPLINE();
500-
value = GET_OP2_ZVAL_PTR(BP_VAR_R);
500+
value = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
501501
var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
502502

503503
if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
@@ -4043,7 +4043,7 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
40434043
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
40444044
}
40454045

4046-
FREE_OP1();
4046+
FREE_OP1_IF_VAR();
40474047
CHECK_EXCEPTION();
40484048
ZEND_VM_NEXT_OPCODE();
40494049
}
@@ -4058,15 +4058,13 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
40584058
if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) {
40594059
zval_copy_ctor_func(expr);
40604060
}
4061-
} else if (OP1_TYPE != IS_TMP_VAR) {
4061+
} else {
40624062
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
40634063
}
40644064
}
40654065
} else {
40664066
ZVAL_COPY_VALUE(result, expr);
4067-
if (OP1_TYPE != IS_TMP_VAR) {
4068-
zval_opt_copy_ctor(result);
4069-
}
4067+
Z_ADDREF_P(result);
40704068
convert_to_array(result);
40714069
}
40724070
} else {
@@ -4078,23 +4076,18 @@ ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
40784076
if (UNEXPECTED(Z_OPT_COPYABLE_P(expr))) {
40794077
zval_copy_ctor_func(expr);
40804078
}
4081-
} else if (OP1_TYPE != IS_TMP_VAR) {
4079+
} else {
40824080
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
40834081
}
40844082
}
40854083
} else {
40864084
ZVAL_COPY_VALUE(result, expr);
4087-
if (OP1_TYPE != IS_TMP_VAR) {
4088-
zval_opt_copy_ctor(result);
4089-
}
4085+
zval_opt_copy_ctor(result);
40904086
convert_to_object(result);
40914087
}
40924088
}
4093-
4094-
FREE_OP1_IF_VAR();
4095-
CHECK_EXCEPTION();
4096-
ZEND_VM_NEXT_OPCODE();
40974089
}
4090+
40984091
FREE_OP1();
40994092
CHECK_EXCEPTION();
41004093
ZEND_VM_NEXT_OPCODE();

0 commit comments

Comments
 (0)