[Ltrace-devel] [RFC 4/5] Maintain a 1-to-1 mapping between func params and arguments
edgar.iglesias at gmail.com
edgar.iglesias at gmail.com
Fri Oct 5 13:36:29 UTC 2012
From: "Edgar E. Iglesias" <edgar at axis.com>
When mapping function parameters into argument value dictionaries,
make sure to keep a 1-to-1 mapping between indexes.
For STOP parameters, we insert a ARGTYPE_NONE value to fill out
the argument value dictionary.
Mainting correct is important because the various param expressions
refer to eachother based on indexes.
Signed-off-by: Edgar E. Iglesias <edgar at axis.com>
---
lens_default.c | 7 +++++++
output.c | 25 ++++++++++++++++++++++---
2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/lens_default.c b/lens_default.c
index 81025b1..c39fce9 100644
--- a/lens_default.c
+++ b/lens_default.c
@@ -302,6 +302,9 @@ toplevel_format_lens(struct lens *lens, FILE *stream,
enum int_fmt_t int_fmt)
{
switch (value->type->type) {
+ case ARGTYPE_NONE:
+ return 0;
+
case ARGTYPE_VOID:
return fprintf(stream, "<void>");
@@ -406,6 +409,8 @@ bool_lens_format_cb(struct lens *lens, FILE *stream,
struct value *value, struct value_dict *arguments)
{
switch (value->type->type) {
+ case ARGTYPE_NONE:
+ return 0;
case ARGTYPE_VOID:
case ARGTYPE_FLOAT:
case ARGTYPE_DOUBLE:
@@ -490,6 +495,8 @@ string_lens_format_cb(struct lens *lens, FILE *stream,
return format_array(stream, value, arguments,
value->type->u.array_info.length,
options.strlen, 0, "\"", "\"", "");
+ case ARGTYPE_NONE:
+ return 0;
}
abort();
}
diff --git a/output.c b/output.c
index 8e4e616..d861537 100644
--- a/output.c
+++ b/output.c
@@ -292,6 +292,17 @@ fetch_param_stop(struct value_dict *arguments, ssize_t *params_leftp)
{
if (*params_leftp == -1)
*params_leftp = val_dict_count(arguments);
+
+ /* Insert a dummy arg to make sure expression indexes match. */
+ struct value none_val;
+ struct arg_type_info *none_type = type_get_simple(ARGTYPE_NONE);
+
+ value_init_detached(&none_val, NULL, none_type, 0);
+
+ if (val_dict_push_next(arguments, &none_val) < 0) {
+ value_destroy(&none_val);
+ return;
+ }
}
static int
@@ -408,13 +419,21 @@ output_params(struct value_dict *arguments, size_t start, size_t end,
size_t i;
int need_delim = *need_delimp;
for (i = start; i < end; ++i) {
- if (need_delim
+ int output_val = 1;
+ struct value *value = val_dict_get_num(arguments, i);
+
+ if (value->type->type == ARGTYPE_NONE)
+ output_val = 0;
+
+ if (need_delim && output_val
&& account_output(fprintf(options.output, ", ")) < 0)
return -1;
- struct value *value = val_dict_get_num(arguments, i);
if (value == NULL)
return -1;
- need_delim = output_one(value, arguments);
+
+ if (output_val)
+ need_delim = output_one(value, arguments);
+
if (need_delim < 0)
return -1;
}
--
1.7.8.6
More information about the Ltrace-devel
mailing list