Accept zend_string instead of zval in compile_filename

This commit is contained in:
Nikita Popov 2021-04-09 14:33:34 +02:00
parent 46ee57e910
commit b196d4ae3e
3 changed files with 19 additions and 40 deletions

View file

@ -816,7 +816,7 @@ struct _zend_arena;
ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type); ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type);
ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename); ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename);
ZEND_API zend_op_array *compile_filename(int type, zval *filename); ZEND_API zend_op_array *compile_filename(int type, zend_string *filename);
ZEND_API zend_ast *zend_compile_string_to_ast( ZEND_API zend_ast *zend_compile_string_to_ast(
zend_string *code, struct _zend_arena **ast_arena, zend_string *filename); zend_string *code, struct _zend_arena **ast_arena, zend_string *filename);
ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...); ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...);

View file

@ -4212,20 +4212,13 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
#define ZEND_FAKE_OP_ARRAY ((zend_op_array*)(zend_intptr_t)-1) #define ZEND_FAKE_OP_ARRAY ((zend_op_array*)(zend_intptr_t)-1)
static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename, int type) /* {{{ */ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename_zv, int type) /* {{{ */
{ {
zend_op_array *new_op_array = NULL; zend_op_array *new_op_array = NULL;
zval tmp_inc_filename; zend_string *tmp_inc_filename;
zend_string *inc_filename = zval_try_get_tmp_string(inc_filename_zv, &tmp_inc_filename);
ZVAL_UNDEF(&tmp_inc_filename); if (UNEXPECTED(!inc_filename)) {
if (Z_TYPE_P(inc_filename) != IS_STRING) { return NULL;
zend_string *tmp = zval_try_get_string_func(inc_filename);
if (UNEXPECTED(!tmp)) {
return NULL;
}
ZVAL_STR(&tmp_inc_filename, tmp);
inc_filename = &tmp_inc_filename;
} }
switch (type) { switch (type) {
@ -4234,7 +4227,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
zend_file_handle file_handle; zend_file_handle file_handle;
zend_string *resolved_path; zend_string *resolved_path;
resolved_path = zend_resolve_path(Z_STR_P(inc_filename)); resolved_path = zend_resolve_path(inc_filename);
if (EXPECTED(resolved_path)) { if (EXPECTED(resolved_path)) {
if (zend_hash_exists(&EG(included_files), resolved_path)) { if (zend_hash_exists(&EG(included_files), resolved_path)) {
new_op_array = ZEND_FAKE_OP_ARRAY; 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
} }
} else if (UNEXPECTED(EG(exception))) { } else if (UNEXPECTED(EG(exception))) {
break; break;
} else if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) { } else if (UNEXPECTED(strlen(ZSTR_VAL(inc_filename)) != ZSTR_LEN(inc_filename))) {
zend_message_dispatcher( zend_message_dispatcher(
(type == ZEND_INCLUDE_ONCE) ? (type == ZEND_INCLUDE_ONCE) ?
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN, ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
Z_STRVAL_P(inc_filename)); ZSTR_VAL(inc_filename));
break; break;
} else { } else {
resolved_path = zend_string_copy(Z_STR_P(inc_filename)); resolved_path = zend_string_copy(inc_filename);
} }
zend_stream_init_filename_ex(&file_handle, resolved_path); 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
zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE)); zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE));
zend_destroy_file_handle(&file_handle); zend_destroy_file_handle(&file_handle);
zend_string_release_ex(resolved_path, 0); zend_string_release_ex(resolved_path, 0);
if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { zend_tmp_string_release(tmp_inc_filename);
zval_ptr_dtor_str(&tmp_inc_filename);
}
return op_array; return op_array;
} else { } else {
new_op_array = ZEND_FAKE_OP_ARRAY; new_op_array = ZEND_FAKE_OP_ARRAY;
@ -4275,7 +4266,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
zend_message_dispatcher( zend_message_dispatcher(
(type == ZEND_INCLUDE_ONCE) ? (type == ZEND_INCLUDE_ONCE) ?
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN, ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
Z_STRVAL_P(inc_filename)); ZSTR_VAL(inc_filename));
} }
zend_destroy_file_handle(&file_handle); zend_destroy_file_handle(&file_handle);
zend_string_release_ex(resolved_path, 0); zend_string_release_ex(resolved_path, 0);
@ -4283,29 +4274,25 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval
break; break;
case ZEND_INCLUDE: case ZEND_INCLUDE:
case ZEND_REQUIRE: case ZEND_REQUIRE:
if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) { if (UNEXPECTED(strlen(ZSTR_VAL(inc_filename)) != ZSTR_LEN(inc_filename))) {
zend_message_dispatcher( zend_message_dispatcher(
(type == ZEND_INCLUDE) ? (type == ZEND_INCLUDE) ?
ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN, ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN,
Z_STRVAL_P(inc_filename)); ZSTR_VAL(inc_filename));
break; break;
} }
new_op_array = compile_filename(type, inc_filename); new_op_array = compile_filename(type, inc_filename);
break; break;
case ZEND_EVAL: { case ZEND_EVAL: {
char *eval_desc = zend_make_compiled_string_description("eval()'d code"); char *eval_desc = zend_make_compiled_string_description("eval()'d code");
zend_string *code = zval_get_string(inc_filename); new_op_array = zend_compile_string(inc_filename, eval_desc);
new_op_array = zend_compile_string(code, eval_desc);
zend_string_release(code);
efree(eval_desc); efree(eval_desc);
} }
break; break;
EMPTY_SWITCH_DEFAULT_CASE() EMPTY_SWITCH_DEFAULT_CASE()
} }
if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { zend_tmp_string_release(tmp_inc_filename);
zval_ptr_dtor_str(&tmp_inc_filename);
}
return new_op_array; return new_op_array;
} }
/* }}} */ /* }}} */

View file

@ -696,23 +696,18 @@ ZEND_API zend_ast *zend_compile_string_to_ast(
return ast; return ast;
} }
zend_op_array *compile_filename(int type, zval *filename) zend_op_array *compile_filename(int type, zend_string *filename)
{ {
zend_file_handle file_handle; zend_file_handle file_handle;
zval tmp;
zend_op_array *retval; zend_op_array *retval;
zend_string *opened_path = NULL; zend_string *opened_path = NULL;
if (Z_TYPE_P(filename) != IS_STRING) { zend_stream_init_filename_ex(&file_handle, filename);
ZVAL_STR(&tmp, zval_get_string(filename));
filename = &tmp;
}
zend_stream_init_filename_ex(&file_handle, Z_STR_P(filename));
retval = zend_compile_file(&file_handle, type); retval = zend_compile_file(&file_handle, type);
if (retval && file_handle.handle.stream.handle) { if (retval && file_handle.handle.stream.handle) {
if (!file_handle.opened_path) { if (!file_handle.opened_path) {
file_handle.opened_path = opened_path = zend_string_copy(Z_STR_P(filename)); file_handle.opened_path = opened_path = zend_string_copy(filename);
} }
zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path); 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)
} }
zend_destroy_file_handle(&file_handle); zend_destroy_file_handle(&file_handle);
if (UNEXPECTED(filename == &tmp)) {
zval_ptr_dtor(&tmp);
}
return retval; return retval;
} }