You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2019/11/25 18:52:29 UTC

[qpid-proton] 01/02: PROTON-2140: remove encoder & decoder elements from pn_data_t

This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit 3b84a5b8ab1c33fff1ded82aa2d8f7ea08fb5ec4
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Mon Nov 25 11:43:48 2019 -0500

    PROTON-2140: remove encoder & decoder elements from pn_data_t
---
 c/src/core/codec.c   | 38 +++++++++++++++-----------------------
 c/src/core/data.h    |  2 --
 c/src/core/decoder.c | 32 ++++++++++----------------------
 c/src/core/decoder.h | 10 ++++++++--
 c/src/core/encoder.c | 37 ++++++++++++-------------------------
 c/src/core/encoder.h | 11 +++++++++--
 6 files changed, 54 insertions(+), 76 deletions(-)

diff --git a/c/src/core/codec.c b/c/src/core/codec.c
index cbc2360..904fb72 100644
--- a/c/src/core/codec.c
+++ b/c/src/core/codec.c
@@ -88,8 +88,6 @@ static void pn_data_finalize(void *object)
   pn_buffer_free(data->buf);
   pn_free(data->str);
   pn_error_free(data->error);
-  pn_free(data->decoder);
-  pn_free(data->encoder);
 }
 
 static const pn_fields_t *pni_node_fields(pn_data_t *data, pni_node_t *node)
@@ -372,22 +370,6 @@ static inline pn_string_t *pni_data_str(pn_data_t *data)
   return data->str;
 }
 
-static inline pn_decoder_t *pni_data_decoder(pn_data_t *data)
-{
-  if (data->decoder == NULL) {
-    data->decoder = pn_decoder();
-  }
-  return data->decoder;
-}
-
-static inline pn_encoder_t *pni_data_encoder(pn_data_t *data)
-{
-  if (data->encoder == NULL) {
-    data->encoder = pn_encoder();
-  }
-  return data->encoder;
-}
-
 static inline pn_error_t *pni_data_error(pn_data_t *data)
 {
   if (data->error == NULL) {
@@ -408,8 +390,6 @@ pn_data_t *pn_data(size_t capacity)
   data->current = 0;
   data->base_parent = 0;
   data->base_current = 0;
-  data->decoder = NULL;
-  data->encoder = NULL;
   data->error = NULL;
   data->str = NULL;
   return data;
@@ -1560,17 +1540,29 @@ static pni_node_t *pni_data_add(pn_data_t *data)
 
 ssize_t pn_data_encode(pn_data_t *data, char *bytes, size_t size)
 {
-  return pn_encoder_encode(pni_data_encoder(data), data, bytes, size);
+  pn_encoder_t encoder;
+  pn_encoder_initialize(&encoder);
+  ssize_t r = pn_encoder_encode(&encoder, data, bytes, size);
+  pn_encoder_finalize(&encoder);
+  return r;
 }
 
 ssize_t pn_data_encoded_size(pn_data_t *data)
 {
-  return pn_encoder_size(pni_data_encoder(data), data);
+  pn_encoder_t encoder;
+  pn_encoder_initialize(&encoder);
+  ssize_t r = pn_encoder_size(&encoder, data);
+  pn_encoder_finalize(&encoder);
+  return r;
 }
 
 ssize_t pn_data_decode(pn_data_t *data, const char *bytes, size_t size)
 {
-  return pn_decoder_decode(pni_data_decoder(data), bytes, size, data);
+  pn_decoder_t decoder;
+  pn_decoder_initialize(&decoder);
+  ssize_t r = pn_decoder_decode(&decoder, bytes, size, data);
+  pn_decoder_finalize(&decoder);
+  return r;
 }
 
 int pn_data_put_list(pn_data_t *data)
diff --git a/c/src/core/data.h b/c/src/core/data.h
index 94dc7d6..755909e 100644
--- a/c/src/core/data.h
+++ b/c/src/core/data.h
@@ -50,8 +50,6 @@ typedef struct {
 struct pn_data_t {
   pni_node_t *nodes;
   pn_buffer_t *buf;
-  pn_decoder_t *decoder;
-  pn_encoder_t *encoder;
   pn_error_t *error;
   pn_string_t *str;
   pni_nid_t capacity;
diff --git a/c/src/core/decoder.c b/c/src/core/decoder.c
index 1755db2..6fe02bf 100644
--- a/c/src/core/decoder.c
+++ b/c/src/core/decoder.c
@@ -27,35 +27,23 @@
 
 #include <string.h>
 
-struct pn_decoder_t {
-  const char *input;
-  size_t size;
-  const char *position;
-  pn_error_t *error;
-};
+static inline pn_error_t *pni_decoder_error(pn_decoder_t *decoder)
+{
+  if (!decoder->error) decoder->error = pn_error();
+  return decoder->error;
+}
 
-static void pn_decoder_initialize(void *obj)
+void pn_decoder_initialize(pn_decoder_t *decoder)
 {
-  pn_decoder_t *decoder = (pn_decoder_t *) obj;
   decoder->input = NULL;
   decoder->size = 0;
   decoder->position = NULL;
-  decoder->error = pn_error();
-}
-
-static void pn_decoder_finalize(void *obj) {
-  pn_decoder_t *decoder = (pn_decoder_t *) obj;
-  pn_error_free(decoder->error);
+  decoder->error = NULL;
 }
 
-#define pn_decoder_hashcode NULL
-#define pn_decoder_compare NULL
-#define pn_decoder_inspect NULL
-
-pn_decoder_t *pn_decoder()
+void pn_decoder_finalize(pn_decoder_t *decoder)
 {
-  static const pn_class_t clazz = PN_CLASS(pn_decoder);
-  return (pn_decoder_t *) pn_class_new(&clazz, sizeof(pn_decoder_t));
+  pn_error_free(decoder->error);
 }
 
 static inline uint8_t pn_decoder_readf8(pn_decoder_t *decoder)
@@ -443,7 +431,7 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint
     return 0;
   }
   default:
-    return pn_error_format(decoder->error, PN_ARG_ERR, "unrecognized typecode: %u", code);
+    return pn_error_format(pni_decoder_error(decoder), PN_ARG_ERR, "unrecognized typecode: %u", code);
   }
 
   return err;
diff --git a/c/src/core/decoder.h b/c/src/core/decoder.h
index b7de898..70bc4c8 100644
--- a/c/src/core/decoder.h
+++ b/c/src/core/decoder.h
@@ -22,9 +22,15 @@
  *
  */
 
-typedef struct pn_decoder_t pn_decoder_t;
+typedef struct pn_decoder_t {
+  const char *input;
+  size_t size;
+  const char *position;
+  pn_error_t *error;
+} pn_decoder_t;
 
-pn_decoder_t *pn_decoder(void);
+void pn_decoder_initialize(pn_decoder_t *decoder);
+void pn_decoder_finalize(pn_decoder_t *decoder);
 ssize_t pn_decoder_decode(pn_decoder_t *decoder, const char *src, size_t size, pn_data_t *dst);
 
 #endif /* decoder.h */
diff --git a/c/src/core/encoder.c b/c/src/core/encoder.c
index 505db47..2be808c 100644
--- a/c/src/core/encoder.c
+++ b/c/src/core/encoder.c
@@ -29,37 +29,24 @@
 
 #include "data.h"
 
-struct pn_encoder_t {
-  char *output;
-  char *position;
-  pn_error_t *error;
-  size_t size;
-  unsigned null_count;
-};
-
-static void pn_encoder_initialize(void *obj)
+static inline pn_error_t *pni_encoder_error(pn_encoder_t *encoder)
+{
+  if (!encoder->error) encoder->error = pn_error();
+  return encoder->error;
+}
+
+void pn_encoder_initialize(pn_encoder_t *encoder)
 {
-  pn_encoder_t *encoder = (pn_encoder_t *) obj;
   encoder->output = NULL;
   encoder->position = NULL;
-  encoder->error = pn_error();
+  encoder->error = NULL;
   encoder->size = 0;
   encoder->null_count = 0;
 }
 
-static void pn_encoder_finalize(void *obj) {
-  pn_encoder_t *encoder = (pn_encoder_t *) obj;
-  pn_error_free(encoder->error);
-}
-
-#define pn_encoder_hashcode NULL
-#define pn_encoder_compare NULL
-#define pn_encoder_inspect NULL
-
-pn_encoder_t *pn_encoder()
+void pn_encoder_finalize(pn_encoder_t *encoder)
 {
-  static const pn_class_t clazz = PN_CLASS(pn_encoder);
-  return (pn_encoder_t *) pn_class_new(&clazz, sizeof(pn_encoder_t));
+  pn_error_free(encoder->error);
 }
 
 static uint8_t pn_type2code(pn_encoder_t *encoder, pn_type_t type)
@@ -92,7 +79,7 @@ static uint8_t pn_type2code(pn_encoder_t *encoder, pn_type_t type)
   case PN_MAP: return PNE_MAP32;
   case PN_DESCRIBED: return PNE_DESCRIPTOR;
   default:
-    return pn_error_format(encoder->error, PN_ERR, "not a value type: %u\n", type);
+    return pn_error_format(pni_encoder_error(encoder), PN_ERR, "not a value type: %u\n", type);
   }
 }
 
@@ -338,7 +325,7 @@ static int pni_encoder_enter(void *ctx, pn_data_t *data, pni_node_t *node)
     pn_encoder_writef32(encoder, node->children);
     return 0;
   default:
-    return pn_error_format(data->error, PN_ERR, "unrecognized encoding: %u", code);
+    return pn_error_format(pn_data_error(data), PN_ERR, "unrecognized encoding: %u", code);
   }
 }
 
diff --git a/c/src/core/encoder.h b/c/src/core/encoder.h
index 20876cb..3a961bf 100644
--- a/c/src/core/encoder.h
+++ b/c/src/core/encoder.h
@@ -22,9 +22,16 @@
  *
  */
 
-typedef struct pn_encoder_t pn_encoder_t;
+typedef struct pn_encoder_t {
+  char *output;
+  char *position;
+  pn_error_t *error;
+  size_t size;
+  unsigned null_count;
+} pn_encoder_t;
 
-pn_encoder_t *pn_encoder(void);
+void pn_encoder_initialize(pn_encoder_t *encoder);
+void pn_encoder_finalize(pn_encoder_t *encoder);
 ssize_t pn_encoder_encode(pn_encoder_t *encoder, pn_data_t *src, char *dst, size_t size);
 ssize_t pn_encoder_size(pn_encoder_t *encoder, pn_data_t *src);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org