提交 fca368c4 编写于 作者: B Behdad Esfahbod

Add hb_object_header_t which is the common part of all objects

Makes way for adding arbitrary user_data support.
上级 a9f24c80
...@@ -30,12 +30,13 @@ ...@@ -30,12 +30,13 @@
#include "hb-private.hh" #include "hb-private.hh"
#include "hb-blob.h" #include "hb-blob.h"
#include "hb-object-private.hh"
HB_BEGIN_DECLS HB_BEGIN_DECLS
struct _hb_blob_t { struct _hb_blob_t {
hb_reference_count_t ref_count; hb_object_header_t header;
unsigned int length; unsigned int length;
......
...@@ -46,7 +46,7 @@ HB_BEGIN_DECLS ...@@ -46,7 +46,7 @@ HB_BEGIN_DECLS
#endif #endif
hb_blob_t _hb_blob_nil = { hb_blob_t _hb_blob_nil = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
0, /* length */ 0, /* length */
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "hb-private.hh" #include "hb-private.hh"
#include "hb-buffer.h" #include "hb-buffer.h"
#include "hb-object-private.hh"
#include "hb-unicode-private.hh" #include "hb-unicode-private.hh"
HB_BEGIN_DECLS HB_BEGIN_DECLS
...@@ -85,7 +86,7 @@ _hb_buffer_set_masks (hb_buffer_t *buffer, ...@@ -85,7 +86,7 @@ _hb_buffer_set_masks (hb_buffer_t *buffer,
struct _hb_buffer_t { struct _hb_buffer_t {
hb_reference_count_t ref_count; hb_object_header_t header;
/* Information about how the text in the buffer should be treated */ /* Information about how the text in the buffer should be treated */
...@@ -94,9 +95,9 @@ struct _hb_buffer_t { ...@@ -94,9 +95,9 @@ struct _hb_buffer_t {
/* Buffer contents */ /* Buffer contents */
hb_bool_t have_output; /* Whether we have an output buffer going on */ bool have_output; /* Whether we have an output buffer going on */
hb_bool_t have_positions; /* Whether we have positions */ bool have_positions; /* Whether we have positions */
hb_bool_t in_error; /* Allocation failed */ bool in_error; /* Allocation failed */
unsigned int i; /* Cursor into ->info and ->pos arrays */ unsigned int i; /* Cursor into ->info and ->pos arrays */
unsigned int len; /* Length of ->info and ->pos arrays */ unsigned int len; /* Length of ->info and ->pos arrays */
......
...@@ -35,7 +35,7 @@ HB_BEGIN_DECLS ...@@ -35,7 +35,7 @@ HB_BEGIN_DECLS
static hb_buffer_t _hb_buffer_nil = { static hb_buffer_t _hb_buffer_nil = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
&_hb_unicode_funcs_nil, /* unicode */ &_hb_unicode_funcs_nil, /* unicode */
{ {
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "hb-private.hh" #include "hb-private.hh"
#include "hb-font.h" #include "hb-font.h"
#include "hb-object-private.hh"
HB_BEGIN_DECLS HB_BEGIN_DECLS
...@@ -41,7 +42,7 @@ HB_BEGIN_DECLS ...@@ -41,7 +42,7 @@ HB_BEGIN_DECLS
*/ */
struct _hb_font_funcs_t { struct _hb_font_funcs_t {
hb_reference_count_t ref_count; hb_object_header_t header;
hb_bool_t immutable; hb_bool_t immutable;
...@@ -62,7 +63,7 @@ extern HB_INTERNAL hb_font_funcs_t _hb_font_funcs_nil; ...@@ -62,7 +63,7 @@ extern HB_INTERNAL hb_font_funcs_t _hb_font_funcs_nil;
*/ */
struct _hb_face_t { struct _hb_face_t {
hb_reference_count_t ref_count; hb_object_header_t header;
hb_get_table_func_t get_table; hb_get_table_func_t get_table;
void *user_data; void *user_data;
...@@ -80,7 +81,7 @@ struct _hb_face_t { ...@@ -80,7 +81,7 @@ struct _hb_face_t {
*/ */
struct _hb_font_t { struct _hb_font_t {
hb_reference_count_t ref_count; hb_object_header_t header;
unsigned int x_scale; unsigned int x_scale;
unsigned int y_scale; unsigned int y_scale;
......
...@@ -85,7 +85,8 @@ hb_font_get_kerning_nil (hb_font_t *font HB_UNUSED, ...@@ -85,7 +85,8 @@ hb_font_get_kerning_nil (hb_font_t *font HB_UNUSED,
{ return 0; } { return 0; }
hb_font_funcs_t _hb_font_funcs_nil = { hb_font_funcs_t _hb_font_funcs_nil = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
TRUE, /* immutable */ TRUE, /* immutable */
{ {
hb_font_get_glyph_nil, hb_font_get_glyph_nil,
...@@ -287,7 +288,7 @@ hb_font_get_kerning (hb_font_t *font, hb_face_t *face, ...@@ -287,7 +288,7 @@ hb_font_get_kerning (hb_font_t *font, hb_face_t *face,
*/ */
static hb_face_t _hb_face_nil = { static hb_face_t _hb_face_nil = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
NULL, /* get_table */ NULL, /* get_table */
NULL, /* user_data */ NULL, /* user_data */
...@@ -435,7 +436,7 @@ hb_face_get_upem (hb_face_t *face) ...@@ -435,7 +436,7 @@ hb_face_get_upem (hb_face_t *face)
*/ */
static hb_font_t _hb_font_nil = { static hb_font_t _hb_font_nil = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
0, /* x_scale */ 0, /* x_scale */
0, /* y_scale */ 0, /* y_scale */
......
...@@ -145,7 +145,8 @@ hb_ft_get_kerning (hb_font_t *font HB_UNUSED, ...@@ -145,7 +145,8 @@ hb_ft_get_kerning (hb_font_t *font HB_UNUSED,
} }
static hb_font_funcs_t ft_ffuncs = { static hb_font_funcs_t ft_ffuncs = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
TRUE, /* immutable */ TRUE, /* immutable */
{ {
hb_ft_get_glyph, hb_ft_get_glyph,
......
...@@ -221,7 +221,8 @@ hb_glib_get_script (hb_unicode_funcs_t *ufuncs, ...@@ -221,7 +221,8 @@ hb_glib_get_script (hb_unicode_funcs_t *ufuncs,
} }
static hb_unicode_funcs_t glib_ufuncs = { static hb_unicode_funcs_t glib_ufuncs = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
NULL, /* parent */ NULL, /* parent */
TRUE, /* immutable */ TRUE, /* immutable */
{ {
......
...@@ -161,7 +161,8 @@ hb_icu_get_script (hb_unicode_funcs_t *ufuncs, ...@@ -161,7 +161,8 @@ hb_icu_get_script (hb_unicode_funcs_t *ufuncs,
} }
static hb_unicode_funcs_t icu_ufuncs = { static hb_unicode_funcs_t icu_ufuncs = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
NULL, /* parent */ NULL, /* parent */
TRUE, /* immutable */ TRUE, /* immutable */
{ {
......
...@@ -37,75 +37,84 @@ ...@@ -37,75 +37,84 @@
HB_BEGIN_DECLS HB_BEGIN_DECLS
/* Debug */ /* Debug */
#ifndef HB_DEBUG_OBJECT #ifndef HB_DEBUG_OBJECT
#define HB_DEBUG_OBJECT (HB_DEBUG+0) #define HB_DEBUG_OBJECT (HB_DEBUG+0)
#endif #endif
static inline void
_hb_trace_object (const void *obj,
hb_reference_count_t *ref_count,
const char *function)
{
(void) (HB_DEBUG_OBJECT &&
fprintf (stderr, "OBJECT(%p) refcount=%d %s\n",
obj,
ref_count->get (),
function));
}
#define TRACE_OBJECT(obj) _hb_trace_object (obj, &obj->ref_count, __FUNCTION__) typedef struct _hb_object_header_t hb_object_header_t;
struct _hb_object_header_t {
hb_reference_count_t ref_count;
#define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID}
/* Object allocation and lifecycle manamgement macros */ static inline void *create (unsigned int size) {
hb_object_header_t *obj = (hb_object_header_t *) calloc (1, size);
#define HB_OBJECT_IS_INERT(obj) \ if (likely (obj))
(unlikely ((obj)->ref_count.is_invalid ())) obj->init ();
#define HB_OBJECT_DO_INIT_EXPR(obj) \ return obj;
obj->ref_count.init (1) }
#define HB_OBJECT_DO_INIT(obj) \ inline void init (void) {
HB_STMT_START { \ ref_count.init (1);
HB_OBJECT_DO_INIT_EXPR (obj); \ }
} HB_STMT_END
inline bool is_inert (void) const { return unlikely (ref_count.is_invalid ()); }
inline void reference (void) {
if (unlikely (!this || this->is_inert ()))
return;
ref_count.inc ();
}
inline bool destroy (void) {
if (unlikely (!this || this->is_inert ()))
return false;
return ref_count.dec () == 1;
}
inline void trace (const char *function) const {
(void) (HB_DEBUG_OBJECT &&
fprintf (stderr, "OBJECT(%p) refcount=%d %s\n",
this,
this ? ref_count.get () : 0,
function));
}
};
/* Object allocation and lifecycle manamgement macros */
#define TRACE_OBJECT(obj) \
obj->header.trace (__FUNCTION__)
#define HB_OBJECT_IS_INERT(obj) \
(unlikely ((obj)->header.is_inert ()))
#define HB_OBJECT_DO_CREATE(Type, obj) \ #define HB_OBJECT_DO_CREATE(Type, obj) \
likely (( \ likely (( \
(void) ( \ ((obj) = (Type *) hb_object_header_t::create (sizeof (Type))), \
((obj) = (Type *) calloc (1, sizeof (Type))) && \ TRACE_OBJECT (obj), \
( \ (obj) \
HB_OBJECT_DO_INIT_EXPR (obj), \ ))
TRACE_OBJECT (obj), \
TRUE \
) \
), \
(obj) \
))
#define HB_OBJECT_DO_REFERENCE(obj) \ #define HB_OBJECT_DO_REFERENCE(obj) \
HB_STMT_START { \ HB_STMT_START { \
int old_count; \
if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \
return obj; \
TRACE_OBJECT (obj); \ TRACE_OBJECT (obj); \
old_count = obj->ref_count.inc (); \ obj->header.reference (); \
assert (old_count > 0); \
return obj; \ return obj; \
} HB_STMT_END } HB_STMT_END
#define HB_OBJECT_DO_DESTROY(obj) \ #define HB_OBJECT_DO_DESTROY(obj) \
HB_STMT_START { \ HB_STMT_START { \
int old_count; \
if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \
return; \
TRACE_OBJECT (obj); \ TRACE_OBJECT (obj); \
old_count = obj->ref_count.dec (); \ if (!obj->header.destroy ()) \
assert (old_count > 0); \
if (old_count != 1) \
return; \ return; \
} HB_STMT_END } HB_STMT_END
......
...@@ -305,7 +305,7 @@ typedef struct { ...@@ -305,7 +305,7 @@ typedef struct {
#define HB_DEBUG 0 #define HB_DEBUG 0
#endif #endif
static inline hb_bool_t /* always returns TRUE */ static inline bool /* always returns TRUE */
_hb_trace (const char *what, _hb_trace (const char *what,
const char *function, const char *function,
const void *obj, const void *obj,
...@@ -317,9 +317,6 @@ _hb_trace (const char *what, ...@@ -317,9 +317,6 @@ _hb_trace (const char *what,
} }
#include "hb-object-private.hh"
HB_END_DECLS HB_END_DECLS
#endif /* HB_PRIVATE_HH */ #endif /* HB_PRIVATE_HH */
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "hb-private.hh" #include "hb-private.hh"
#include "hb-unicode.h" #include "hb-unicode.h"
#include "hb-object-private.hh"
HB_BEGIN_DECLS HB_BEGIN_DECLS
...@@ -43,10 +44,11 @@ HB_BEGIN_DECLS ...@@ -43,10 +44,11 @@ HB_BEGIN_DECLS
*/ */
struct _hb_unicode_funcs_t { struct _hb_unicode_funcs_t {
hb_reference_count_t ref_count; hb_object_header_t header;
hb_unicode_funcs_t *parent; hb_unicode_funcs_t *parent;
hb_bool_t immutable; bool immutable;
#define IMPLEMENT(return_type, name) \ #define IMPLEMENT(return_type, name) \
inline return_type \ inline return_type \
......
...@@ -81,7 +81,8 @@ hb_unicode_get_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, ...@@ -81,7 +81,8 @@ hb_unicode_get_script_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED,
hb_unicode_funcs_t _hb_unicode_funcs_nil = { hb_unicode_funcs_t _hb_unicode_funcs_nil = {
HB_REFERENCE_COUNT_INVALID, /* ref_count */ HB_OBJECT_HEADER_STATIC,
NULL, /* parent */ NULL, /* parent */
TRUE, /* immutable */ TRUE, /* immutable */
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册