aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/linux-gnu/x86_64/trace.c17
-rw-r--r--value.c20
-rw-r--r--value.h3
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;
}
diff --git a/value.c b/value.c
index d06de32..62466f2 100644
--- a/value.c
+++ b/value.c
@@ -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;
+}
diff --git a/value.h b/value.h
index c60a05f..1ba8a6c 100644
--- a/value.h
+++ b/value.h
@@ -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 */