diff options
-rw-r--r-- | sysdeps/linux-gnu/x86_64/trace.c | 17 | ||||
-rw-r--r-- | value.c | 20 | ||||
-rw-r--r-- | value.h | 3 |
3 files changed, 26 insertions, 14 deletions
diff --git a/sysdeps/linux-gnu/x86_64/trace.c b/sysdeps/linux-gnu/x86_64/trace.c index bb4d67f..e82adb9 100644 --- a/sysdeps/linux-gnu/x86_64/trace.c +++ b/sysdeps/linux-gnu/x86_64/trace.c @@ -1,6 +1,6 @@ /* * This file is part of ltrace. - * Copyright (C) 2010,2011 Petr Machata + * Copyright (C) 2010,2011,2012 Petr Machata * Copyright (C) 2004,2008,2009 Juan Cespedes * Copyright (C) 2006 Ian Wienand * @@ -501,19 +501,8 @@ classify(Process *proc, struct fetch_context *context, static ssize_t pass_by_reference(struct value *valuep, enum arg_class classes[]) { - if (valuep != NULL) { - struct arg_type_info *new_info - = calloc(sizeof(*new_info), 1); - if (new_info == NULL) - return -1; - - int own; - struct arg_type_info *orig; - value_take_type(valuep, &orig, &own); - type_init_pointer(new_info, orig, own); - new_info->lens = orig->lens; - value_set_type(valuep, new_info, 1); - } + if (valuep != NULL && value_pass_by_reference(valuep) < 0) + return -1; classes[0] = CLASS_INTEGER; return 1; } @@ -433,3 +433,23 @@ value_is_zero(struct value *val, struct value_dict *arguments) } return zero; } + +int +value_pass_by_reference(struct value *value) +{ + assert(value != NULL); + assert(value->type->type == ARGTYPE_STRUCT); + + struct arg_type_info *new_info = calloc(sizeof(*new_info), 1); + if (new_info == NULL) + return -1; + + int own; + struct arg_type_info *orig; + value_take_type(value, &orig, &own); + type_init_pointer(new_info, orig, own); + new_info->lens = orig->lens; + value_set_type(value, new_info, 1); + + return 0; +} @@ -149,4 +149,7 @@ struct value *value_get_parental_struct(struct value *val); * if it isn't, <0 on error. */ int value_is_zero(struct value *val, struct value_dict *arguments); +/* Convert a structure type to pointer to that structure type. */ +int value_pass_by_reference(struct value *value); + #endif /* VALUE_H */ |