static void xdebug_branch_find_path(unsigned int nr, xdebug_branch_info *branch_info, xdebug_path *prev_path) { unsigned int out0, out1, last; xdebug_path *new_path; int found = 0; if (branch_info->path_info.paths_count > 65535) { return; } new_path = xdebug_path_new(prev_path); xdebug_path_add(new_path, nr); out0 = branch_info->branches[nr].out[0]; out1 = branch_info->branches[nr].out[1]; last = xdebug_branch_find_last_element(new_path); if (out0 != 0 && out0 != XDEBUG_JMP_EXIT && !xdebug_path_exists(new_path, last, out0)) { xdebug_branch_find_path(out0, branch_info, new_path); found = 1; } if (out1 != 0 && out1 != XDEBUG_JMP_EXIT && !xdebug_path_exists(new_path, last, out1)) { xdebug_branch_find_path(out1, branch_info, new_path); found = 1; } if (!found) { xdebug_path_info_add_path(&(branch_info->path_info), new_path); } else { xdebug_path_free(new_path); } }
static void xdebug_branch_find_path(unsigned int nr, xdebug_branch_info *branch_info, xdebug_path *prev_path) { unsigned int last; xdebug_path *new_path; int found = 0; size_t i = 0; if (branch_info->path_info.paths_count > 4095) { return; } new_path = xdebug_path_new(prev_path); xdebug_path_add(new_path, nr); last = xdebug_branch_find_last_element(new_path); for (i = 0; i < branch_info->branches[nr].outs_count; i++) { int out = branch_info->branches[nr].outs[i]; if (out != 0 && out != XDEBUG_JMP_EXIT && !xdebug_path_exists(new_path, last, out)) { xdebug_branch_find_path(out, branch_info, new_path); found = 1; } } if (!found) { xdebug_path_info_add_path(&(branch_info->path_info), new_path); } else { xdebug_path_free(new_path); } }