Start cleaning up get_size()
So we know when the size is static and when dynamic.
diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh
index cf75df9..c531c29 100644
--- a/src/hb-open-file-private.hh
+++ b/src/hb-open-file-private.hh
@@ -47,20 +47,19 @@
typedef struct TableDirectory
{
- static inline unsigned int get_size () { return sizeof (TableDirectory); }
-
inline bool sanitize (hb_sanitize_context_t *context) {
TRACE_SANITIZE ();
return context->check_struct (this);
}
+ DEFINE_SIZE_STATIC (16);
+
Tag tag; /* 4-byte identifier. */
CheckSum checkSum; /* CheckSum for this table. */
ULONG offset; /* Offset from beginning of TrueType font
* file. */
ULONG length; /* Length of this table. */
} OpenTypeTable;
-ASSERT_SIZE (TableDirectory, 16);
typedef struct OffsetTable
{
@@ -101,7 +100,7 @@
inline bool sanitize (hb_sanitize_context_t *context) {
TRACE_SANITIZE ();
return context->check_struct (this)
- && context->check_array (tableDir, TableDirectory::get_size (), numTables);
+ && context->check_array (tableDir, TableDirectory::static_size, numTables);
}
private:
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 82242e9..b0daf41 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -86,6 +86,29 @@
/*
+ * Size checking
+ */
+
+#define DEFINE_SIZE_STATIC(size) \
+ inline void _size_assertion (void) const \
+ { ASSERT_STATIC (sizeof (*this) == (size)); } \
+ static inline unsigned int get_size (void) { return (size); } \
+ static const unsigned int static_size = (size); \
+ static const unsigned int min_size = (size)
+
+#define DEFINE_SIZE_VAR(size, _var_type) \
+ inline void _size_assertion (void) const \
+ { ASSERT_STATIC (sizeof (*this) == (size) + VAR0 * sizeof (_var_type)); } \
+ static const unsigned int min_size = (size)
+
+#define DEFINE_SIZE_VAR2(_type, size, _var_type1, _var_type2) \
+ inline void _size_assertion (void) const \
+ { ASSERT_STATIC (sizeof (*this) == (size) + VAR0 * sizeof (_var_type1) + VAR0 * sizeof (_var_type2)); } \
+ static const unsigned int min_size = (size)
+
+
+
+/*
* Null objects
*/
@@ -348,7 +371,6 @@
template <typename Type>
struct IntType
{
- static inline unsigned int get_size () { return sizeof (Type); }
inline void set (Type i) { v = i; }
inline operator Type(void) const { return v; }
inline bool operator == (const IntType<Type> &o) const { return v == o.v; }
@@ -357,6 +379,7 @@
TRACE_SANITIZE ();
return context->check_struct (this);
}
+ DEFINE_SIZE_STATIC (sizeof (Type));
private: BEInt<Type, sizeof (Type)> v;
};
@@ -365,11 +388,6 @@
typedef IntType<uint32_t> ULONG; /* 32-bit unsigned integer. */
typedef IntType<int32_t> LONG; /* 32-bit signed integer. */
-ASSERT_SIZE (USHORT, 2);
-ASSERT_SIZE (SHORT, 2);
-ASSERT_SIZE (ULONG, 4);
-ASSERT_SIZE (LONG, 4);
-
/* Array of four uint8s (length = 32 bits) used to identify a script, language
* system, feature, or baseline */
struct Tag : ULONG
@@ -397,7 +415,7 @@
static uint32_t CalcTableChecksum (ULONG *Table, uint32_t Length)
{
uint32_t Sum = 0L;
- ULONG *EndPtr = Table+((Length+3) & ~3) / ULONG::get_size ();
+ ULONG *EndPtr = Table+((Length+3) & ~3) / ULONG::static_size;
while (Table < EndPtr)
Sum += *Table++;
@@ -463,7 +481,7 @@
private:
/* Set the offset to Null */
inline bool neuter (hb_sanitize_context_t *context) {
- if (context->can_edit (CharP(this), this->get_size ())) {
+ if (context->can_edit (CharP(this), this->static_size)) {
this->set (0); /* 0 is Null offset */
return true;
}
@@ -508,7 +526,7 @@
return array()[i];
}
inline unsigned int get_size () const
- { return len.get_size () + len * Type::get_size (); }
+ { return len.static_size + len * Type::static_size; }
inline bool sanitize (hb_sanitize_context_t *context) {
TRACE_SANITIZE ();
@@ -551,7 +569,7 @@
inline bool sanitize_shallow (hb_sanitize_context_t *context) {
TRACE_SANITIZE ();
return context->check_struct (this)
- && context->check_array (this, Type::get_size (), len);
+ && context->check_array (this, Type::static_size, len);
}
public:
@@ -615,11 +633,11 @@
return array()[i-1];
}
inline unsigned int get_size () const
- { return len.get_size () + (len ? len - 1 : 0) * Type::get_size (); }
+ { return len.static_size + (len ? len - 1 : 0) * Type::static_size; }
inline bool sanitize_shallow (hb_sanitize_context_t *context) {
return context->check_struct (this)
- && context->check_array (this, Type::get_size (), len);
+ && context->check_array (this, Type::static_size, len);
}
inline bool sanitize (hb_sanitize_context_t *context) {
diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh
index 09a6930..97002cb 100644
--- a/src/hb-ot-layout-common-private.hh
+++ b/src/hb-ot-layout-common-private.hh
@@ -51,14 +51,14 @@
template <typename Type>
struct Record
{
- static inline unsigned int get_size () { return sizeof (Record<Type>); }
-
inline bool sanitize (hb_sanitize_context_t *context, void *base) {
TRACE_SANITIZE ();
return context->check_struct (this)
&& offset.sanitize (context, base);
}
+ DEFINE_SIZE_STATIC (6);
+
Tag tag; /* 4-byte Tag identifier */
OffsetTo<Type>
offset; /* Offset from beginning of object holding
@@ -350,8 +350,6 @@
{
friend struct CoverageFormat2;
- static inline unsigned int get_size () { return sizeof (CoverageRangeRecord); }
-
private:
inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
{
@@ -366,13 +364,14 @@
return context->check_struct (this);
}
+ DEFINE_SIZE_STATIC (6);
+
private:
GlyphID start; /* First GlyphID in the range */
GlyphID end; /* Last GlyphID in the range */
USHORT startCoverageIndex; /* Coverage Index of first GlyphID in
* range */
};
-ASSERT_SIZE (CoverageRangeRecord, 6);
DEFINE_NULL_DATA (CoverageRangeRecord, 6, "\000\001");
struct CoverageFormat2
@@ -472,8 +471,6 @@
{
friend struct ClassDefFormat2;
- static inline unsigned int get_size () { return sizeof (ClassRangeRecord); }
-
private:
inline hb_ot_layout_class_t get_class (hb_codepoint_t glyph_id) const
{
@@ -488,12 +485,13 @@
return context->check_struct (this);
}
+ DEFINE_SIZE_STATIC (6);
+
private:
GlyphID start; /* First GlyphID in the range */
GlyphID end; /* Last GlyphID in the range */
USHORT classValue; /* Applied to all glyphs in the range */
};
-ASSERT_SIZE (ClassRangeRecord, 6);
DEFINE_NULL_DATA (ClassRangeRecord, 6, "\000\001");
struct ClassDefFormat2
diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh
index 60ee17e..ab72731 100644
--- a/src/hb-ot-layout-gpos-private.hh
+++ b/src/hb-ot-layout-gpos-private.hh
@@ -90,7 +90,7 @@
inline unsigned int get_len () const
{ return _hb_popcount32 ((unsigned int) *this); }
inline unsigned int get_size () const
- { return get_len () * Value::get_size (); }
+ { return get_len () * Value::static_size; }
void apply_value (hb_ot_layout_context_t *layout,
const char *base,
@@ -349,7 +349,7 @@
if (!context->check_struct (this)) return false;
if (unlikely (cols >= ((unsigned int) -1) / rows)) return false;
unsigned int count = rows * cols;
- if (!context->check_array (matrix, matrix[0].get_size (), count)) return false;
+ if (!context->check_array (matrix, matrix[0].static_size, count)) return false;
for (unsigned int i = 0; i < count; i++)
if (!matrix[i].sanitize (context, this)) return false;
return true;
@@ -368,21 +368,19 @@
{
friend struct MarkArray;
- static inline unsigned int get_size () { return sizeof (MarkRecord); }
-
inline bool sanitize (hb_sanitize_context_t *context, void *base) {
TRACE_SANITIZE ();
return context->check_struct (this)
&& markAnchor.sanitize (context, base);
}
+ DEFINE_SIZE_STATIC (4);
private:
USHORT klass; /* Class defined for this mark */
OffsetTo<Anchor>
markAnchor; /* Offset to Anchor table--from
* beginning of MarkArray table */
};
-ASSERT_SIZE (MarkRecord, 4);
struct MarkArray
{
@@ -565,7 +563,7 @@
TRACE_SANITIZE ();
if (!context->check_struct (this)) return false;
unsigned int count = (1 + format_len) * len;
- return context->check_array (array, USHORT::get_size (), count);
+ return context->check_array (array, USHORT::static_size, count);
}
private:
@@ -602,7 +600,7 @@
unsigned int len1 = valueFormat1.get_len ();
unsigned int len2 = valueFormat2.get_len ();
- unsigned int record_size = USHORT::get_size () * (1 + len1 + len2);
+ unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
const PairSet &pair_set = this+pairSet[index];
unsigned int count = pair_set.len;
@@ -795,14 +793,14 @@
struct EntryExitRecord
{
- static inline unsigned int get_size () { return sizeof (EntryExitRecord); }
-
inline bool sanitize (hb_sanitize_context_t *context, void *base) {
TRACE_SANITIZE ();
return entryAnchor.sanitize (context, base)
&& exitAnchor.sanitize (context, base);
}
+ DEFINE_SIZE_STATIC (4);
+
OffsetTo<Anchor>
entryAnchor; /* Offset to EntryAnchor table--from
* beginning of CursivePos
@@ -812,7 +810,6 @@
* beginning of CursivePos
* subtable--may be NULL */
};
-ASSERT_SIZE (EntryExitRecord, 4);
struct CursivePosFormat1
{
diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh
index 7777b9c..f389b19 100644
--- a/src/hb-ot-layout-gsubgpos-private.hh
+++ b/src/hb-ot-layout-gsubgpos-private.hh
@@ -172,19 +172,18 @@
struct LookupRecord
{
- static inline unsigned int get_size () { return sizeof (LookupRecord); }
-
inline bool sanitize (hb_sanitize_context_t *context) {
TRACE_SANITIZE ();
return context->check_struct (this);
}
+ DEFINE_SIZE_STATIC (4);
+
USHORT sequenceIndex; /* Index into current glyph
* sequence--first glyph = 0 */
USHORT lookupListIndex; /* Lookup to apply to that
* position--zero--based */
};
-ASSERT_SIZE (LookupRecord, 4);
static inline bool apply_lookup (hb_apply_context_t *context,
unsigned int count, /* Including the first glyph */
@@ -277,7 +276,7 @@
inline bool apply (hb_apply_context_t *context, ContextLookupContext &lookup_context) const
{
TRACE_APPLY ();
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].get_size () * (inputCount ? inputCount - 1 : 0));
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
return context_lookup (context,
inputCount, input,
lookupCount, lookupRecord,
@@ -290,8 +289,8 @@
return inputCount.sanitize (context)
&& lookupCount.sanitize (context)
&& context->check_range (input,
- input[0].get_size () * inputCount
- + lookupRecordX[0].get_size () * lookupCount);
+ input[0].static_size * inputCount
+ + lookupRecordX[0].static_size * lookupCount);
}
private:
@@ -430,7 +429,7 @@
if (likely (index == NOT_COVERED))
return false;
- const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].get_size () * glyphCount);
+ const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
struct ContextLookupContext lookup_context = {
{match_coverage, apply_func},
CharP(this)
@@ -445,11 +444,11 @@
TRACE_SANITIZE ();
if (!context->check_struct (this)) return false;
unsigned int count = glyphCount;
- if (!context->check_array (coverage, OffsetTo<Coverage>::get_size (), count)) return false;
+ if (!context->check_array (coverage, coverage[0].static_size, count)) return false;
for (unsigned int i = 0; i < count; i++)
if (!coverage[i].sanitize (context, this)) return false;
- LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, OffsetTo<Coverage>::get_size () * count);
- return context->check_array (lookupRecord, LookupRecord::get_size (), lookupCount);
+ LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * count);
+ return context->check_array (lookupRecord, lookupRecord[0].static_size, lookupCount);
}
private: