From 883b0b24b1221a691bd5a399faf7a67d46baf934 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 28 May 2026 20:51:55 +0100 Subject: [PATCH] fx: improve fx_value reference management --- fx/include/fx/value.h | 5 +++++ fx/value.c | 41 +++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/fx/include/fx/value.h b/fx/include/fx/value.h index cb19216..7995aaa 100644 --- a/fx/include/fx/value.h +++ b/fx/include/fx/value.h @@ -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), \ diff --git a/fx/value.c b/fx/value.c index 378ff0f..c049dc5 100644 --- a/fx/value.c +++ b/fx/value.c @@ -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; \ } \