static inline char *phpdbg_decode_op( zend_op_array *ops, const znode_op *op, uint32_t type) /* {{{ */ { char *decode = NULL; switch (type) { case IS_CV: { zend_string *var = ops->vars[EX_VAR_TO_NUM(op->var)]; spprintf(&decode, 0, "$%.*s%c", ZSTR_LEN(var) <= 19 ? (int) ZSTR_LEN(var) : 18, ZSTR_VAL(var), ZSTR_LEN(var) <= 19 ? 0 : '+'); } break; case IS_VAR: spprintf(&decode, 0, "@%u", EX_VAR_TO_NUM(op->var) - ops->last_var); break; case IS_TMP_VAR: spprintf(&decode, 0, "~%u", EX_VAR_TO_NUM(op->var) - ops->last_var); break; case IS_CONST: { zval *literal = RT_CONSTANT(ops, *op); decode = phpdbg_short_zval_print(literal, 20); } break; } return decode; } /* }}} */
static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t type, HashTable *vars) /* {{{ */ { char *decode = NULL; switch (type &~ EXT_TYPE_UNUSED) { case IS_CV: { zend_string *var = ops->vars[EX_VAR_TO_NUM(op->var)]; asprintf(&decode, "$%.*s%c", ZSTR_LEN(var) <= 19 ? (int) ZSTR_LEN(var) : 18, ZSTR_VAL(var), ZSTR_LEN(var) <= 19 ? 0 : '+'); } break; case IS_VAR: case IS_TMP_VAR: { zend_ulong id = 0, *pid = NULL; if (vars != NULL) { if ((pid = zend_hash_index_find_ptr(vars, (zend_ulong) ops->vars - op->var))) { id = *pid; } else { id = zend_hash_num_elements(vars); zend_hash_index_update_mem(vars, (zend_ulong) ops->vars - op->var, &id, sizeof(zend_ulong)); } } asprintf(&decode, "@" ZEND_ULONG_FMT, id); } break; case IS_CONST: { zval *literal = RT_CONSTANT(ops, *op); decode = phpdbg_short_zval_print(literal, 20); } break; } return decode; } /* }}} */
static inline void phpdbg_append_individual_arg(smart_str *s, uint32_t i, zend_function *func, zval *arg) { const zend_arg_info *arginfo = func->common.arg_info; char *arg_name = NULL; if (i) { smart_str_appends(s, ", "); } if (i < func->common.num_args) { if (arginfo) { if (func->type == ZEND_INTERNAL_FUNCTION) { arg_name = (char *) ((zend_internal_arg_info *) &arginfo[i])->name; } else { arg_name = ZSTR_VAL(arginfo[i].name); } } smart_str_appends(s, arg_name ? arg_name : "?"); smart_str_appendc(s, '='); } { char *arg_print = phpdbg_short_zval_print(arg, 40); smart_str_appends(s, arg_print); efree(arg_print); } }