Skip to content

Commit 62867f0

Browse files
committed
Improved ECHO and PRINT
1 parent a417ebf commit 62867f0

File tree

2 files changed

+103
-75
lines changed

2 files changed

+103
-75
lines changed

Zend/zend_vm_def.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -989,23 +989,36 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
989989
ZEND_VM_NEXT_OPCODE();
990990
}
991991

992-
ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY)
992+
ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
993993
{
994994
USE_OPLINE
995995
zend_free_op free_op1;
996996
zval *z;
997997

998998
SAVE_OPLINE();
999-
z = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
999+
z = GET_OP1_ZVAL_PTR(BP_VAR_R);
10001000

1001-
zend_print_variable(z TSRMLS_CC);
1001+
if (Z_TYPE_P(z) == IS_STRING) {
1002+
zend_string *str = Z_STR_P(z);
1003+
1004+
if (str->len != 0) {
1005+
zend_write(str->val, str->len);
1006+
}
1007+
} else {
1008+
zend_string *str = _zval_get_string_func(z TSRMLS_CC);
1009+
1010+
if (str->len != 0) {
1011+
zend_write(str->val, str->len);
1012+
}
1013+
zend_string_release(str);
1014+
}
10021015

10031016
FREE_OP1();
10041017
CHECK_EXCEPTION();
10051018
ZEND_VM_NEXT_OPCODE();
10061019
}
10071020

1008-
ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMP|VAR|CV, ANY)
1021+
ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMPVAR|CV, ANY)
10091022
{
10101023
USE_OPLINE
10111024

Zend/zend_vm_execute.h

Lines changed: 86 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2364,7 +2364,20 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23642364
SAVE_OPLINE();
23652365
z = opline->op1.zv;
23662366

2367-
zend_print_variable(z TSRMLS_CC);
2367+
if (Z_TYPE_P(z) == IS_STRING) {
2368+
zend_string *str = Z_STR_P(z);
2369+
2370+
if (str->len != 0) {
2371+
zend_write(str->val, str->len);
2372+
}
2373+
} else {
2374+
zend_string *str = _zval_get_string_func(z TSRMLS_CC);
2375+
2376+
if (str->len != 0) {
2377+
zend_write(str->val, str->len);
2378+
}
2379+
zend_string_release(str);
2380+
}
23682381

23692382
CHECK_EXCEPTION();
23702383
ZEND_VM_NEXT_OPCODE();
@@ -8635,30 +8648,6 @@ static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
86358648
ZEND_VM_NEXT_OPCODE();
86368649
}
86378650

8638-
static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8639-
{
8640-
USE_OPLINE
8641-
zend_free_op free_op1;
8642-
zval *z;
8643-
8644-
SAVE_OPLINE();
8645-
z = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
8646-
8647-
zend_print_variable(z TSRMLS_CC);
8648-
8649-
zval_ptr_dtor_nogc(free_op1);
8650-
CHECK_EXCEPTION();
8651-
ZEND_VM_NEXT_OPCODE();
8652-
}
8653-
8654-
static int ZEND_FASTCALL ZEND_PRINT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8655-
{
8656-
USE_OPLINE
8657-
8658-
ZVAL_LONG(EX_VAR(opline->result.var), 1);
8659-
return ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
8660-
}
8661-
86628651
static int ZEND_FASTCALL ZEND_JMPZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
86638652
{
86648653
USE_OPLINE
@@ -13165,30 +13154,6 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1316513154
ZEND_VM_NEXT_OPCODE();
1316613155
}
1316713156

13168-
static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13169-
{
13170-
USE_OPLINE
13171-
zend_free_op free_op1;
13172-
zval *z;
13173-
13174-
SAVE_OPLINE();
13175-
z = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1);
13176-
13177-
zend_print_variable(z TSRMLS_CC);
13178-
13179-
zval_ptr_dtor_nogc(free_op1);
13180-
CHECK_EXCEPTION();
13181-
ZEND_VM_NEXT_OPCODE();
13182-
}
13183-
13184-
static int ZEND_FASTCALL ZEND_PRINT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13185-
{
13186-
USE_OPLINE
13187-
13188-
ZVAL_LONG(EX_VAR(opline->result.var), 1);
13189-
return ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
13190-
}
13191-
1319213157
static int ZEND_FASTCALL ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1319313158
{
1319413159
USE_OPLINE
@@ -27303,9 +27268,22 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2730327268
zval *z;
2730427269

2730527270
SAVE_OPLINE();
27306-
z = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
27271+
z = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
2730727272

27308-
zend_print_variable(z TSRMLS_CC);
27273+
if (Z_TYPE_P(z) == IS_STRING) {
27274+
zend_string *str = Z_STR_P(z);
27275+
27276+
if (str->len != 0) {
27277+
zend_write(str->val, str->len);
27278+
}
27279+
} else {
27280+
zend_string *str = _zval_get_string_func(z TSRMLS_CC);
27281+
27282+
if (str->len != 0) {
27283+
zend_write(str->val, str->len);
27284+
}
27285+
zend_string_release(str);
27286+
}
2730927287

2731027288
CHECK_EXCEPTION();
2731127289
ZEND_VM_NEXT_OPCODE();
@@ -36726,6 +36704,43 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEN
3672636704
ZEND_VM_NEXT_OPCODE();
3672736705
}
3672836706

36707+
static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36708+
{
36709+
USE_OPLINE
36710+
zend_free_op free_op1;
36711+
zval *z;
36712+
36713+
SAVE_OPLINE();
36714+
z = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
36715+
36716+
if (Z_TYPE_P(z) == IS_STRING) {
36717+
zend_string *str = Z_STR_P(z);
36718+
36719+
if (str->len != 0) {
36720+
zend_write(str->val, str->len);
36721+
}
36722+
} else {
36723+
zend_string *str = _zval_get_string_func(z TSRMLS_CC);
36724+
36725+
if (str->len != 0) {
36726+
zend_write(str->val, str->len);
36727+
}
36728+
zend_string_release(str);
36729+
}
36730+
36731+
zval_ptr_dtor_nogc(free_op1);
36732+
CHECK_EXCEPTION();
36733+
ZEND_VM_NEXT_OPCODE();
36734+
}
36735+
36736+
static int ZEND_FASTCALL ZEND_PRINT_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36737+
{
36738+
USE_OPLINE
36739+
36740+
ZVAL_LONG(EX_VAR(opline->result.var), 1);
36741+
return ZEND_ECHO_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
36742+
}
36743+
3672936744
static int ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3673036745
{
3673136746
USE_OPLINE
@@ -39195,16 +39210,16 @@ void zend_init_opcodes_handlers(void)
3919539210
ZEND_ECHO_SPEC_CONST_HANDLER,
3919639211
ZEND_ECHO_SPEC_CONST_HANDLER,
3919739212
ZEND_ECHO_SPEC_CONST_HANDLER,
39198-
ZEND_ECHO_SPEC_TMP_HANDLER,
39199-
ZEND_ECHO_SPEC_TMP_HANDLER,
39200-
ZEND_ECHO_SPEC_TMP_HANDLER,
39201-
ZEND_ECHO_SPEC_TMP_HANDLER,
39202-
ZEND_ECHO_SPEC_TMP_HANDLER,
39203-
ZEND_ECHO_SPEC_VAR_HANDLER,
39204-
ZEND_ECHO_SPEC_VAR_HANDLER,
39205-
ZEND_ECHO_SPEC_VAR_HANDLER,
39206-
ZEND_ECHO_SPEC_VAR_HANDLER,
39207-
ZEND_ECHO_SPEC_VAR_HANDLER,
39213+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39214+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39215+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39216+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39217+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39218+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39219+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39220+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39221+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
39222+
ZEND_ECHO_SPEC_TMPVAR_HANDLER,
3920839223
ZEND_NULL_HANDLER,
3920939224
ZEND_NULL_HANDLER,
3921039225
ZEND_NULL_HANDLER,
@@ -39220,16 +39235,16 @@ void zend_init_opcodes_handlers(void)
3922039235
ZEND_PRINT_SPEC_CONST_HANDLER,
3922139236
ZEND_PRINT_SPEC_CONST_HANDLER,
3922239237
ZEND_PRINT_SPEC_CONST_HANDLER,
39223-
ZEND_PRINT_SPEC_TMP_HANDLER,
39224-
ZEND_PRINT_SPEC_TMP_HANDLER,
39225-
ZEND_PRINT_SPEC_TMP_HANDLER,
39226-
ZEND_PRINT_SPEC_TMP_HANDLER,
39227-
ZEND_PRINT_SPEC_TMP_HANDLER,
39228-
ZEND_PRINT_SPEC_VAR_HANDLER,
39229-
ZEND_PRINT_SPEC_VAR_HANDLER,
39230-
ZEND_PRINT_SPEC_VAR_HANDLER,
39231-
ZEND_PRINT_SPEC_VAR_HANDLER,
39232-
ZEND_PRINT_SPEC_VAR_HANDLER,
39238+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39239+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39240+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39241+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39242+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39243+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39244+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39245+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39246+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
39247+
ZEND_PRINT_SPEC_TMPVAR_HANDLER,
3923339248
ZEND_NULL_HANDLER,
3923439249
ZEND_NULL_HANDLER,
3923539250
ZEND_NULL_HANDLER,

0 commit comments

Comments
 (0)