static RegisterDefinition * find_register(Context * ctx, const char * name) { RegisterDefinition * defs = get_reg_definitions(ctx); if (defs == NULL) return NULL; while (defs->name != NULL) { if (stricmp(defs->name, name) == 0) return defs; defs++; } return NULL; }
const char * register2id(Context * ctx, int frame, RegisterDefinition * reg) { static char id[256]; RegisterDefinition * defs = get_reg_definitions(ctx); if (frame < 0) { snprintf(id, sizeof(id), "R%d.%s", (int)(reg - defs), ctx->id); } else { snprintf(id, sizeof(id), "R%d@%d.%s", (int)(reg - defs), frame, ctx->id); } return id; }
static void command_get_children_cache_client(void * x) { GetChildrenArgs * args = (GetChildrenArgs *)x; Channel * c = cache_channel(); Context * ctx = NULL; int frame = STACK_NO_FRAME; StackFrame * frame_info = NULL; RegisterDefinition * defs = NULL; RegisterDefinition * parent = NULL; Trap trap; if (set_trap(&trap)) { if (id2register(args->id, &ctx, &frame, &parent) == 0) { if (frame != STACK_TOP_FRAME && get_frame_info(ctx, frame, &frame_info) < 0) exception(errno); } else if (id2frame(args->id, &ctx, &frame) == 0) { if (get_frame_info(ctx, frame, &frame_info) < 0) exception(errno); } else { ctx = id2ctx(args->id); frame = STACK_TOP_FRAME; } if (ctx != NULL) defs = get_reg_definitions(ctx); clear_trap(&trap); } cache_exit(); write_stringz(&c->out, "R"); write_stringz(&c->out, args->token); write_errno(&c->out, trap.error); write_stream(&c->out, '['); if (defs != NULL) { int cnt = 0; RegisterDefinition * reg_def; for (reg_def = defs; reg_def->name != NULL; reg_def++) { if (reg_def->parent != parent) continue; if (frame < 0 || frame_info->is_top_frame || reg_def->size == 0 || read_reg_value(frame_info, reg_def, NULL) == 0) { if (cnt > 0) write_stream(&c->out, ','); json_write_string(&c->out, register2id(ctx, frame, reg_def)); cnt++; } } } write_stream(&c->out, ']'); write_stream(&c->out, 0); write_stream(&c->out, MARKER_EOM); }
int id2register(const char * id, Context ** ctx, int * frame, RegisterDefinition ** reg_def) { int r = 0; *ctx = NULL; *frame = STACK_TOP_FRAME; *reg_def = NULL; if (*id++ != 'R') { errno = ERR_INV_CONTEXT; return -1; } while (*id != '.' && *id != '@') { if (*id >= '0' && *id <= '9') { r = r * 10 + (*id++ - '0'); } else { errno = ERR_INV_CONTEXT; return -1; } } if (*id == '@') { int n = 0; id++; while (*id != '.') { if (*id >= '0' && *id <= '9') { n = n * 10 + (*id++ - '0'); } else { errno = ERR_INV_CONTEXT; return -1; } } *frame = n; } id++; *ctx = id2ctx(id); if (*ctx == NULL) { errno = ERR_INV_CONTEXT; return -1; } if ((*ctx)->exited) { errno = ERR_ALREADY_EXITED; return -1; } *reg_def = get_reg_definitions(*ctx) + r; return 0; }