[SATYR PATCHv2 4/7] Type-agnostic JSON deserialization
Martin Milata
mmilata at redhat.com
Mon Aug 26 13:35:27 UTC 2013
Signed-off-by: Martin Milata <mmilata at redhat.com>
---
include/stacktrace.h | 14 ++++++++++++++
lib/core_stacktrace.c | 1 +
lib/gdb_stacktrace.c | 9 +++++++++
lib/generic_stacktrace.c | 25 +++++++++++++++++++++++++
lib/generic_stacktrace.h | 6 +++++-
lib/java_stacktrace.c | 1 +
lib/koops_stacktrace.c | 1 +
lib/python_stacktrace.c | 1 +
8 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/include/stacktrace.h b/include/stacktrace.h
index 13152a0..8009fc1 100644
--- a/include/stacktrace.h
+++ b/include/stacktrace.h
@@ -37,6 +37,8 @@ extern "C" {
#include "report_type.h"
+struct sr_json_value;
+
struct sr_stacktrace
{
enum sr_report_type type;
@@ -94,6 +96,18 @@ char *
sr_stacktrace_to_json(struct sr_stacktrace *stacktrace);
/**
+ * Deserialize stacktrace from its json representation.
+ */
+struct sr_stacktrace*
+sr_stacktrace_from_json(enum sr_report_type, struct sr_json_value *root, char **error_message);
+
+/**
+ * Deserialize stacktrace from its json representation.
+ */
+struct sr_stacktrace*
+sr_stacktrace_from_json_text(enum sr_report_type, const char *input, char **error_message);
+
+/**
* Returns brief, human-readable explanation of the stacktrace.
*/
char *
diff --git a/lib/core_stacktrace.c b/lib/core_stacktrace.c
index de40085..0e1bca1 100644
--- a/lib/core_stacktrace.c
+++ b/lib/core_stacktrace.c
@@ -54,6 +54,7 @@ struct stacktrace_methods core_stacktrace_methods =
.parse_location = (parse_location_fn_t) NULL,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_core_stacktrace_to_json,
+ .from_json = (from_json_fn_t) sr_core_stacktrace_from_json,
.get_reason = (get_reason_fn_t) sr_core_stacktrace_get_reason,
.find_crash_thread =
(find_crash_thread_fn_t) sr_core_stacktrace_find_crash_thread,
diff --git a/lib/gdb_stacktrace.c b/lib/gdb_stacktrace.c
index 2147e18..a2ec2bc 100644
--- a/lib/gdb_stacktrace.c
+++ b/lib/gdb_stacktrace.c
@@ -27,6 +27,7 @@
#include "normalize.h"
#include "generic_stacktrace.h"
#include "internal_utils.h"
+#include "json.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -45,6 +46,13 @@ gdb_return_null(struct sr_stacktrace *stacktrace)
return NULL;
}
+static struct sr_gdb_stacktrace *
+gdb_from_json(struct sr_json_value *root, char **error_message)
+{
+ *error_message = sr_strdup("Not implemented");
+ return NULL;
+}
+
DEFINE_THREADS_FUNC(gdb_threads, struct sr_gdb_stacktrace)
DEFINE_SET_THREADS_FUNC(gdb_set_threads, struct sr_gdb_stacktrace)
DEFINE_PARSE_WRAPPER_FUNC(gdb_parse, SR_REPORT_GDB)
@@ -55,6 +63,7 @@ struct stacktrace_methods gdb_stacktrace_methods =
.parse_location = (parse_location_fn_t) sr_gdb_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) sr_gdb_stacktrace_to_short_text,
.to_json = (to_json_fn_t) gdb_return_null,
+ .from_json = (from_json_fn_t) gdb_from_json,
.get_reason = (get_reason_fn_t) gdb_return_null,
.find_crash_thread =
(find_crash_thread_fn_t) sr_gdb_stacktrace_find_crash_thread,
diff --git a/lib/generic_stacktrace.c b/lib/generic_stacktrace.c
index 8d6678c..70d876f 100644
--- a/lib/generic_stacktrace.c
+++ b/lib/generic_stacktrace.c
@@ -24,6 +24,7 @@
#include "strbuf.h"
#include "location.h"
#include "sha1.h"
+#include "json.h"
#include "frame.h"
#include "thread.h"
@@ -98,6 +99,30 @@ sr_stacktrace_parse(enum sr_report_type type, const char *input, char **error_me
return DISPATCH(dtable, type, parse)(input, error_message);
}
+struct sr_stacktrace *
+sr_stacktrace_from_json(enum sr_report_type type, struct sr_json_value *root, char **error_message)
+{
+ return DISPATCH(dtable, type, from_json)(root, error_message);
+}
+
+struct sr_stacktrace *
+sr_stacktrace_from_json_text(enum sr_report_type type, const char *input, char **error_message)
+{
+ struct sr_json_settings settings;
+ memset(&settings, 0, sizeof(struct sr_json_settings));
+ struct sr_location location;
+ sr_location_init(&location);
+ struct sr_json_value *json_root = sr_json_parse_ex(&settings, input, &location);
+
+ if (!json_root)
+ {
+ *error_message = sr_location_to_string(&location);
+ return NULL;
+ }
+
+ return sr_stacktrace_from_json(type, json_root, error_message);
+}
+
char *
sr_stacktrace_to_short_text(struct sr_stacktrace *stacktrace, int max_frames)
{
diff --git a/lib/generic_stacktrace.h b/lib/generic_stacktrace.h
index 4112d70..8e3d629 100644
--- a/lib/generic_stacktrace.h
+++ b/lib/generic_stacktrace.h
@@ -22,12 +22,15 @@
#include "stacktrace.h"
#include "thread.h"
-#include "strbuf.h"
+
+struct sr_json_value;
+struct sr_strbuf;
typedef struct sr_stacktrace* (*parse_fn_t)(const char *, char **);
typedef struct sr_stacktrace* (*parse_location_fn_t)(const char **, struct sr_location *);
typedef char* (*to_short_text_fn_t)(struct sr_stacktrace*, int);
typedef char* (*to_json_fn_t)(struct sr_stacktrace *);
+typedef struct sr_stacktrace* (*from_json_fn_t)(struct sr_json_value *, char **);
typedef char* (*get_reason_fn_t)(struct sr_stacktrace *);
typedef struct sr_thread* (*find_crash_thread_fn_t)(struct sr_stacktrace *);
typedef struct sr_thread* (*threads_fn_t)(struct sr_stacktrace *);
@@ -42,6 +45,7 @@ struct stacktrace_methods
parse_location_fn_t parse_location;
to_short_text_fn_t to_short_text;
to_json_fn_t to_json;
+ from_json_fn_t from_json;
get_reason_fn_t get_reason;
find_crash_thread_fn_t find_crash_thread;
threads_fn_t threads;
diff --git a/lib/java_stacktrace.c b/lib/java_stacktrace.c
index f2ddce3..4914b7d 100644
--- a/lib/java_stacktrace.c
+++ b/lib/java_stacktrace.c
@@ -49,6 +49,7 @@ struct stacktrace_methods java_stacktrace_methods =
.parse_location = (parse_location_fn_t) sr_java_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_java_stacktrace_to_json,
+ .from_json = (from_json_fn_t) sr_java_stacktrace_from_json,
.get_reason = (get_reason_fn_t) sr_java_stacktrace_get_reason,
.find_crash_thread =
(find_crash_thread_fn_t) sr_java_find_crash_thread,
diff --git a/lib/koops_stacktrace.c b/lib/koops_stacktrace.c
index 9bc181c..6b72d54 100644
--- a/lib/koops_stacktrace.c
+++ b/lib/koops_stacktrace.c
@@ -87,6 +87,7 @@ struct stacktrace_methods koops_stacktrace_methods =
.parse_location = (parse_location_fn_t) sr_koops_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_koops_stacktrace_to_json,
+ .from_json = (from_json_fn_t) sr_koops_stacktrace_from_json,
.get_reason = (get_reason_fn_t) sr_koops_stacktrace_get_reason,
.find_crash_thread = (find_crash_thread_fn_t) stacktrace_one_thread_only,
.threads = (threads_fn_t) stacktrace_one_thread_only,
diff --git a/lib/python_stacktrace.c b/lib/python_stacktrace.c
index 7cc3ed2..3dc0a75 100644
--- a/lib/python_stacktrace.c
+++ b/lib/python_stacktrace.c
@@ -66,6 +66,7 @@ struct stacktrace_methods python_stacktrace_methods =
.parse_location = (parse_location_fn_t) sr_python_stacktrace_parse,
.to_short_text = (to_short_text_fn_t) stacktrace_to_short_text,
.to_json = (to_json_fn_t) sr_python_stacktrace_to_json,
+ .from_json = (from_json_fn_t) sr_python_stacktrace_from_json,
.get_reason = (get_reason_fn_t) sr_python_stacktrace_get_reason,
.find_crash_thread = (find_crash_thread_fn_t) stacktrace_one_thread_only,
.threads = (threads_fn_t) stacktrace_one_thread_only,
--
1.8.3.1
More information about the Crash-catcher
mailing list