int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name) { int i = 0; zend_ulong hash_value = zend_string_hash_val(name); while (i < op_array->last_var) { if (op_array->vars[i] == name || (ZSTR_H(op_array->vars[i]) == hash_value && ZSTR_LEN(op_array->vars[i]) == ZSTR_LEN(name) && memcmp(ZSTR_VAL(op_array->vars[i]), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)) { return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); } i++; } i = op_array->last_var; op_array->last_var++; op_array->vars = erealloc(op_array->vars, op_array->last_var * sizeof(zend_string*)); op_array->vars[i] = zend_string_dup(name, 0); /* all IS_TMP_VAR and IS_VAR variable numbers have to be adjusted */ { zend_op *opline = op_array->opcodes; zend_op *end = opline + op_array->last; while (opline < end) { if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { opline->op1.var += sizeof(zval); } if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) { opline->op2.var += sizeof(zval); } if (opline->result_type & (IS_TMP_VAR|IS_VAR)) { opline->result.var += sizeof(zval); } if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS || opline->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS || opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) { opline->extended_value += sizeof(zval); } opline++; } } return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); }
zend_string *phpdbg_compile_stackframe(zend_execute_data *ex) { smart_str s = {0}; zend_op_array *op_array = &ex->func->op_array; uint32_t i = 0, first_extra_arg = op_array->num_args, num_args = ZEND_CALL_NUM_ARGS(ex); zval *p = ZEND_CALL_ARG(ex, 1); if (op_array->scope) { smart_str_append(&s, op_array->scope->name); smart_str_appends(&s, "::"); } smart_str_append(&s, op_array->function_name); smart_str_appendc(&s, '('); if (ZEND_CALL_NUM_ARGS(ex) > first_extra_arg) { while (i < first_extra_arg) { phpdbg_append_individual_arg(&s, i, ex->func, p); p++; i++; } p = ZEND_CALL_VAR_NUM(ex, op_array->last_var + op_array->T); } while (i < num_args) { phpdbg_append_individual_arg(&s, i, ex->func, p); p++; i++; } smart_str_appendc(&s, ')'); if (ex->func->type == ZEND_USER_FUNCTION) { smart_str_appends(&s, " at "); smart_str_append(&s, op_array->filename); smart_str_appendc(&s, ':'); smart_str_append_unsigned(&s, ex->opline->lineno); } else { smart_str_appends(&s, " [internal function]"); } return s.s; }