diff --git a/src/helper/command.c b/src/helper/command.c index e2726f258..b44e4667f 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -248,7 +248,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { /* the private data is stashed in the interp structure */ - struct command *c = interp->cmdPrivData; + struct command *c = jim_to_command(interp); assert(c); script_debug(interp, argc, argv); return script_command_run(interp, argc, argv, c); @@ -418,7 +418,7 @@ static struct command *register_command(struct command_context *context, int retval = JIM_OK; if (NULL != cr->jim_handler && NULL == parent) { retval = Jim_CreateCommand(context->interp, cr->name, - cr->jim_handler, NULL, NULL); + cr->jim_handler, c, NULL); } else if (NULL != cr->handler || NULL != parent) retval = register_command_handler(context, command_root(c)); @@ -501,8 +501,7 @@ static int unregister_command(struct command_context *context, void command_set_handler_data(struct command *c, void *p) { - if (NULL != c->handler || NULL != c->jim_handler) - c->jim_handler_data = p; + c->jim_handler_data = p; for (struct command *cc = c->children; NULL != cc; cc = cc->next) command_set_handler_data(cc, p); } @@ -1085,7 +1084,6 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv) if (!command_can_run(cmd_ctx, c)) return JIM_ERR; - interp->cmdPrivData = c->jim_handler_data; return (*c->jim_handler)(interp, count, start); } diff --git a/src/helper/command.h b/src/helper/command.h index b0c84bb43..cb088d743 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -195,6 +195,15 @@ struct command { struct command *next; }; +/* + * Return the struct command pointer kept in private data + * Used to enforce check on data type + */ +static inline struct command *jim_to_command(Jim_Interp *interp) +{ + return Jim_CmdPrivData(interp); +} + /* * Commands should be registered by filling in one or more of these * structures and passing them to [un]register_commands(). diff --git a/src/target/arm_tpiu_swo.c b/src/target/arm_tpiu_swo.c index 2da52e892..543b4f008 100644 --- a/src/target/arm_tpiu_swo.c +++ b/src/target/arm_tpiu_swo.c @@ -559,7 +559,8 @@ static int jim_arm_tpiu_swo_configure(Jim_Interp *interp, int argc, Jim_Obj * co "missing: -option ..."); return JIM_ERR; } - struct arm_tpiu_swo_object *obj = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct arm_tpiu_swo_object *obj = c->jim_handler_data; return arm_tpiu_swo_configure(&goi, obj); } @@ -583,7 +584,8 @@ static int wrap_read_u32(struct target *target, struct adiv5_ap *tpiu_ap, static int jim_arm_tpiu_swo_enable(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - struct arm_tpiu_swo_object *obj = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct arm_tpiu_swo_object *obj = c->jim_handler_data; struct command_context *cmd_ctx = current_command_context(interp); struct adiv5_ap *tpiu_ap = dap_ap(obj->spot.dap, obj->spot.ap_num); uint32_t value; @@ -786,7 +788,8 @@ error_exit: static int jim_arm_tpiu_swo_disable(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - struct arm_tpiu_swo_object *obj = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct arm_tpiu_swo_object *obj = c->jim_handler_data; if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, "Too many parameters"); diff --git a/src/target/nds32_cmd.c b/src/target/nds32_cmd.c index 1684ea882..89da845d3 100644 --- a/src/target/nds32_cmd.c +++ b/src/target/nds32_cmd.c @@ -722,7 +722,8 @@ static int jim_nds32_bulk_write(Jim_Interp *interp, int argc, Jim_Obj * const *a return JIM_ERR; } - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; int result; result = target_write_buffer(target, address, count * 4, (const uint8_t *)data); @@ -751,7 +752,8 @@ static int jim_nds32_multi_write(Jim_Interp *interp, int argc, Jim_Obj * const * if (e != JIM_OK) return e; - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; struct aice_port_s *aice = target_to_aice(target); int result; uint32_t address; @@ -812,7 +814,8 @@ static int jim_nds32_bulk_read(Jim_Interp *interp, int argc, Jim_Obj * const *ar if (goi.argc != 0) return JIM_ERR; - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; uint32_t *data = malloc(count * sizeof(uint32_t)); int result; result = target_read_buffer(target, address, count * 4, (uint8_t *)data); @@ -863,7 +866,8 @@ static int jim_nds32_read_edm_sr(Jim_Interp *interp, int argc, Jim_Obj * const * else return ERROR_FAIL; - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; struct aice_port_s *aice = target_to_aice(target); char data_str[11]; @@ -911,7 +915,8 @@ static int jim_nds32_write_edm_sr(Jim_Interp *interp, int argc, Jim_Obj * const else return ERROR_FAIL; - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; struct aice_port_s *aice = target_to_aice(target); aice_write_debug_reg(aice, edm_sr_number, value); diff --git a/src/target/target.c b/src/target/target.c index 200368b13..e481d526c 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -5206,21 +5206,24 @@ static int jim_target_configure(Jim_Interp *interp, int argc, Jim_Obj * const *a "missing: -option ..."); return JIM_ERR; } - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; return target_configure(&goi, target); } static int jim_target_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; return target_mem2array(interp, target, argc - 1, argv + 1); } static int jim_target_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; return target_array2mem(interp, target, argc - 1, argv + 1); } @@ -5252,7 +5255,8 @@ static int jim_target_examine(Jim_Interp *interp, int argc, Jim_Obj *const *argv allow_defer = true; } - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; if (!target->tap->enabled) return jim_target_tap_disabled(interp); @@ -5270,7 +5274,8 @@ static int jim_target_examine(Jim_Interp *interp, int argc, Jim_Obj *const *argv static int jim_target_was_examined(Jim_Interp *interp, int argc, Jim_Obj * const *argv) { - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; Jim_SetResultBool(interp, target_was_examined(target)); return JIM_OK; @@ -5278,7 +5283,8 @@ static int jim_target_was_examined(Jim_Interp *interp, int argc, Jim_Obj * const static int jim_target_examine_deferred(Jim_Interp *interp, int argc, Jim_Obj * const *argv) { - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; Jim_SetResultBool(interp, target->defer_examine); return JIM_OK; @@ -5290,7 +5296,8 @@ static int jim_target_halt_gdb(Jim_Interp *interp, int argc, Jim_Obj *const *arg Jim_WrongNumArgs(interp, 1, argv, "[no parameters]"); return JIM_ERR; } - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; if (target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT) != ERROR_OK) return JIM_ERR; @@ -5304,7 +5311,8 @@ static int jim_target_poll(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_WrongNumArgs(interp, 1, argv, "[no parameters]"); return JIM_ERR; } - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; if (!target->tap->enabled) return jim_target_tap_disabled(interp); @@ -5341,7 +5349,8 @@ static int jim_target_reset(Jim_Interp *interp, int argc, Jim_Obj *const *argv) if (e != JIM_OK) return e; - struct target *target = Jim_CmdPrivData(goi.interp); + struct command *c = jim_to_command(goi.interp); + struct target *target = c->jim_handler_data; if (!target->tap->enabled) return jim_target_tap_disabled(interp); @@ -5374,7 +5383,8 @@ static int jim_target_halt(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_WrongNumArgs(interp, 1, argv, "[no parameters]"); return JIM_ERR; } - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; if (!target->tap->enabled) return jim_target_tap_disabled(interp); int e = target->type->halt(target); @@ -5404,7 +5414,8 @@ static int jim_target_wait_state(Jim_Interp *interp, int argc, Jim_Obj *const *a e = Jim_GetOpt_Wide(&goi, &a); if (e != JIM_OK) return e; - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; if (!target->tap->enabled) return jim_target_tap_disabled(interp); @@ -5448,7 +5459,8 @@ static int jim_target_current_state(Jim_Interp *interp, int argc, Jim_Obj *const Jim_WrongNumArgs(interp, 1, argv, "[no parameters]"); return JIM_ERR; } - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; Jim_SetResultString(interp, target_state_name(target), -1); return JIM_OK; } @@ -5467,7 +5479,8 @@ static int jim_target_invoke_event(Jim_Interp *interp, int argc, Jim_Obj *const Jim_GetOpt_NvpUnknown(&goi, nvp_target_event, 1); return e; } - struct target *target = Jim_CmdPrivData(interp); + struct command *c = jim_to_command(interp); + struct target *target = c->jim_handler_data; target_handle_event(target, n->value); return JIM_OK; }