From 84cd1538ee20b934c6892f38578a08106a934fe8 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Tue, 4 Aug 2009 19:46:42 -0700 Subject: Integrated benchmarks into main Makefile. --- benchmarks/parsetostruct.upb_table.c | 67 ++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 benchmarks/parsetostruct.upb_table.c (limited to 'benchmarks/parsetostruct.upb_table.c') diff --git a/benchmarks/parsetostruct.upb_table.c b/benchmarks/parsetostruct.upb_table.c new file mode 100644 index 0000000..f93a6a7 --- /dev/null +++ b/benchmarks/parsetostruct.upb_table.c @@ -0,0 +1,67 @@ + +#include "main.c" + +#include "upb_context.h" +#include "upb_msg.h" + +static struct upb_context c; +static struct upb_string str; +static struct upb_msg_parse_state s; +static struct upb_msg *m; +static void *data; + +static bool initialize() +{ + /* Initialize upb state, parse descriptor. */ + upb_context_init(&c); + struct upb_string fds; + if(!upb_strreadfile(MESSAGE_DESCRIPTOR_FILE, &fds)) { + fprintf(stderr, "Couldn't read " MESSAGE_DESCRIPTOR_FILE ".\n"); + return false; + } + if(!upb_context_parsefds(&c, &fds)) { + fprintf(stderr, "Error importing " MESSAGE_DESCRIPTOR_FILE ".\n"); + return false; + } + upb_strfree(fds); + + char class_name[] = MESSAGE_NAME; + struct upb_string proto_name; + proto_name.ptr = class_name; + proto_name.byte_len = sizeof(class_name)-1; + struct upb_symtab_entry *e = upb_context_lookup(&c, &proto_name); + if(!e || e->type != UPB_SYM_MESSAGE) { + fprintf(stderr, "Error finding symbol '" UPB_STRFMT "'.\n", + UPB_STRARG(proto_name)); + return false; + } + + m = e->ref.msg; + data = upb_msgdata_new(m); + upb_msg_parse_init(&s, data, m, false, true); + + /* Read the message data itself. */ + if(!upb_strreadfile(MESSAGE_FILE, &str)) { + fprintf(stderr, "Error reading " MESSAGE_FILE "\n"); + return false; + } + return true; +} + +static void cleanup() +{ + upb_strfree(str); + upb_context_free(&c); +} + +static size_t run() +{ + size_t read; + upb_msg_parse_reset(&s, data, m, false, BYREF); + upb_status_t status = upb_msg_parse(&s, str.ptr, str.byte_len, &read); + if(status != UPB_STATUS_OK && read != str.byte_len) { + fprintf(stderr, "Error. :( error=%d, read=%lu\n", status, read); + return 0; + } + return read; +} -- cgit v1.2.3