helper/command: pass command arguments also as Jim_Obj
Some OpenOCD command gets fragment of TCL scripts as command-line argument, fragments that will be kept and executed later on. E.g. the command 'configure' gets the body of an OpenOCD event: $TARGET configure -event halted {TCL code} These commands store the argument as a Jim_Obj and pass it to the jimtcl interpreter when the TCL fragment has to be executed. Using Jim_Obj as storage is relevant to let the jimtcl interpreter to recover extra info of the TCL fragment, like the file-name and the line-number that contain the fragment, that will be printed out in case of run-time errors. While converting the commands to COMMAND_HANDLER, we should avoid storing the argument as C strings otherwise we will loose precious info in case of run-time errors making challenging the debugging of such TCL fragments. Extend the struct command_invocation to contain the array that points to the Jim_Obj of the command arguments. This will be used while converting commands to COMMAND_HANDLER. Change-Id: If37c5f20e9a71349f77ba1571baf1e6778e28aa5 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/8057 Tested-by: jenkins
This commit is contained in:
parent
350f5c3547
commit
a47fae7934
|
@ -79,6 +79,8 @@ command handlers and helpers:
|
|||
- @c CMD_NAME - invoked command name
|
||||
- @c CMD_ARGC - the number of command arguments
|
||||
- @c CMD_ARGV - array of command argument strings
|
||||
- @c CMD_JIMTCL_ARGV - array containing the Jim_Obj equivalent of command
|
||||
argument in @c CMD_ARGV.
|
||||
|
||||
@section helpercmdregister Command Registration
|
||||
|
||||
|
|
|
@ -511,6 +511,7 @@ static int exec_command(Jim_Interp *interp, struct command_context *context,
|
|||
.name = c->name,
|
||||
.argc = argc - 1,
|
||||
.argv = words + 1,
|
||||
.jimtcl_argv = argv + 1,
|
||||
};
|
||||
|
||||
cmd.output = Jim_NewEmptyStringObj(context->interp);
|
||||
|
|
|
@ -79,6 +79,7 @@ struct command_invocation {
|
|||
const char *name;
|
||||
unsigned argc;
|
||||
const char **argv;
|
||||
Jim_Obj * const *jimtcl_argv;
|
||||
Jim_Obj *output;
|
||||
};
|
||||
|
||||
|
@ -153,6 +154,11 @@ void *jimcmd_privdata(Jim_Cmd *cmd);
|
|||
* rather than accessing the variable directly. It may be moved.
|
||||
*/
|
||||
#define CMD_ARGV (cmd->argv)
|
||||
/**
|
||||
* Use this macro to access the jimtcl arguments for the command being
|
||||
* handled, rather than accessing the variable directly. It may be moved.
|
||||
*/
|
||||
#define CMD_JIMTCL_ARGV (cmd->jimtcl_argv)
|
||||
/**
|
||||
* Use this macro to access the name of the command being handled,
|
||||
* rather than accessing the variable directly. It may be moved.
|
||||
|
|
Loading…
Reference in New Issue