reimplment serialize_int using check_assign()
This commit is contained in:
parent
14b134379d
commit
002f0e20c4
|
@ -252,30 +252,27 @@ struct number_t
|
||||||
struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
|
struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
|
||||||
{
|
{
|
||||||
// encode 2-byte int (Dict/CharString) or 4-byte int (Dict)
|
// encode 2-byte int (Dict/CharString) or 4-byte int (Dict)
|
||||||
template <typename INTTYPE, int minVal, int maxVal>
|
template <typename T, typename V>
|
||||||
static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, int value)
|
static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, V value)
|
||||||
{
|
{
|
||||||
TRACE_SERIALIZE (this);
|
TRACE_SERIALIZE (this);
|
||||||
|
|
||||||
if (unlikely ((value < minVal || value > maxVal)))
|
|
||||||
return_trace (false);
|
|
||||||
|
|
||||||
HBUINT8 *p = c->allocate_size<HBUINT8> (1);
|
HBUINT8 *p = c->allocate_size<HBUINT8> (1);
|
||||||
if (unlikely (p == nullptr)) return_trace (false);
|
if (unlikely (p == nullptr)) return_trace (false);
|
||||||
*p = intOp;
|
*p = intOp;
|
||||||
|
|
||||||
INTTYPE *ip = c->allocate_size<INTTYPE> (INTTYPE::static_size);
|
T *ip = c->allocate_size<T> (T::static_size);
|
||||||
if (unlikely (ip == nullptr)) return_trace (false);
|
if (unlikely (ip == nullptr)) return_trace (false);
|
||||||
*ip = (unsigned int) value;
|
return_trace (c->check_assign (*ip, value));
|
||||||
|
|
||||||
return_trace (true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool serialize_int4 (hb_serialize_context_t *c, int value)
|
template <typename V>
|
||||||
{ return serialize_int<HBUINT32, 0, 0x7FFFFFFF> (c, OpCode_longintdict, value); }
|
static bool serialize_int4 (hb_serialize_context_t *c, V value)
|
||||||
|
{ return serialize_int<HBINT32> (c, OpCode_longintdict, value); }
|
||||||
|
|
||||||
static bool serialize_int2 (hb_serialize_context_t *c, int value)
|
template <typename V>
|
||||||
{ return serialize_int<HBUINT16, 0, 0x7FFF> (c, OpCode_shortint, value); }
|
static bool serialize_int2 (hb_serialize_context_t *c, V value)
|
||||||
|
{ return serialize_int<HBINT16> (c, OpCode_shortint, value); }
|
||||||
|
|
||||||
/* Defining null_size allows a Null object may be created. Should be safe because:
|
/* Defining null_size allows a Null object may be created. Should be safe because:
|
||||||
* A descendent struct Dict uses a Null pointer to indicate a missing table,
|
* A descendent struct Dict uses a Null pointer to indicate a missing table,
|
||||||
|
|
|
@ -352,11 +352,11 @@ struct Dict : UnsizedByteStr
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename INTTYPE, int minVal, int maxVal>
|
template <typename T, typename V>
|
||||||
static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, int value, op_code_t intOp)
|
static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, V value, op_code_t intOp)
|
||||||
{
|
{
|
||||||
// XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation
|
// XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation
|
||||||
if (/*unlikely*/ (!serialize_int<INTTYPE, minVal, maxVal> (c, intOp, value)))
|
if (/*unlikely*/ (!serialize_int<T, V> (c, intOp, value)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
TRACE_SERIALIZE (this);
|
TRACE_SERIALIZE (this);
|
||||||
|
@ -373,17 +373,19 @@ struct Dict : UnsizedByteStr
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool serialize_uint4_op (hb_serialize_context_t *c, op_code_t op, int value)
|
template <typename V>
|
||||||
{ return serialize_int_op<HBUINT32, 0, 0x7FFFFFFF> (c, op, value, OpCode_longintdict); }
|
static bool serialize_int4_op (hb_serialize_context_t *c, op_code_t op, V value)
|
||||||
|
{ return serialize_int_op<HBINT32> (c, op, value, OpCode_longintdict); }
|
||||||
|
|
||||||
static bool serialize_uint2_op (hb_serialize_context_t *c, op_code_t op, int value)
|
template <typename V>
|
||||||
{ return serialize_int_op<HBUINT16, 0, 0x7FFF> (c, op, value, OpCode_shortint); }
|
static bool serialize_int2_op (hb_serialize_context_t *c, op_code_t op, V value)
|
||||||
|
{ return serialize_int_op<HBINT16> (c, op, value, OpCode_shortint); }
|
||||||
|
|
||||||
static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, int value)
|
static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, unsigned value)
|
||||||
{ return serialize_uint4_op (c, op, value); }
|
{ return serialize_int4_op (c, op, value); }
|
||||||
|
|
||||||
static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, int value)
|
static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, unsigned value)
|
||||||
{ return serialize_uint2_op (c, op, value); }
|
{ return serialize_int2_op (c, op, value); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TopDict : Dict {};
|
struct TopDict : Dict {};
|
||||||
|
|
|
@ -247,7 +247,7 @@ struct cff1_font_dict_op_serializer_t : cff_font_dict_op_serializer_t
|
||||||
TRACE_SERIALIZE (this);
|
TRACE_SERIALIZE (this);
|
||||||
|
|
||||||
if (opstr.op == OpCode_FontName)
|
if (opstr.op == OpCode_FontName)
|
||||||
return_trace (FontDict::serialize_uint2_op (c, opstr.op, mod.fontName));
|
return_trace (FontDict::serialize_int2_op (c, opstr.op, mod.fontName));
|
||||||
else
|
else
|
||||||
return_trace (SUPER::serialize (c, opstr, mod.privateDictInfo));
|
return_trace (SUPER::serialize (c, opstr, mod.privateDictInfo));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue