Skip to content

Commit

Permalink
helper/command: pass command arguments also as Jim_Obj
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/8057
Tested-by: jenkins
  • Loading branch information
borneoa committed Jan 13, 2024
1 parent f857db9 commit e680841
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 0 deletions.
2 changes: 2 additions & 0 deletions doc/manual/helper.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions src/helper/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions src/helper/command.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ struct command_invocation {
const char *name;
unsigned argc;
const char **argv;
Jim_Obj * const *jimtcl_argv;
Jim_Obj *output;
};

Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit e680841

Please sign in to comment.