diff options
author | Antonio Borneo <borneo.antonio@gmail.com> | 2023-08-06 12:38:54 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2024-01-13 14:44:32 +0000 |
commit | e680841fd276439844ecf340f4005860d6e22582 (patch) | |
tree | d2c4679d8098b63d0b90bb12d041d8c251c30699 /src | |
parent | f857db98bd2a3d97ada208a8137c48c47e9d3a78 (diff) | |
download | riscv-openocd-e680841fd276439844ecf340f4005860d6e22582.zip riscv-openocd-e680841fd276439844ecf340f4005860d6e22582.tar.gz riscv-openocd-e680841fd276439844ecf340f4005860d6e22582.tar.bz2 |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/helper/command.c | 1 | ||||
-rw-r--r-- | src/helper/command.h | 6 |
2 files changed, 7 insertions, 0 deletions
diff --git a/src/helper/command.c b/src/helper/command.c index 57db2ad..a775c73 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -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); diff --git a/src/helper/command.h b/src/helper/command.h index 42cb9cb..dc45070 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -79,6 +79,7 @@ struct command_invocation { const char *name; unsigned argc; const char **argv; + Jim_Obj * const *jimtcl_argv; Jim_Obj *output; }; @@ -154,6 +155,11 @@ void *jimcmd_privdata(Jim_Cmd *cmd); */ #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. */ |