diff options
author | Dmitry Stogov <dmitry@php.net> | 2007-11-22 09:02:55 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2007-11-22 09:02:55 +0000 |
commit | ea0a1c09e9b35401358306a768ad81dc2adbe0ab (patch) | |
tree | 39d8aba0f1c209c68fdc1a42ee33ae89c3dafdd4 /Zend/zend_compile.c | |
parent | 5d37d09c382e9cf5fc4a48d7fa50f384526a6549 (diff) | |
download | php-git-ea0a1c09e9b35401358306a768ad81dc2adbe0ab.tar.gz |
Speed-up of ZEND_DO_FCALL and ZEND_INIT_FCALL_BY_NAME by lowercasing and calculating hash values at compile time.
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r-- | Zend/zend_compile.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 761e56b3cc..84e1181e8c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1446,8 +1446,16 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_INIT_FCALL_BY_NAME; opline->op2 = *left_bracket; - opline->extended_value = 0; - SET_UNUSED(opline->op1); + if (opline->op2.op_type == IS_CONST) { + opline->op1.op_type = IS_CONST; + Z_TYPE(opline->op1.u.constant) = IS_STRING; + Z_STRVAL(opline->op1.u.constant) = zend_str_tolower_dup(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)); + Z_STRLEN(opline->op1.u.constant) = Z_STRLEN(opline->op2.u.constant); + opline->extended_value = zend_hash_func(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant) + 1); + } else { + opline->extended_value = 0; + SET_UNUSED(opline->op1); + } } zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *)); @@ -1474,19 +1482,42 @@ void zend_do_begin_dynamic_function_call(znode *function_name, int prefix_len TS zend_op *opline; opline = get_next_op(CG(active_op_array) TSRMLS_CC); - opline->opcode = ZEND_INIT_FCALL_BY_NAME; - opline->op2 = *function_name; - opline->extended_value = 0; if (prefix_len) { /* In run-time PHP will check for function with full name and internal function with short name */ + opline->opcode = ZEND_INIT_NS_FCALL_BY_NAME; + opline->op2 = *function_name; + opline->extended_value = 0; opline->op1.op_type = IS_CONST; - ZVAL_LONG(&opline->op1.u.constant, prefix_len); + Z_TYPE(opline->op1.u.constant) = IS_STRING; + Z_STRVAL(opline->op1.u.constant) = zend_str_tolower_dup(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)); + Z_STRLEN(opline->op1.u.constant) = Z_STRLEN(opline->op2.u.constant); + opline->extended_value = zend_hash_func(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant) + 1); + opline = get_next_op(CG(active_op_array) TSRMLS_CC); + opline->opcode = ZEND_OP_DATA; + opline->op1.op_type = IS_CONST; + Z_TYPE(opline->op1.u.constant) = IS_STRING; + Z_STRLEN(opline->op1.u.constant) = Z_STRLEN(function_name->u.constant) - prefix_len; + Z_STRVAL(opline->op1.u.constant) = zend_str_tolower_dup(Z_STRVAL(function_name->u.constant) + prefix_len, Z_STRLEN(opline->op1.u.constant)); + opline->extended_value = zend_hash_func(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant) + 1); } else { - SET_UNUSED(opline->op1); + opline->opcode = ZEND_INIT_FCALL_BY_NAME; + opline->op2 = *function_name; + if (opline->op2.op_type == IS_CONST) { + opline->op1.op_type = IS_CONST; + Z_TYPE(opline->op1.u.constant) = IS_STRING; + Z_STRVAL(opline->op1.u.constant) = zend_str_tolower_dup(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)); + Z_STRLEN(opline->op1.u.constant) = Z_STRLEN(opline->op2.u.constant); + opline->extended_value = zend_hash_func(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant) + 1); + } else { + opline->extended_value = 0; + SET_UNUSED(opline->op1); + } } + + zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *)); zend_do_extended_fcall_begin(TSRMLS_C); } @@ -1731,6 +1762,7 @@ void zend_do_end_function_call(znode *function_name, znode *result, znode *argum if (!is_method && !is_dynamic_fcall && function_name->op_type==IS_CONST) { opline->opcode = ZEND_DO_FCALL; opline->op1 = *function_name; + ZVAL_LONG(&opline->op2.u.constant, zend_hash_func(Z_STRVAL(function_name->u.constant), Z_STRLEN(function_name->u.constant) + 1)); } else { opline->opcode = ZEND_DO_FCALL_BY_NAME; SET_UNUSED(opline->op1); @@ -3654,6 +3686,7 @@ void zend_do_shell_exec(znode *result, znode *cmd TSRMLS_DC) opline->op1.op_type = IS_CONST; opline->extended_value = 1; SET_UNUSED(opline->op2); + ZVAL_LONG(&opline->op2.u.constant, zend_hash_func("shell_exec", sizeof("shell_exec"))); *result = opline->result; } |