Browse Source

Make zend_str_tolower_copy() a copy function (like stccpy).

Supply a dup version (like estrdup).
Fix tolower() handling.
# Havin copy and dup allows to use the faster version even with
# memory not allocated by emalloc.
migration/unlabaled-1.3.2
Marcus Boerger 24 years ago
parent
commit
7af8eadd57
  1. 6
      Zend/zend_API.c
  2. 6
      Zend/zend_execute.c
  3. 4
      Zend/zend_execute_API.c
  4. 23
      Zend/zend_operators.c
  5. 9
      Zend/zend_operators.h

6
Zend/zend_API.c

@ -1541,7 +1541,7 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl
if (syntax_only)
return 1;
lcname = zend_str_tolower_copy(Z_STRVAL_P(callable), Z_STRLEN_P(callable));
lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), Z_STRLEN_P(callable));
if (zend_hash_exists(EG(function_table), lcname, Z_STRLEN_P(callable)+1))
retval = 1;
efree(lcname);
@ -1576,7 +1576,7 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl
if (syntax_only)
return 1;
lcname = zend_str_tolower_copy(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj));
lcname = zend_str_tolower_dup(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj));
if (zend_lookup_class(lcname, Z_STRLEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) {
ce = *pce;
}
@ -1602,7 +1602,7 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl
}
if (ce) {
lcname = zend_str_tolower_copy(Z_STRVAL_PP(method), Z_STRLEN_PP(method));
lcname = zend_str_tolower_dup(Z_STRVAL_PP(method), Z_STRLEN_PP(method));
if (zend_hash_exists(&ce->function_table, lcname, Z_STRLEN_PP(method)+1))
retval = 1;
efree(lcname);

6
Zend/zend_execute.c

@ -2365,7 +2365,7 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS)
if (class_name->type == IS_OBJECT) {
ce = Z_OBJCE_P(class_name);
} else {
class_name_strval = zend_str_tolower_copy(class_name->value.str.val, class_name->value.str.len);
class_name_strval = zend_str_tolower_dup(class_name->value.str.val, class_name->value.str.len);
class_name_strlen = class_name->value.str.len;
}
}
@ -2518,7 +2518,7 @@ int zend_init_static_method_call_handler(ZEND_OPCODE_HANDLER_ARGS)
} else {
function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
function_name_strval = zend_str_tolower_copy(function_name->value.str.val, function_name->value.str.len);
function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
function_name_strlen = function_name->value.str.len;
}
@ -2566,7 +2566,7 @@ int zend_init_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS)
} else {
function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
function_name_strval = zend_str_tolower_copy(function_name->value.str.val, function_name->value.str.len);
function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
function_name_strlen = function_name->value.str.len;
}

4
Zend/zend_execute_API.c

@ -595,7 +595,7 @@ int fast_call_user_function(HashTable *function_table, zval **object_pp, zval *f
char *lc_class;
int found;
lc_class = zend_str_tolower_copy(Z_STRVAL_PP(object_pp), Z_STRLEN_PP(object_pp));
lc_class = zend_str_tolower_dup(Z_STRVAL_PP(object_pp), Z_STRLEN_PP(object_pp));
found = zend_lookup_class(lc_class, Z_STRLEN_PP(object_pp), &ce TSRMLS_CC);
efree(lc_class);
if (found == FAILURE)
@ -612,7 +612,7 @@ int fast_call_user_function(HashTable *function_table, zval **object_pp, zval *f
return FAILURE;
}
function_name_lc = zend_str_tolower_copy(function_name->value.str.val, function_name->value.str.len);
function_name_lc = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
original_function_state_ptr = EG(function_state_ptr);
if (zend_hash_find(function_table, function_name_lc, function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {

23
Zend/zend_operators.c

@ -1581,30 +1581,27 @@ ZEND_API int zval_is_true(zval *op)
return (op->value.lval ? 1 : 0);
}
ZEND_API char *zend_str_tolower_copy(char *p, unsigned int length)
ZEND_API char *zend_str_tolower_copy(char *source, char *dest, unsigned int length)
{
register char *result;
register char *end = p + length;
char *start;
register unsigned char *str = (unsigned char*)source;
register unsigned char *result = dest;
register unsigned char *end = str + length;
result = emalloc(length+1);
start = result;
while (p < end) {
*result++ = tolower(*p++);
while (str < end) {
*result++ = tolower((int)*str++);
}
*result = *end;
return start;
return dest;
}
ZEND_API void zend_str_tolower(char *str, unsigned int length)
{
register char *p=str;
register char *end = str + length;
register unsigned char *p = (unsigned char*)str;
register unsigned char *end = p + length;
while (p < end) {
*p = tolower(*p);
*p = tolower((int)*p);
p++;
}
}

9
Zend/zend_operators.h

@ -197,7 +197,14 @@ ZEND_API int numeric_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_
ZEND_API int string_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
ZEND_API void zend_str_tolower(char *str, unsigned int length);
ZEND_API char *zend_str_tolower_copy(char *str, unsigned int length);
ZEND_API char *zend_str_tolower_copy(char *source, char *dest, unsigned int length);
static inline char *
zend_str_tolower_dup(char *source, unsigned int length)
{
return zend_str_tolower_copy(source, emalloc(length+1), length);
}
ZEND_API int zend_binary_zval_strcmp(zval *s1, zval *s2);
ZEND_API int zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3);
ZEND_API int zend_binary_zval_strcasecmp(zval *s1, zval *s2);

Loading…
Cancel
Save