container_of(type_class, struct type_class_float, p);
if (fsrc->float_copy == fdest->float_copy) {
- fsrc->float_copy(dest, float_class, src, float_class);
+ fsrc->float_copy(dest, src, float_class);
} else {
double v;
- v = fsrc->double_read(src, fsrc);
- fdest->double_write(dest, fdest, v);
+ v = fsrc->double_read(src, float_class);
+ fdest->double_write(dest, float_class, v);
}
}
void float_type_free(struct type_class_float *float_class)
{
+ integer_type_free(float_class->exp);
+ integer_type_free(float_class->mantissa);
+ integer_type_free(float_class->sign);
g_free(float_class);
}
size_t alignment)
{
struct type_class_float *float_class;
- struct type_class_bitfield *bitfield_class;
struct type_class_integer *int_class;
struct type_class *type_class;
int ret;
type_class->free = _float_type_free;
float_class->byte_order = byte_order;
- float_class->mantissa = bitfield_type_new(NULL, mantissa_len,
- byte_order, false, 1);
+ float_class->sign = integer_type_new(NULL, 1,
+ byte_order, false, 1);
+ if (!float_class->mantissa)
+ goto error_sign;
+ float_class->mantissa = integer_type_new(NULL, mantissa_len - 1,
+ byte_order, false, 1);
if (!float_class->mantissa)
goto error_mantissa;
- float_class->exp = bitfield_type_new(NULL, exp_len,
- byte_order, true, 1);
+ float_class->exp = integer_type_new(NULL, exp_len,
+ byte_order, true, 1);
if (!float_class->exp)
goto error_exp;
return float_class;
error_register:
- bitfield_type_free(float_class->exp);
+ integer_type_free(float_class->exp);
error_exp:
- bitfield_type_free(float_class->mantissa);
+ integer_type_free(float_class->mantissa);
error_mantissa:
+ integer_type_free(float_class->sign);
+error_sign:
g_free(float_class);
return NULL;
}