diff options
author | Dmitry Stogov <dmitry@php.net> | 2010-04-20 11:05:54 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2010-04-20 11:05:54 +0000 |
commit | dd5c478be61a0ef94b54837cfa875c964356e14f (patch) | |
tree | afdce3c072b3c27f7721c6f24895a147a9f825b4 /Zend/zend_constants.c | |
parent | 94dd83722b57c4613ccf8371a3c4f50ffc274584 (diff) | |
download | php-git-dd5c478be61a0ef94b54837cfa875c964356e14f.tar.gz |
Added concept of interned strings. All strings constants known at compile time are allocated in a single copy and never changed.
Diffstat (limited to 'Zend/zend_constants.c')
-rw-r--r-- | Zend/zend_constants.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 0543903e84..1743ffd2a8 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -32,13 +32,15 @@ void free_zend_constant(zend_constant *c) if (!(c->flags & CONST_PERSISTENT)) { zval_dtor(&c->value); } - free(c->name); + str_free(c->name); } void copy_zend_constant(zend_constant *c) { - c->name = zend_strndup(c->name, c->name_len - 1); + if (!IS_INTERNED(c->name)) { + c->name = zend_strndup(c->name, c->name_len - 1); + } if (!(c->flags & CONST_PERSISTENT)) { zval_copy_ctor(&c->value); } @@ -422,12 +424,14 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC) /* keep in mind that c->name_len already contains the '\0' */ lowercase_name = estrndup(c->name, c->name_len-1); zend_str_tolower(lowercase_name, c->name_len-1); + lowercase_name = CG(new_interned_string)(lowercase_name, c->name_len, 1 TSRMLS_CC); name = lowercase_name; } else { char *slash = strrchr(c->name, '\\'); if(slash) { lowercase_name = estrndup(c->name, c->name_len-1); zend_str_tolower(lowercase_name, slash-c->name); + lowercase_name = CG(new_interned_string)(lowercase_name, c->name_len, 1 TSRMLS_CC); name = lowercase_name; } else { name = c->name; @@ -437,13 +441,13 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC) if ((strncmp(name, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) || zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) { zend_error(E_NOTICE,"Constant %s already defined", name); - free(c->name); + str_free(c->name); if (!(c->flags & CONST_PERSISTENT)) { zval_dtor(&c->value); } ret = FAILURE; } - if (lowercase_name) { + if (lowercase_name && !IS_INTERNED(lowercase_name)) { efree(lowercase_name); } return ret; |