Skip to content

Commit e6180eb

Browse files
committed
Improved BOOL, BOOL_NOT and conditional jumps
1 parent 62867f0 commit e6180eb

File tree

2 files changed

+525
-665
lines changed

2 files changed

+525
-665
lines changed

Zend/zend_vm_def.h

Lines changed: 75 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -313,16 +313,23 @@ ZEND_VM_HANDLER(12, ZEND_BW_NOT, CONST|TMP|VAR|CV, ANY)
313313
ZEND_VM_NEXT_OPCODE();
314314
}
315315

316-
ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMP|VAR|CV, ANY)
316+
ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMPVAR|CV, ANY)
317317
{
318318
USE_OPLINE
319+
zval *val;
319320
zend_free_op free_op1;
320321

321322
SAVE_OPLINE();
322-
boolean_not_function(EX_VAR(opline->result.var),
323-
GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R) TSRMLS_CC);
324-
FREE_OP1();
325-
CHECK_EXCEPTION();
323+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
324+
if (Z_TYPE_P(val) == IS_TRUE) {
325+
ZVAL_FALSE(EX_VAR(opline->result.var));
326+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
327+
ZVAL_TRUE(EX_VAR(opline->result.var));
328+
} else {
329+
ZVAL_BOOL(EX_VAR(opline->result.var), !i_zend_is_true(val TSRMLS_CC));
330+
FREE_OP1();
331+
CHECK_EXCEPTION();
332+
}
326333
ZEND_VM_NEXT_OPCODE();
327334
}
328335

@@ -441,7 +448,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMP|VAR
441448
}
442449
ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_obj_helper, binary_op, binary_op);
443450
} else {
444-
zval *dim = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
451+
zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
445452

446453
zend_fetch_dimension_address_RW(&rv, container, dim, OP2_TYPE TSRMLS_CC);
447454
value = get_zval_ptr_deref((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
@@ -1844,20 +1851,22 @@ ZEND_VM_HANDLER(42, ZEND_JMP, ANY, ANY)
18441851
ZEND_VM_CONTINUE();
18451852
}
18461853

1847-
ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY)
1854+
ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMPVAR|CV, ANY)
18481855
{
18491856
USE_OPLINE
18501857
zend_free_op free_op1;
18511858
zval *val;
18521859

18531860
SAVE_OPLINE();
1854-
val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1861+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
18551862

1856-
if (OP1_TYPE == IS_TMP_VAR) {
1857-
if (Z_TYPE_P(val) == IS_TRUE) {
1858-
ZEND_VM_SET_OPCODE(opline + 1);
1859-
ZEND_VM_CONTINUE();
1860-
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1863+
if (Z_TYPE_P(val) == IS_TRUE) {
1864+
ZEND_VM_SET_OPCODE(opline + 1);
1865+
ZEND_VM_CONTINUE();
1866+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1867+
if (OP1_TYPE == IS_CV) {
1868+
ZEND_VM_JMP(opline->op2.jmp_addr);
1869+
} else {
18611870
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
18621871
ZEND_VM_CONTINUE();
18631872
}
@@ -1875,20 +1884,22 @@ ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY)
18751884
ZEND_VM_JMP(opline);
18761885
}
18771886

1878-
ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMP|VAR|CV, ANY)
1887+
ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, ANY)
18791888
{
18801889
USE_OPLINE
18811890
zend_free_op free_op1;
18821891
zval *val;
18831892

18841893
SAVE_OPLINE();
1885-
val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1894+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
18861895

1887-
if (OP1_TYPE == IS_TMP_VAR) {
1888-
if (Z_TYPE_P(val) == IS_TRUE) {
1889-
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1890-
ZEND_VM_CONTINUE();
1891-
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1896+
if (Z_TYPE_P(val) == IS_TRUE) {
1897+
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1898+
ZEND_VM_CONTINUE();
1899+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1900+
if (OP1_TYPE == IS_CV) {
1901+
ZEND_VM_NEXT_OPCODE();
1902+
} else {
18921903
ZEND_VM_SET_OPCODE(opline + 1);
18931904
ZEND_VM_CONTINUE();
18941905
}
@@ -1906,20 +1917,22 @@ ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMP|VAR|CV, ANY)
19061917
ZEND_VM_JMP(opline);
19071918
}
19081919

1909-
ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMP|VAR|CV, ANY)
1920+
ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, ANY)
19101921
{
19111922
USE_OPLINE
19121923
zend_free_op free_op1;
19131924
zval *val;
19141925

19151926
SAVE_OPLINE();
1916-
val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1927+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
19171928

1918-
if (OP1_TYPE == IS_TMP_VAR) {
1919-
if (EXPECTED(Z_TYPE_P(val) == IS_TRUE)) {
1920-
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
1921-
ZEND_VM_CONTINUE();
1922-
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1929+
if (EXPECTED(Z_TYPE_P(val) == IS_TRUE)) {
1930+
ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
1931+
ZEND_VM_CONTINUE();
1932+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1933+
if (OP1_TYPE == IS_CV) {
1934+
ZEND_VM_JMP(opline->op2.jmp_addr);
1935+
} else {
19231936
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
19241937
ZEND_VM_CONTINUE();
19251938
}
@@ -1937,22 +1950,24 @@ ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMP|VAR|CV, ANY)
19371950
ZEND_VM_JMP(opline);
19381951
}
19391952

1940-
ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMP|VAR|CV, ANY)
1953+
ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, ANY)
19411954
{
19421955
USE_OPLINE
19431956
zend_free_op free_op1;
19441957
zval *val;
19451958

19461959
SAVE_OPLINE();
1947-
val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1960+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
19481961

1949-
if (OP1_TYPE == IS_TMP_VAR) {
1950-
if (Z_TYPE_P(val) == IS_TRUE) {
1951-
ZVAL_TRUE(EX_VAR(opline->result.var));
1952-
ZEND_VM_SET_OPCODE(opline + 1);
1953-
ZEND_VM_CONTINUE();
1954-
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1955-
ZVAL_FALSE(EX_VAR(opline->result.var));
1962+
if (Z_TYPE_P(val) == IS_TRUE) {
1963+
ZVAL_TRUE(EX_VAR(opline->result.var));
1964+
ZEND_VM_SET_OPCODE(opline + 1);
1965+
ZEND_VM_CONTINUE();
1966+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1967+
ZVAL_FALSE(EX_VAR(opline->result.var));
1968+
if (OP1_TYPE == IS_CV) {
1969+
ZEND_VM_JMP(opline->op2.jmp_addr);
1970+
} else {
19561971
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
19571972
ZEND_VM_CONTINUE();
19581973
}
@@ -1973,22 +1988,24 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMP|VAR|CV, ANY)
19731988
ZEND_VM_JMP(opline);
19741989
}
19751990

1976-
ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMP|VAR|CV, ANY)
1991+
ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMPVAR|CV, ANY)
19771992
{
19781993
USE_OPLINE
19791994
zend_free_op free_op1;
19801995
zval *val;
19811996

19821997
SAVE_OPLINE();
1983-
val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
1998+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
19841999

1985-
if (OP1_TYPE == IS_TMP_VAR) {
1986-
if (Z_TYPE_P(val) == IS_TRUE) {
1987-
ZVAL_TRUE(EX_VAR(opline->result.var));
1988-
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1989-
ZEND_VM_CONTINUE();
1990-
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
1991-
ZVAL_FALSE(EX_VAR(opline->result.var));
2000+
if (Z_TYPE_P(val) == IS_TRUE) {
2001+
ZVAL_TRUE(EX_VAR(opline->result.var));
2002+
ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
2003+
ZEND_VM_CONTINUE();
2004+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
2005+
ZVAL_FALSE(EX_VAR(opline->result.var));
2006+
if (OP1_TYPE == IS_CV) {
2007+
ZEND_VM_NEXT_OPCODE();
2008+
} else {
19922009
ZEND_VM_SET_OPCODE(opline + 1);
19932010
ZEND_VM_CONTINUE();
19942011
}
@@ -2512,11 +2529,11 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
25122529
}
25132530
}
25142531

2515-
ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMP|VAR|CV)
2532+
ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV)
25162533
{
25172534
USE_OPLINE
25182535
zend_free_op free_op2;
2519-
zval *function_name = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
2536+
zval *function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
25202537
zend_fcall_info_cache fcc;
25212538
char *error = NULL;
25222539
zend_function *func;
@@ -3599,15 +3616,20 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY)
35993616
ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY)
36003617
{
36013618
USE_OPLINE
3619+
zval *val;
36023620
zend_free_op free_op1;
3603-
zval *retval = EX_VAR(opline->result.var);
36043621

36053622
SAVE_OPLINE();
3606-
/* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
3607-
ZVAL_BOOL(retval, i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R) TSRMLS_CC));
3608-
FREE_OP1();
3609-
3610-
CHECK_EXCEPTION();
3623+
val = GET_OP1_ZVAL_PTR(BP_VAR_R);
3624+
if (Z_TYPE_P(val) == IS_TRUE) {
3625+
ZVAL_TRUE(EX_VAR(opline->result.var));
3626+
} else if (EXPECTED(Z_TYPE_P(val) <= IS_TRUE)) {
3627+
ZVAL_FALSE(EX_VAR(opline->result.var));
3628+
} else {
3629+
ZVAL_BOOL(EX_VAR(opline->result.var), i_zend_is_true(val TSRMLS_CC));
3630+
FREE_OP1();
3631+
CHECK_EXCEPTION();
3632+
}
36113633
ZEND_VM_NEXT_OPCODE();
36123634
}
36133635

0 commit comments

Comments
 (0)