fx: improve fx_value reference management

This commit is contained in:
2026-05-28 20:51:55 +01:00
parent 516f5be2d6
commit 883b0b24b1
2 changed files with 22 additions and 24 deletions
+5
View File
@@ -45,6 +45,11 @@
#define FX_WSTR(v) __FX_VALUE_CREATE(WSTR, v_wstr, v)
#define FX_CSTR(v) __FX_VALUE_CREATE(CSTR, v_cstr, v)
#define FX_POINTER(v) __FX_VALUE_CREATE(POINTER, v_pointer, v)
#define FX_VALUE_OBJECT_REF(v) \
((fx_value) { \
.v_type = fx_object_query_type((fx_object *)v), \
.v_object = fx_object_ref((fx_object *)(v)), \
})
#define FX_VALUE_OBJECT(v) \
((fx_value) { \
.v_type = fx_object_query_type((fx_object *)v), \
+17 -24
View File
@@ -126,9 +126,8 @@ int fx_value_compare(const fx_value *left, const fx_value *right)
return FX_ERR_NOT_SUPPORTED;
}
fx_comparable_class *comparable = fx_class_get_interface(
c,
FX_TYPE_COMPARABLE);
fx_comparable_class *comparable
= fx_class_get_interface(c, FX_TYPE_COMPARABLE);
if (!comparable || !comparable->c_compare) {
return FX_ERR_NOT_SUPPORTED;
}
@@ -181,8 +180,8 @@ static fx_status value_change_string(fx_value *in, fx_value *out)
return status;
}
fx_string *result = fx_string_create_from_cstr(
fx_stringstream_ptr(strm));
fx_string *result
= fx_string_create_from_cstr(fx_stringstream_ptr(strm));
fx_stringstream_unref(strm);
if (!result) {
@@ -212,9 +211,8 @@ fx_status fx_value_change_type(
return FX_ERR_NOT_SUPPORTED;
}
fx_convertible_class *convertible = fx_class_get_interface(
c,
FX_TYPE_CONVERTIBLE);
fx_convertible_class *convertible
= fx_class_get_interface(c, FX_TYPE_CONVERTIBLE);
if (!convertible) {
return FX_ERR_NOT_SUPPORTED;
}
@@ -375,17 +373,15 @@ fx_status fx_value_change_type(
return FX_ERR_NOT_SUPPORTED; \
} \
\
fx_convertible_class *convertible = fx_class_get_interface( \
c, \
FX_TYPE_CONVERTIBLE); \
if (!convertible) { \
fx_convertible_class *convertible \
= fx_class_get_interface(c, FX_TYPE_CONVERTIBLE); \
if (!convertible || !convertible->c_to_##fx_type_name) { \
return FX_ERR_NOT_SUPPORTED; \
} \
\
c_type_name result; \
fx_status status = convertible->c_to_##fx_type_name( \
v, \
&result); \
fx_status status \
= convertible->c_to_##fx_type_name(v, &result); \
if (!FX_OK(status)) { \
return status; \
} \
@@ -657,9 +653,8 @@ FX_API fx_type_id fx_value_get_common_type(const fx_value *a, const fx_value *b)
return FX_ERR_NOT_SUPPORTED; \
} \
\
fx_operable_class *operable = fx_class_get_interface( \
c, \
FX_TYPE_OPERABLE); \
fx_operable_class *operable \
= fx_class_get_interface(c, FX_TYPE_OPERABLE); \
if (!operable || !operable->op_##name) { \
return FX_ERR_NOT_SUPPORTED; \
} \
@@ -674,9 +669,8 @@ FX_API fx_type_id fx_value_get_common_type(const fx_value *a, const fx_value *b)
return FX_ERR_NOT_SUPPORTED; \
} \
\
fx_operable_class *operable = fx_class_get_interface( \
c, \
FX_TYPE_OPERABLE); \
fx_operable_class *operable \
= fx_class_get_interface(c, FX_TYPE_OPERABLE); \
if (!operable || !operable->op_##name) { \
return FX_ERR_NOT_SUPPORTED; \
} \
@@ -695,9 +689,8 @@ FX_API fx_type_id fx_value_get_common_type(const fx_value *a, const fx_value *b)
return FX_ERR_NOT_SUPPORTED; \
} \
\
fx_operable_class *operable = fx_class_get_interface( \
c, \
FX_TYPE_OPERABLE); \
fx_operable_class *operable \
= fx_class_get_interface(c, FX_TYPE_OPERABLE); \
if (!operable || !operable->op_##name) { \
return FX_ERR_NOT_SUPPORTED; \
} \