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_WSTR(v) __FX_VALUE_CREATE(WSTR, v_wstr, v)
#define FX_CSTR(v) __FX_VALUE_CREATE(CSTR, v_cstr, 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_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) \ #define FX_VALUE_OBJECT(v) \
((fx_value) { \ ((fx_value) { \
.v_type = fx_object_query_type((fx_object *)v), \ .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; return FX_ERR_NOT_SUPPORTED;
} }
fx_comparable_class *comparable = fx_class_get_interface( fx_comparable_class *comparable
c, = fx_class_get_interface(c, FX_TYPE_COMPARABLE);
FX_TYPE_COMPARABLE);
if (!comparable || !comparable->c_compare) { if (!comparable || !comparable->c_compare) {
return FX_ERR_NOT_SUPPORTED; return FX_ERR_NOT_SUPPORTED;
} }
@@ -181,8 +180,8 @@ static fx_status value_change_string(fx_value *in, fx_value *out)
return status; return status;
} }
fx_string *result = fx_string_create_from_cstr( fx_string *result
fx_stringstream_ptr(strm)); = fx_string_create_from_cstr(fx_stringstream_ptr(strm));
fx_stringstream_unref(strm); fx_stringstream_unref(strm);
if (!result) { if (!result) {
@@ -212,9 +211,8 @@ fx_status fx_value_change_type(
return FX_ERR_NOT_SUPPORTED; return FX_ERR_NOT_SUPPORTED;
} }
fx_convertible_class *convertible = fx_class_get_interface( fx_convertible_class *convertible
c, = fx_class_get_interface(c, FX_TYPE_CONVERTIBLE);
FX_TYPE_CONVERTIBLE);
if (!convertible) { if (!convertible) {
return FX_ERR_NOT_SUPPORTED; return FX_ERR_NOT_SUPPORTED;
} }
@@ -375,17 +373,15 @@ fx_status fx_value_change_type(
return FX_ERR_NOT_SUPPORTED; \ return FX_ERR_NOT_SUPPORTED; \
} \ } \
\ \
fx_convertible_class *convertible = fx_class_get_interface( \ fx_convertible_class *convertible \
c, \ = fx_class_get_interface(c, FX_TYPE_CONVERTIBLE); \
FX_TYPE_CONVERTIBLE); \ if (!convertible || !convertible->c_to_##fx_type_name) { \
if (!convertible) { \
return FX_ERR_NOT_SUPPORTED; \ return FX_ERR_NOT_SUPPORTED; \
} \ } \
\ \
c_type_name result; \ c_type_name result; \
fx_status status = convertible->c_to_##fx_type_name( \ fx_status status \
v, \ = convertible->c_to_##fx_type_name(v, &result); \
&result); \
if (!FX_OK(status)) { \ if (!FX_OK(status)) { \
return 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; \ return FX_ERR_NOT_SUPPORTED; \
} \ } \
\ \
fx_operable_class *operable = fx_class_get_interface( \ fx_operable_class *operable \
c, \ = fx_class_get_interface(c, FX_TYPE_OPERABLE); \
FX_TYPE_OPERABLE); \
if (!operable || !operable->op_##name) { \ if (!operable || !operable->op_##name) { \
return FX_ERR_NOT_SUPPORTED; \ 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; \ return FX_ERR_NOT_SUPPORTED; \
} \ } \
\ \
fx_operable_class *operable = fx_class_get_interface( \ fx_operable_class *operable \
c, \ = fx_class_get_interface(c, FX_TYPE_OPERABLE); \
FX_TYPE_OPERABLE); \
if (!operable || !operable->op_##name) { \ if (!operable || !operable->op_##name) { \
return FX_ERR_NOT_SUPPORTED; \ 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; \ return FX_ERR_NOT_SUPPORTED; \
} \ } \
\ \
fx_operable_class *operable = fx_class_get_interface( \ fx_operable_class *operable \
c, \ = fx_class_get_interface(c, FX_TYPE_OPERABLE); \
FX_TYPE_OPERABLE); \
if (!operable || !operable->op_##name) { \ if (!operable || !operable->op_##name) { \
return FX_ERR_NOT_SUPPORTED; \ return FX_ERR_NOT_SUPPORTED; \
} \ } \