Skip to content

Commit b196d4a

Browse files
committed
Accept zend_string instead of zval in compile_filename
1 parent 46ee57e commit b196d4a

File tree

3 files changed

+19
-40
lines changed

3 files changed

+19
-40
lines changed

Zend/zend_compile.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ struct _zend_arena;
816816

817817
ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type);
818818
ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename);
819-
ZEND_API zend_op_array *compile_filename(int type, zval *filename);
819+
ZEND_API zend_op_array *compile_filename(int type, zend_string *filename);
820820
ZEND_API zend_ast *zend_compile_string_to_ast(
821821
zend_string *code, struct _zend_arena **ast_arena, zend_string *filename);
822822
ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...);

Zend/zend_execute.c

+15-28
Original file line numberDiff line numberDiff line change
@@ -4212,20 +4212,13 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
42124212

42134213
#define ZEND_FAKE_OP_ARRAY ((zend_op_array*)(zend_intptr_t)-1)
42144214

4215-
static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename, int type) /* {{{ */
4215+
static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename_zv, int type) /* {{{ */
42164216
{
42174217
zend_op_array *new_op_array = NULL;
4218-
zval tmp_inc_filename;
4219-
4220-
ZVAL_UNDEF(&tmp_inc_filename);
4221-
if (Z_TYPE_P(inc_filename) != IS_STRING) {
4222-
zend_string *tmp = zval_try_get_string_func(inc_filename);
4223-
4224-
if (UNEXPECTED(!tmp)) {
4225-
return NULL;
4226-
}
4227-
ZVAL_STR(&tmp_inc_filename, tmp);
4228-
inc_filename = &tmp_inc_filename;
4218+
zend_string *tmp_inc_filename;
4219+
zend_string *inc_filename = zval_try_get_tmp_string(inc_filename_zv, &tmp_inc_filename);
4220+
if (UNEXPECTED(!inc_filename)) {
4221+
return NULL;
42294222
}
42304223

42314224
switch (type) {
@@ -4234,7 +4227,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
42344227
zend_file_handle file_handle;
42354228
zend_string *resolved_path;
42364229

4237-
resolved_path = zend_resolve_path(Z_STR_P(inc_filename));
4230+
resolved_path = zend_resolve_path(inc_filename);
42384231
if (EXPECTED(resolved_path)) {
42394232
if (zend_hash_exists(&EG(included_files), resolved_path)) {
42404233
new_op_array = ZEND_FAKE_OP_ARRAY;
@@ -4243,14 +4236,14 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
42434236
}
42444237
} else if (UNEXPECTED(EG(exception))) {
42454238
break;
4246-
} else if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) {
4239+
} else if (UNEXPECTED(strlen(ZSTR_VAL(inc_filename)) != ZSTR_LEN(inc_filename))) {
42474240
zend_message_dispatcher(
42484241
(type == ZEND_INCLUDE_ONCE) ?
42494242
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
4250-
Z_STRVAL_P(inc_filename));
4243+
ZSTR_VAL(inc_filename));
42514244
break;
42524245
} else {
4253-
resolved_path = zend_string_copy(Z_STR_P(inc_filename));
4246+
resolved_path = zend_string_copy(inc_filename);
42544247
}
42554248

42564249
zend_stream_init_filename_ex(&file_handle, resolved_path);
@@ -4264,9 +4257,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
42644257
zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE));
42654258
zend_destroy_file_handle(&file_handle);
42664259
zend_string_release_ex(resolved_path, 0);
4267-
if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
4268-
zval_ptr_dtor_str(&tmp_inc_filename);
4269-
}
4260+
zend_tmp_string_release(tmp_inc_filename);
42704261
return op_array;
42714262
} else {
42724263
new_op_array = ZEND_FAKE_OP_ARRAY;
@@ -4275,37 +4266,33 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
42754266
zend_message_dispatcher(
42764267
(type == ZEND_INCLUDE_ONCE) ?
42774268
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
4278-
Z_STRVAL_P(inc_filename));
4269+
ZSTR_VAL(inc_filename));
42794270
}
42804271
zend_destroy_file_handle(&file_handle);
42814272
zend_string_release_ex(resolved_path, 0);
42824273
}
42834274
break;
42844275
case ZEND_INCLUDE:
42854276
case ZEND_REQUIRE:
4286-
if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) {
4277+
if (UNEXPECTED(strlen(ZSTR_VAL(inc_filename)) != ZSTR_LEN(inc_filename))) {
42874278
zend_message_dispatcher(
42884279
(type == ZEND_INCLUDE) ?
42894280
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
4290-
Z_STRVAL_P(inc_filename));
4281+
ZSTR_VAL(inc_filename));
42914282
break;
42924283
}
42934284
new_op_array = compile_filename(type, inc_filename);
42944285
break;
42954286
case ZEND_EVAL: {
42964287
char *eval_desc = zend_make_compiled_string_description("eval()'d code");
4297-
zend_string *code = zval_get_string(inc_filename);
4298-
new_op_array = zend_compile_string(code, eval_desc);
4299-
zend_string_release(code);
4288+
new_op_array = zend_compile_string(inc_filename, eval_desc);
43004289
efree(eval_desc);
43014290
}
43024291
break;
43034292
EMPTY_SWITCH_DEFAULT_CASE()
43044293
}
43054294

4306-
if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) {
4307-
zval_ptr_dtor_str(&tmp_inc_filename);
4308-
}
4295+
zend_tmp_string_release(tmp_inc_filename);
43094296
return new_op_array;
43104297
}
43114298
/* }}} */

Zend/zend_language_scanner.l

+3-11
Original file line numberDiff line numberDiff line change
@@ -696,23 +696,18 @@ ZEND_API zend_ast *zend_compile_string_to_ast(
696696
return ast;
697697
}
698698

699-
zend_op_array *compile_filename(int type, zval *filename)
699+
zend_op_array *compile_filename(int type, zend_string *filename)
700700
{
701701
zend_file_handle file_handle;
702-
zval tmp;
703702
zend_op_array *retval;
704703
zend_string *opened_path = NULL;
705704

706-
if (Z_TYPE_P(filename) != IS_STRING) {
707-
ZVAL_STR(&tmp, zval_get_string(filename));
708-
filename = &tmp;
709-
}
710-
zend_stream_init_filename_ex(&file_handle, Z_STR_P(filename));
705+
zend_stream_init_filename_ex(&file_handle, filename);
711706

712707
retval = zend_compile_file(&file_handle, type);
713708
if (retval && file_handle.handle.stream.handle) {
714709
if (!file_handle.opened_path) {
715-
file_handle.opened_path = opened_path = zend_string_copy(Z_STR_P(filename));
710+
file_handle.opened_path = opened_path = zend_string_copy(filename);
716711
}
717712

718713
zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path);
@@ -723,9 +718,6 @@ zend_op_array *compile_filename(int type, zval *filename)
723718
}
724719
zend_destroy_file_handle(&file_handle);
725720

726-
if (UNEXPECTED(filename == &tmp)) {
727-
zval_ptr_dtor(&tmp);
728-
}
729721
return retval;
730722
}
731723

0 commit comments

Comments
 (0)