Skip to content

Commit bccc653

Browse files
committed
Avoid double IS_INTERNED() check
1 parent 35f8467 commit bccc653

24 files changed

Lines changed: 81 additions & 92 deletions

Zend/zend.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy TSRMLS_DC) /*
278278
case IS_REFERENCE:
279279
expr = Z_REFVAL_P(expr);
280280
if (Z_TYPE_P(expr) == IS_STRING) {
281-
ZVAL_STR(expr_copy, zend_string_copy(Z_STR_P(expr)));
281+
ZVAL_STR_COPY(expr_copy, Z_STR_P(expr));
282282
return 1;
283283
}
284284
goto again;

Zend/zend_builtin_functions.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ ZEND_FUNCTION(each)
660660

661661
/* add the key elements */
662662
if (zend_hash_get_current_key(target_hash, &key, &num_key, 0) == HASH_KEY_IS_STRING) {
663-
ZVAL_STR(&tmp, zend_string_copy(key));
663+
ZVAL_STR_COPY(&tmp, key);
664664
if (Z_REFCOUNTED(tmp)) Z_ADDREF(tmp);
665665
} else {
666666
ZVAL_LONG(&tmp, num_key);
@@ -1131,7 +1131,7 @@ ZEND_FUNCTION(get_class_methods)
11311131

11321132
/* Do not display old-style inherited constructors */
11331133
if (!key) {
1134-
ZVAL_STR(&method_name, zend_string_copy(mptr->common.function_name));
1134+
ZVAL_STR_COPY(&method_name, mptr->common.function_name);
11351135
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
11361136
} else if ((mptr->common.fn_flags & ZEND_ACC_CTOR) == 0 ||
11371137
mptr->common.scope == ce ||
@@ -1141,10 +1141,10 @@ ZEND_FUNCTION(get_class_methods)
11411141
*mptr->op_array.refcount > 1 &&
11421142
(len != key->len ||
11431143
!same_name(key->val, mptr->common.function_name->val, len))) {
1144-
ZVAL_STR(&method_name, zend_string_copy(zend_find_alias_name(mptr->common.scope, key)));
1144+
ZVAL_STR_COPY(&method_name, zend_find_alias_name(mptr->common.scope, key));
11451145
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
11461146
} else {
1147-
ZVAL_STR(&method_name, zend_string_copy(mptr->common.function_name));
1147+
ZVAL_STR_COPY(&method_name, mptr->common.function_name);
11481148
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &method_name);
11491149
}
11501150
}

Zend/zend_compile.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6528,7 +6528,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast TSRMLS_DC)
65286528
ZVAL_LONG(zv, CG(zend_lineno));
65296529
break;
65306530
case T_FILE:
6531-
ZVAL_STR(zv, zend_string_copy(CG(compiled_filename)));
6531+
ZVAL_STR_COPY(zv, CG(compiled_filename));
65326532
break;
65336533
case T_DIR:
65346534
{
@@ -6551,7 +6551,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast TSRMLS_DC)
65516551
}
65526552
case T_FUNC_C:
65536553
if (op_array && op_array->function_name) {
6554-
ZVAL_STR(zv, zend_string_copy(op_array->function_name));
6554+
ZVAL_STR_COPY(zv, op_array->function_name);
65556555
} else {
65566556
ZVAL_EMPTY_STRING(zv);
65576557
}
@@ -6562,10 +6562,10 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast TSRMLS_DC)
65626562
ZVAL_NEW_STR(zv, zend_concat3(ce->name->val, ce->name->len, "::", 2,
65636563
op_array->function_name->val, op_array->function_name->len));
65646564
} else {
6565-
ZVAL_STR(zv, zend_string_copy(ce->name));
6565+
ZVAL_STR_COPY(zv, ce->name);
65666566
}
65676567
} else if (op_array && op_array->function_name) {
6568-
ZVAL_STR(zv, zend_string_copy(op_array->function_name));
6568+
ZVAL_STR_COPY(zv, op_array->function_name);
65696569
} else {
65706570
ZVAL_EMPTY_STRING(zv);
65716571
}
@@ -6575,22 +6575,22 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast TSRMLS_DC)
65756575
if (ZEND_CE_IS_TRAIT(ce)) {
65766576
return 0;
65776577
} else {
6578-
ZVAL_STR(zv, zend_string_copy(ce->name));
6578+
ZVAL_STR_COPY(zv, ce->name);
65796579
}
65806580
} else {
65816581
ZVAL_EMPTY_STRING(zv);
65826582
}
65836583
break;
65846584
case T_TRAIT_C:
65856585
if (ce && ZEND_CE_IS_TRAIT(ce)) {
6586-
ZVAL_STR(zv, zend_string_copy(ce->name));
6586+
ZVAL_STR_COPY(zv, ce->name);
65876587
} else {
65886588
ZVAL_EMPTY_STRING(zv);
65896589
}
65906590
break;
65916591
case T_NS_C:
65926592
if (CG(current_namespace)) {
6593-
ZVAL_STR(zv, zend_string_copy(CG(current_namespace)));
6593+
ZVAL_STR_COPY(zv, CG(current_namespace));
65946594
} else {
65956595
ZVAL_EMPTY_STRING(zv);
65966596
}
@@ -7265,7 +7265,7 @@ void zend_compile_resolve_class_name(znode *result, zend_ast *ast TSRMLS_DC) /*
72657265
"Cannot access self::class when no class scope is active");
72667266
}
72677267
result->op_type = IS_CONST;
7268-
ZVAL_STR(&result->u.constant, zend_string_copy(CG(active_class_entry)->name));
7268+
ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name);
72697269
break;
72707270
case ZEND_FETCH_CLASS_STATIC:
72717271
case ZEND_FETCH_CLASS_PARENT:
@@ -7469,7 +7469,7 @@ void zend_compile_const_expr_resolve_class_name(zend_ast **ast_ptr TSRMLS_DC) /*
74697469
zend_error_noreturn(E_COMPILE_ERROR,
74707470
"Cannot access self::class when no class scope is active");
74717471
}
7472-
ZVAL_STR(&result, zend_string_copy(CG(active_class_entry)->name));
7472+
ZVAL_STR_COPY(&result, CG(active_class_entry)->name);
74737473
break;
74747474
case ZEND_FETCH_CLASS_STATIC:
74757475
case ZEND_FETCH_CLASS_PARENT:

Zend/zend_constants.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ static zend_constant *zend_get_special_constant(const char *name, uint name_len
246246
if ((c = zend_hash_find_ptr(EG(zend_constants), const_name)) == NULL) {
247247
c = emalloc(sizeof(zend_constant));
248248
memset(c, 0, sizeof(zend_constant));
249-
ZVAL_STR(&c->value, zend_string_copy(EG(scope)->name));
249+
ZVAL_STR_COPY(&c->value, EG(scope)->name);
250250
zend_hash_add_ptr(EG(zend_constants), const_name, c);
251251
}
252252
zend_string_release(const_name);

Zend/zend_execute_API.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,12 +1011,12 @@ ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *k
10111011
if (name->val[0] == '\\') {
10121012
ZVAL_STRINGL(&args[0], name->val + 1, name->len - 1);
10131013
} else {
1014-
ZVAL_STR(&args[0], zend_string_copy(name));
1014+
ZVAL_STR_COPY(&args[0], name);
10151015
}
10161016

10171017
fcall_info.size = sizeof(fcall_info);
10181018
fcall_info.function_table = EG(function_table);
1019-
ZVAL_STR(&fcall_info.function_name, zend_string_copy(EG(autoload_func)->common.function_name));
1019+
ZVAL_STR_COPY(&fcall_info.function_name, EG(autoload_func)->common.function_name);
10201020
fcall_info.symbol_table = NULL;
10211021
fcall_info.retval = &local_retval;
10221022
fcall_info.param_count = 1;

Zend/zend_hash.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,8 +1599,7 @@ ZEND_API void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key,
15991599
} else {
16001600
p = ht->arData + idx;
16011601
if (p->key) {
1602-
ZVAL_STR(key, p->key);
1603-
zend_string_addref(p->key);
1602+
ZVAL_STR_COPY(key, p->key);
16041603
} else {
16051604
ZVAL_LONG(key, p->h);
16061605
}

Zend/zend_types.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,10 +537,22 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
537537
zval *__z = (z); \
538538
zend_string *__s = (s); \
539539
Z_STR_P(__z) = __s; \
540-
/* interned strings support */ \
541540
Z_TYPE_INFO_P(__z) = IS_STRING_EX; \
542541
} while (0)
543542

543+
#define ZVAL_STR_COPY(z, s) do { \
544+
zval *__z = (z); \
545+
zend_string *__s = (s); \
546+
Z_STR_P(__z) = __s; \
547+
/* interned strings support */ \
548+
if (IS_INTERNED(__s)) { \
549+
Z_TYPE_INFO_P(__z) = IS_INTERNED_STRING_EX; \
550+
} else { \
551+
GC_REFCOUNT(__s)++; \
552+
Z_TYPE_INFO_P(__z) = IS_STRING_EX; \
553+
} \
554+
} while (0)
555+
544556
#define ZVAL_ARR(z, a) do { \
545557
zval *__z = (z); \
546558
Z_ARR_P(__z) = (a); \

Zend/zend_vm_def.h

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3883,8 +3883,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
38833883
ZVAL_DUP(EX_VAR(opline->result.var), value);
38843884
} else if (Z_STRLEN_P(opline->op2.zv) == sizeof("class")-1 && memcmp(Z_STRVAL_P(opline->op2.zv), "class", sizeof("class") - 1) == 0) {
38853885
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
3886-
ZVAL_STR(EX_VAR(opline->result.var), ce->name);
3887-
zend_string_addref(ce->name);
3886+
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
38883887
} else {
38893888
zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
38903889
}
@@ -4716,11 +4715,8 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
47164715
if (opline->extended_value & ZEND_FE_FETCH_WITH_KEY) {
47174716
if (!p->key) {
47184717
ZVAL_LONG(EX_VAR((opline+1)->result.var), p->h);
4719-
} else if (IS_INTERNED(p->key)) {
4720-
ZVAL_INTERNED_STR(EX_VAR((opline+1)->result.var), p->key);
47214718
} else {
4722-
ZVAL_NEW_STR(EX_VAR((opline+1)->result.var), p->key);
4723-
GC_REFCOUNT(p->key)++;
4719+
ZVAL_STR_COPY(EX_VAR((opline+1)->result.var), p->key);
47244720
}
47254721
}
47264722
break;
@@ -4796,12 +4792,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
47964792
} else if (zend_check_property_access(zobj, p->key TSRMLS_CC) == SUCCESS) {
47974793
if (opline->extended_value & ZEND_FE_FETCH_WITH_KEY) {
47984794
if (p->key->val[0]) {
4799-
if (IS_INTERNED(p->key)) {
4800-
ZVAL_INTERNED_STR(EX_VAR((opline+1)->result.var), p->key);
4801-
} else {
4802-
ZVAL_NEW_STR(EX_VAR((opline+1)->result.var), p->key);
4803-
GC_REFCOUNT(p->key)++;
4804-
}
4795+
ZVAL_STR_COPY(EX_VAR((opline+1)->result.var), p->key);
48054796
} else {
48064797
const char *class_name, *prop_name;
48074798
size_t prop_name_len;

Zend/zend_vm_execute.h

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4311,8 +4311,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCO
43114311
ZVAL_DUP(EX_VAR(opline->result.var), value);
43124312
} else if (Z_STRLEN_P(opline->op2.zv) == sizeof("class")-1 && memcmp(Z_STRVAL_P(opline->op2.zv), "class", sizeof("class") - 1) == 0) {
43134313
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
4314-
ZVAL_STR(EX_VAR(opline->result.var), ce->name);
4315-
zend_string_addref(ce->name);
4314+
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
43164315
} else {
43174316
zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
43184317
}
@@ -16676,11 +16675,8 @@ static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1667616675
if (opline->extended_value & ZEND_FE_FETCH_WITH_KEY) {
1667716676
if (!p->key) {
1667816677
ZVAL_LONG(EX_VAR((opline+1)->result.var), p->h);
16679-
} else if (IS_INTERNED(p->key)) {
16680-
ZVAL_INTERNED_STR(EX_VAR((opline+1)->result.var), p->key);
1668116678
} else {
16682-
ZVAL_NEW_STR(EX_VAR((opline+1)->result.var), p->key);
16683-
GC_REFCOUNT(p->key)++;
16679+
ZVAL_STR_COPY(EX_VAR((opline+1)->result.var), p->key);
1668416680
}
1668516681
}
1668616682
break;
@@ -16756,12 +16752,7 @@ static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1675616752
} else if (zend_check_property_access(zobj, p->key TSRMLS_CC) == SUCCESS) {
1675716753
if (opline->extended_value & ZEND_FE_FETCH_WITH_KEY) {
1675816754
if (p->key->val[0]) {
16759-
if (IS_INTERNED(p->key)) {
16760-
ZVAL_INTERNED_STR(EX_VAR((opline+1)->result.var), p->key);
16761-
} else {
16762-
ZVAL_NEW_STR(EX_VAR((opline+1)->result.var), p->key);
16763-
GC_REFCOUNT(p->key)++;
16764-
}
16755+
ZVAL_STR_COPY(EX_VAR((opline+1)->result.var), p->key);
1676516756
} else {
1676616757
const char *class_name, *prop_name;
1676716758
size_t prop_name_len;
@@ -18714,8 +18705,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE
1871418705
ZVAL_DUP(EX_VAR(opline->result.var), value);
1871518706
} else if (Z_STRLEN_P(opline->op2.zv) == sizeof("class")-1 && memcmp(Z_STRVAL_P(opline->op2.zv), "class", sizeof("class") - 1) == 0) {
1871618707
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
18717-
ZVAL_STR(EX_VAR(opline->result.var), ce->name);
18718-
zend_string_addref(ce->name);
18708+
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
1871918709
} else {
1872018710
zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
1872118711
}
@@ -27977,8 +27967,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPC
2797727967
ZVAL_DUP(EX_VAR(opline->result.var), value);
2797827968
} else if (Z_STRLEN_P(opline->op2.zv) == sizeof("class")-1 && memcmp(Z_STRVAL_P(opline->op2.zv), "class", sizeof("class") - 1) == 0) {
2797927969
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
27980-
ZVAL_STR(EX_VAR(opline->result.var), ce->name);
27981-
zend_string_addref(ce->name);
27970+
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
2798227971
} else {
2798327972
zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
2798427973
}

ext/com_dotnet/com_wrapper.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ static void generate_dispids(php_dispatchex *disp TSRMLS_DC)
482482
}
483483

484484
/* add the mappings */
485-
ZVAL_STR(&tmp2, zend_string_copy(name));
485+
ZVAL_STR_COPY(&tmp2, name);
486486
pid = zend_hash_next_free_element(disp->dispid_to_name);
487487
zend_hash_index_update(disp->dispid_to_name, pid, &tmp2);
488488

@@ -517,7 +517,7 @@ static void generate_dispids(php_dispatchex *disp TSRMLS_DC)
517517
}
518518

519519
/* add the mappings */
520-
ZVAL_STR(&tmp2, zend_string_copy(name));
520+
ZVAL_STR_COPY(&tmp2, name);
521521
pid = zend_hash_next_free_element(disp->dispid_to_name);
522522
zend_hash_index_update(disp->dispid_to_name, pid, &tmp2);
523523

0 commit comments

Comments
 (0)