- /*
- * Freed when type is unregistered.
- */
- float_class = g_new(struct type_class_float, 1);
- float_class->p.name = g_quark_from_string(name);
- float_class->p.alignment = alignment;
- float_class->mantissa_len = mantissa_len;
- float_class->exp_len = exp_len;
- float_class->byte_order = byte_order;
- if (float_class->p.name) {
- ret = ctf_register_type(&float_class->p);
- if (ret) {
- g_free(float_class);
- return NULL;
- }
- }
- return float_class;
+ declaration_unref(&float_declaration->exp->p);
+ declaration_unref(&float_declaration->mantissa->p);
+ declaration_unref(&float_declaration->sign->p);
+ g_free(float_declaration);
+}
+
+struct declaration_float *
+ float_declaration_new(const char *name, size_t mantissa_len,
+ size_t exp_len, int byte_order, size_t alignment)
+{
+ struct declaration_float *float_declaration;
+ struct declaration *declaration;
+
+ float_declaration = g_new(struct declaration_float, 1);
+ declaration = &float_declaration->p;
+ declaration->id = CTF_TYPE_FLOAT;
+ declaration->name = g_quark_from_string(name);
+ declaration->alignment = alignment;
+ declaration->copy = float_copy;
+ declaration->declaration_free = _float_declaration_free;
+ declaration->definition_new = _float_definition_new;
+ declaration->definition_free = _float_definition_free;
+ declaration->ref = 1;
+ float_declaration->byte_order = byte_order;
+
+ float_declaration->sign = integer_declaration_new(NULL, 1,
+ byte_order, false, 1);
+ float_declaration->mantissa = integer_declaration_new(NULL, mantissa_len - 1,
+ byte_order, false, 1);
+ float_declaration->exp = integer_declaration_new(NULL, exp_len,
+ byte_order, true, 1);
+ return float_declaration;