[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