Fix namespace\, maybe

This commit is contained in:
Nikita Popov 2014-07-22 13:25:47 +02:00
parent 9c69c41a64
commit cc0bef6636
3 changed files with 46 additions and 27 deletions

View File

@ -738,20 +738,32 @@ void *zend_hash_find_ptr_lc(HashTable *ht, char *str, size_t len) {
}
zend_string *zend_resolve_non_class_name(
zend_string *name, zend_bool *is_fully_qualified,
zend_string *name, zend_uint type, zend_bool *is_fully_qualified,
zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC
) {
char *compound;
*is_fully_qualified = 0;
if (name->val[0] == '\\') {
/* Remove \ prefix (only relevant if this is a string rather than a label) */
return STR_INIT(name->val + 1, name->len - 1, 0);
}
if (*is_fully_qualified) {
if (type == ZEND_NAME_FQ) {
*is_fully_qualified = 1;
return STR_COPY(name);
}
if (type == ZEND_NAME_RELATIVE) {
*is_fully_qualified = 1;
if (Z_TYPE(CG(current_namespace)) != IS_UNDEF) {
return zend_concat_names(Z_STRVAL(CG(current_namespace)),
Z_STRLEN(CG(current_namespace)), name->val, name->len);
} else {
return STR_COPY(name);
}
}
if (current_import_sub) {
/* If an unqualified name is a function/const alias, replace it. */
zend_string *import_name;
@ -793,25 +805,34 @@ zend_string *zend_resolve_non_class_name(
/* }}} */
zend_string *zend_resolve_function_name(
zend_string *name, zend_bool *is_fully_qualified TSRMLS_DC
zend_string *name, zend_uint type, zend_bool *is_fully_qualified TSRMLS_DC
) {
return zend_resolve_non_class_name(
name, is_fully_qualified, 0, CG(current_import_function) TSRMLS_CC);
name, type, is_fully_qualified, 0, CG(current_import_function) TSRMLS_CC);
}
zend_string *zend_resolve_const_name(
zend_string *name, zend_bool *is_fully_qualified TSRMLS_DC
zend_string *name, zend_uint type, zend_bool *is_fully_qualified TSRMLS_DC
) {
return zend_resolve_non_class_name(
name, is_fully_qualified, 1, CG(current_import_const) TSRMLS_CC);
name, type, is_fully_qualified, 1, CG(current_import_const) TSRMLS_CC);
}
zend_string *zend_resolve_class_name(
zend_string *name, zend_bool is_fully_qualified TSRMLS_DC
zend_string *name, zend_uint type TSRMLS_DC
) {
char *compound;
if (is_fully_qualified || name->val[0] == '\\') {
if (type == ZEND_NAME_RELATIVE) {
if (Z_TYPE(CG(current_namespace)) != IS_UNDEF) {
return zend_concat_names(Z_STRVAL(CG(current_namespace)),
Z_STRLEN(CG(current_namespace)), name->val, name->len);
} else {
return STR_COPY(name);
}
}
if (type == ZEND_NAME_FQ || name->val[0] == '\\') {
/* Remove \ prefix (only relevant if this is a string rather than a label) */
if (name->val[0] == '\\') {
name = STR_INIT(name->val + 1, name->len - 1, 0);
@ -858,13 +879,12 @@ zend_string *zend_resolve_class_name(
zend_string *zend_resolve_class_name_ast(zend_ast *ast TSRMLS_DC) {
zend_string *name = Z_STR_P(zend_ast_get_zval(ast));
zend_bool is_fully_qualified = !ast->attr;
return zend_resolve_class_name(name, is_fully_qualified TSRMLS_CC);
return zend_resolve_class_name(name, ast->attr TSRMLS_CC);
}
void zend_resolve_class_name_old(znode *class_name TSRMLS_DC) {
zend_string *resolved_name = zend_resolve_class_name(
Z_STR(class_name->u.constant), 0 TSRMLS_CC);
Z_STR(class_name->u.constant), ZEND_NAME_NOT_FQ TSRMLS_CC);
zval_dtor(&class_name->u.constant);
ZVAL_STR(&class_name->u.constant, resolved_name);
}
@ -4488,11 +4508,11 @@ zend_op *zend_compile_call_common(znode *result, zend_ast *args_ast, zend_functi
zend_bool zend_compile_function_name(znode *name_node, zend_ast *name_ast TSRMLS_DC) {
zend_string *orig_name = Z_STR_P(zend_ast_get_zval(name_ast));
zend_bool is_fully_qualified = !name_ast->attr;
zend_bool is_fully_qualified;
name_node->op_type = IS_CONST;
ZVAL_STR(&name_node->u.constant, zend_resolve_function_name(
orig_name, &is_fully_qualified TSRMLS_CC));
orig_name, name_ast->attr, &is_fully_qualified TSRMLS_CC));
return !is_fully_qualified && Z_TYPE(CG(current_namespace)) != IS_UNDEF;
}
@ -6958,12 +6978,13 @@ void zend_compile_array(znode *result, zend_ast *ast TSRMLS_DC) {
void zend_compile_const(znode *result, zend_ast *ast TSRMLS_DC) {
zend_ast *name_ast = ast->child[0];
zend_string *orig_name = Z_STR_P(zend_ast_get_zval(name_ast));
zend_bool is_fully_qualified = !name_ast->attr;
zend_bool is_fully_qualified;
zval resolved_name;
zend_op *opline;
ZVAL_STR(&resolved_name, zend_resolve_const_name(orig_name, &is_fully_qualified TSRMLS_CC));
ZVAL_STR(&resolved_name, zend_resolve_const_name(
orig_name, name_ast->attr, &is_fully_qualified TSRMLS_CC));
if (zend_constant_ct_subst(result, &resolved_name, 1 TSRMLS_CC)) {
zval_dtor(&resolved_name);
@ -7245,7 +7266,7 @@ void zend_compile_const_expr_const(zend_ast **ast_ptr TSRMLS_DC) {
zend_ast *ast = *ast_ptr;
zend_ast *name_ast = ast->child[0];
zval *orig_name = zend_ast_get_zval(name_ast);
zend_bool is_fully_qualified = !name_ast->attr;
zend_bool is_fully_qualified;
znode result;
zval resolved_name;
@ -7257,7 +7278,7 @@ void zend_compile_const_expr_const(zend_ast **ast_ptr TSRMLS_DC) {
}
ZVAL_STR(&resolved_name, zend_resolve_const_name(
Z_STR_P(orig_name), &is_fully_qualified TSRMLS_CC));
Z_STR_P(orig_name), name_ast->attr, &is_fully_qualified TSRMLS_CC));
Z_TYPE_INFO(resolved_name) = IS_CONSTANT_EX;
if (!is_fully_qualified) {

View File

@ -460,10 +460,7 @@ ZEND_API zend_string *zend_get_compiled_filename(TSRMLS_D);
ZEND_API int zend_get_compiled_lineno(TSRMLS_D);
ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D);
zend_string *zend_resolve_non_class_name(zend_string *name, zend_bool *is_fully_qualified, zend_bool case_sensitive, HashTable *current_import_sub TSRMLS_DC);
zend_string *zend_resolve_function_name(zend_string *name, zend_bool *is_fully_qualified TSRMLS_DC);
zend_string *zend_resolve_const_name(zend_string *name, zend_bool *is_fully_qualified TSRMLS_DC);
zend_string *zend_resolve_class_name(zend_string *name, zend_bool is_fully_qualified TSRMLS_DC);
zend_string *zend_resolve_class_name(zend_string *name, zend_uint type TSRMLS_DC);
ZEND_API zend_string *zend_get_compiled_variable_name(const zend_op_array *op_array, zend_uint var);
void zend_resolve_class_name_old(znode *class_name TSRMLS_DC);
@ -630,6 +627,9 @@ int zend_add_literal(zend_op_array *op_array, zval *zv TSRMLS_DC);
#define ZEND_PARAM_REF (1<<0)
#define ZEND_PARAM_VARIADIC (1<<1)
#define ZEND_NAME_FQ 0
#define ZEND_NAME_NOT_FQ 1
#define ZEND_NAME_RELATIVE 2
/* unset types */
#define ZEND_UNSET_REG 0

View File

@ -236,13 +236,11 @@ namespace_name:
name:
namespace_name
{ $$.u.ast = zend_ast_create_zval_ex(&$1.u.constant, 1); }
{ $$.u.ast = zend_ast_create_zval_ex(&$1.u.constant, ZEND_NAME_NOT_FQ); }
| T_NAMESPACE T_NS_SEPARATOR namespace_name
{ ZVAL_EMPTY_STRING(&$1.u.constant);
zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC);
$$.u.ast = AST_ZVAL(&$1); }
{ $$.u.ast = zend_ast_create_zval_ex(&$3.u.constant, ZEND_NAME_RELATIVE); }
| T_NS_SEPARATOR namespace_name
{ $$.u.ast = AST_ZVAL(&$2); }
{ $$.u.ast = zend_ast_create_zval_ex(&$2.u.constant, ZEND_NAME_FQ); }
;
/* TODO.AST early binding! */
@ -916,7 +914,7 @@ function_call:
class_name:
T_STATIC
{ zval zv; ZVAL_STRINGL(&zv, "static", sizeof("static")-1);
$$.u.ast = zend_ast_create_zval_ex(&zv, 1); }
$$.u.ast = zend_ast_create_zval_ex(&zv, ZEND_NAME_NOT_FQ); }
| name { $$.u.ast = $1.u.ast; }
;