[gjs: 17/18] arg: Use smart pointers and early-return on functions
- From: Philip Chimento <pchimento src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs: 17/18] arg: Use smart pointers and early-return on functions
- Date: Fri, 20 Nov 2020 01:52:04 +0000 (UTC)
commit 19c5038189a674301ac1ae17ad3a186edd09ce51
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date: Mon Aug 10 22:12:03 2020 +0200
arg: Use smart pointers and early-return on functions
gi/arg.cpp | 289 +++++++++++++++++++++----------------------------------------
1 file changed, 100 insertions(+), 189 deletions(-)
---
diff --git a/gi/arg.cpp b/gi/arg.cpp
index d6bddf52..452427a0 100644
--- a/gi/arg.cpp
+++ b/gi/arg.cpp
@@ -100,11 +100,8 @@ static bool _gjs_enum_value_is_valid(JSContext* context, GIEnumInfo* enum_info,
found = false;
for (i = 0; i < n_values; ++i) {
- GIValueInfo *value_info;
-
- value_info = g_enum_info_get_value(enum_info, i);
+ GjsAutoValueInfo value_info = g_enum_info_get_value(enum_info, i);
int64_t enum_value = g_value_info_get_value(value_info);
- g_base_info_unref((GIBaseInfo *)value_info);
if (enum_value == value) {
found = true;
@@ -858,33 +855,24 @@ gjs_array_to_ptrarray(JSContext *context,
JS::RootedValue elem(context);
/* Always one extra element, to cater for null terminated arrays */
- void **array = (void **) g_malloc((length + 1) * sizeof(gpointer));
- array[length] = NULL;
+ GjsAutoPointer<void*> array = array_allocate<void*>(length + 1);
for (i = 0; i < length; i++) {
GIArgument arg;
gjs_arg_unset<void*>(&arg);
- bool success;
-
elem = JS::UndefinedValue();
if (!JS_GetElement(context, array_obj, i, &elem)) {
- g_free(array);
gjs_throw(context,
"Missing array element %u",
i);
return false;
}
- success = gjs_value_to_g_argument (context,
- elem,
- param_info,
- GJS_ARGUMENT_ARRAY_ELEMENT,
- transfer,
- &arg);
-
- if (!success) {
- g_free(array);
+ if (!gjs_value_to_g_argument(
+ context, elem, param_info,
+ GJS_ARGUMENT_ARRAY_ELEMENT, transfer,
+ &arg)) {
gjs_throw(context,
"Invalid element in array");
return false;
@@ -893,7 +881,7 @@ gjs_array_to_ptrarray(JSContext *context,
array[i] = gjs_arg_get<void*>(&arg);
}
- *arr_p = array;
+ *arr_p = g_steal_pointer(&array);
return true;
}
@@ -913,8 +901,7 @@ static bool gjs_array_to_flat_struct_array(JSContext* cx,
else
struct_size = g_struct_info_get_size(interface_info);
- GjsAutoPointer<uint8_t, void, g_free> flat_array =
- g_new0(uint8_t, struct_size * length);
+ GjsAutoPointer<uint8_t> flat_array = g_new0(uint8_t, struct_size * length);
JS::RootedObject array(cx, &array_value.toObject());
JS::RootedValue elem(cx);
@@ -1003,22 +990,17 @@ gjs_array_from_flat_gvalue_array(JSContext *context,
[[nodiscard]] static bool is_gvalue_flat_array(GITypeInfo* param_info,
GITypeTag element_type) {
- GIBaseInfo *interface_info;
GIInfoType info_type;
- bool result;
if (element_type != GI_TYPE_TAG_INTERFACE)
return false;
- interface_info = g_type_info_get_interface(param_info);
+ GjsAutoBaseInfo interface_info = g_type_info_get_interface(param_info);
info_type = g_base_info_get_type(interface_info);
/* Special case for GValue "flat arrays" */
- result = (is_gvalue(interface_info, info_type) &&
- !g_type_info_is_pointer(param_info));
- g_base_info_unref(interface_info);
-
- return result;
+ return (is_gvalue(interface_info, info_type) &&
+ !g_type_info_is_pointer(param_info));
}
GJS_JSAPI_RETURN_CONVENTION
@@ -1199,14 +1181,8 @@ char* gjs_argument_display_name(const char* arg_name,
tag = g_type_info_get_tag(type_info);
if (tag == GI_TYPE_TAG_INTERFACE) {
- GIBaseInfo *interface;
- const char *ret;
-
- interface = g_type_info_get_interface(type_info);
- ret = g_info_type_to_string(g_base_info_get_type(interface));
-
- g_base_info_unref(interface);
- return ret;
+ GjsAutoBaseInfo interface = g_type_info_get_interface(type_info);
+ return g_info_type_to_string(g_base_info_get_type(interface));
} else {
return g_type_tag_to_string(tag);
}
@@ -1950,24 +1926,19 @@ void gjs_gi_argument_init_default(GITypeInfo* type_info, GIArgument* arg) {
gjs_arg_unset<void*>(arg);
break;
case GI_TYPE_TAG_INTERFACE: {
- GIBaseInfo* interface_info;
GIInfoType interface_type;
- interface_info = g_type_info_get_interface(type_info);
- g_assert(interface_info != NULL);
+ GjsAutoBaseInfo interface_info =
+ g_type_info_get_interface(type_info);
+ g_assert(interface_info != nullptr);
interface_type = g_base_info_get_type(interface_info);
if (interface_type == GI_INFO_TYPE_ENUM ||
interface_type == GI_INFO_TYPE_FLAGS)
gjs_arg_unset<int, GI_TYPE_TAG_INTERFACE>(arg);
- else if (interface_type == GI_INFO_TYPE_VALUE)
- /* Better to use a non-NULL value holding NULL? */
- gjs_arg_unset<void*>(arg);
else
gjs_arg_unset<void*>(arg);
-
- g_base_info_unref( (GIBaseInfo*) interface_info);
} break;
case GI_TYPE_TAG_GHASH:
// Possibly better to return an empty hash table?
@@ -2181,7 +2152,8 @@ gjs_array_from_carray_internal (JSContext *context,
return false;
break;
case GI_TYPE_TAG_INTERFACE: {
- GIBaseInfo *interface_info = g_type_info_get_interface (param_info);
+ GjsAutoBaseInfo interface_info =
+ g_type_info_get_interface(param_info);
GIInfoType info_type = g_base_info_get_type (interface_info);
if (array_type != GI_ARRAY_TYPE_PTR_ARRAY &&
@@ -2204,11 +2176,8 @@ gjs_array_from_carray_internal (JSContext *context,
return false;
}
- g_base_info_unref(interface_info);
break;
}
-
- g_base_info_unref(interface_info);
}
/* fallthrough */
case GI_TYPE_TAG_GTYPE:
@@ -2246,22 +2215,16 @@ gjs_array_from_fixed_size_array (JSContext *context,
gpointer array)
{
gint length;
- GITypeInfo *param_info;
- bool res;
length = g_type_info_get_array_fixed_size(type_info);
g_assert (length != -1);
- param_info = g_type_info_get_param_type(type_info, 0);
-
- res = gjs_array_from_carray_internal(context, value_p,
- g_type_info_get_array_type(type_info),
- param_info, length, array);
-
- g_base_info_unref((GIBaseInfo*)param_info);
+ GjsAutoTypeInfo param_info = g_type_info_get_param_type(type_info, 0);
- return res;
+ return gjs_array_from_carray_internal(context, value_p,
+ g_type_info_get_array_type(type_info),
+ param_info, length, array);
}
bool
@@ -2271,17 +2234,11 @@ gjs_value_from_explicit_array(JSContext *context,
GIArgument *arg,
int length)
{
- GITypeInfo *param_info;
-
- param_info = g_type_info_get_param_type(type_info, 0);
+ GjsAutoTypeInfo param_info = g_type_info_get_param_type(type_info, 0);
- bool res = gjs_array_from_carray_internal(
+ return gjs_array_from_carray_internal(
context, value_p, g_type_info_get_array_type(type_info), param_info,
length, gjs_arg_get<void*>(arg));
-
- g_base_info_unref((GIBaseInfo*)param_info);
-
- return res;
}
GJS_JSAPI_RETURN_CONVENTION
@@ -2740,7 +2697,8 @@ gjs_value_from_g_argument (JSContext *context,
if (interface_type == GI_INFO_TYPE_STRUCT || interface_type == GI_INFO_TYPE_BOXED) {
if (is_gdk_atom(interface_info)) {
- GIFunctionInfo *atom_name_fun = g_struct_info_find_method(interface_info, "name");
+ GjsAutoFunctionInfo atom_name_fun =
+ g_struct_info_find_method(interface_info, "name");
GIArgument atom_name_ret;
g_function_info_invoke(atom_name_fun,
@@ -2749,8 +2707,6 @@ gjs_value_from_g_argument (JSContext *context,
&atom_name_ret,
nullptr);
- g_base_info_unref(atom_name_fun);
-
GjsAutoChar name = gjs_arg_get<char*>(&atom_name_ret);
if (g_strcmp0("NONE", name) == 0) {
value_p.setNull();
@@ -2843,17 +2799,14 @@ gjs_value_from_g_argument (JSContext *context,
/* OK, but no conversion to do */
} else if (g_type_info_get_array_type(type_info) == GI_ARRAY_TYPE_C) {
if (g_type_info_is_zero_terminated(type_info)) {
- GITypeInfo *param_info;
+ GjsAutoBaseInfo param_info =
+ g_type_info_get_interface(type_info);
param_info = g_type_info_get_param_type(type_info, 0);
- g_assert(param_info != NULL);
+ g_assert(param_info != nullptr);
- bool result = gjs_array_from_zero_terminated_c_array(
+ return gjs_array_from_zero_terminated_c_array(
context, value_p, param_info, gjs_arg_get<void*>(arg));
-
- g_base_info_unref((GIBaseInfo*) param_info);
-
- return result;
} else {
/* arrays with length are handled outside of this function */
g_assert(((void) "Use gjs_value_from_explicit_array() for "
@@ -2876,21 +2829,13 @@ gjs_value_from_g_argument (JSContext *context,
} else {
/* this assumes the array type is one of GArray, GPtrArray or
* GByteArray */
- GITypeInfo *param_info;
- bool result;
-
- param_info = g_type_info_get_param_type(type_info, 0);
- g_assert(param_info != NULL);
-
- result = gjs_array_from_boxed_array(context,
- value_p,
- g_type_info_get_array_type(type_info),
- param_info,
- arg);
-
- g_base_info_unref((GIBaseInfo*) param_info);
+ GjsAutoTypeInfo param_info =
+ g_type_info_get_param_type(type_info, 0);
+ g_assert(param_info != nullptr);
- return result;
+ return gjs_array_from_boxed_array(
+ context, value_p, g_type_info_get_array_type(type_info),
+ param_info, arg);
}
break;
@@ -2903,21 +2848,16 @@ gjs_value_from_g_argument (JSContext *context,
case GI_TYPE_TAG_GHASH:
{
- GITypeInfo *key_param_info, *val_param_info;
-
- key_param_info = g_type_info_get_param_type(type_info, 0);
- g_assert(key_param_info != NULL);
- val_param_info = g_type_info_get_param_type(type_info, 1);
- g_assert(val_param_info != NULL);
-
- bool result = gjs_object_from_g_hash(context, value_p,
- key_param_info, val_param_info,
- gjs_arg_get<GHashTable*>(arg));
-
- g_base_info_unref((GIBaseInfo*) key_param_info);
- g_base_info_unref((GIBaseInfo*) val_param_info);
-
- return result;
+ GjsAutoTypeInfo key_param_info =
+ g_type_info_get_param_type(type_info, 0);
+ GjsAutoTypeInfo val_param_info =
+ g_type_info_get_param_type(type_info, 1);
+ g_assert(key_param_info != nullptr);
+ g_assert(val_param_info != nullptr);
+
+ return gjs_object_from_g_hash(context, value_p, key_param_info,
+ val_param_info,
+ gjs_arg_get<GHashTable*>(arg));
}
break;
@@ -2937,12 +2877,12 @@ static bool gjs_g_arg_release_internal(JSContext *context,
GITypeTag type_tag,
GArgument *arg);
-typedef struct {
+struct GHR_closure {
JSContext *context;
- GITypeInfo *key_param_info, *val_param_info;
+ GjsAutoTypeInfo key_param_info, val_param_info;
GITransfer transfer;
bool failed;
-} GHR_closure;
+};
static gboolean
gjs_ghr_helper(gpointer key, gpointer val, gpointer user_data) {
@@ -2990,12 +2930,8 @@ gjs_g_arg_release_internal(JSContext *context,
GITypeTag type_tag,
GArgument *arg)
{
- bool failed;
-
g_assert(transfer != GI_TRANSFER_NOTHING);
- failed = false;
-
switch (type_tag) {
case GI_TYPE_TAG_VOID:
case GI_TYPE_TAG_BOOLEAN:
@@ -3087,7 +3023,7 @@ gjs_g_arg_release_internal(JSContext *context,
} else if (gtype == G_TYPE_NONE) {
if (transfer != TRANSFER_IN_NOTHING) {
gjs_throw(context, "Don't know how to release GArgument: not an object or boxed type");
- failed = true;
+ return false;
}
} else if (G_TYPE_IS_INSTANTIATABLE(gtype)) {
if (transfer != TRANSFER_IN_NOTHING) {
@@ -3110,10 +3046,10 @@ gjs_g_arg_release_internal(JSContext *context,
if (!gjs_arg_get<void*>(arg)) {
/* OK */
} else if (array_type == GI_ARRAY_TYPE_C) {
- GITypeInfo *param_info;
+ GjsAutoTypeInfo param_info =
+ g_type_info_get_param_type(type_info, 0);
GITypeTag element_type;
- param_info = g_type_info_get_param_type(type_info, 0);
element_type = g_type_info_get_tag(param_info);
if (is_gvalue_flat_array(param_info, element_type)) {
@@ -3125,7 +3061,6 @@ gjs_g_arg_release_internal(JSContext *context,
gjs_throw(context,
"Releasing a flat GValue array that was not fixed-size or was nested"
"inside another container. This is not supported (and will leak)");
- g_base_info_unref(param_info);
return false;
}
@@ -3136,7 +3071,6 @@ gjs_g_arg_release_internal(JSContext *context,
}
g_clear_pointer(&gjs_arg_member<void*>(arg), g_free);
- g_base_info_unref(param_info);
return true;
}
@@ -3183,22 +3117,23 @@ gjs_g_arg_release_internal(JSContext *context,
case GI_TYPE_TAG_GSLIST:
case GI_TYPE_TAG_ARRAY:
case GI_TYPE_TAG_GHASH:
- case GI_TYPE_TAG_ERROR:
+ case GI_TYPE_TAG_ERROR: {
+ GjsAutoPointer<void*, void, g_free> arg_array =
+ gjs_arg_steal<void**>(arg);
if (transfer != GI_TRANSFER_CONTAINER
&& type_needs_out_release(param_info, element_type)) {
if (g_type_info_is_zero_terminated (type_info)) {
gpointer *array;
GArgument elem;
- for (array = gjs_arg_get<void**>(arg); *array;
- array++) {
+ for (array = arg_array; *array; array++) {
gjs_arg_set(&elem, *array);
if (!gjs_g_arg_release_internal(context,
GI_TRANSFER_EVERYTHING,
param_info,
element_type,
&elem)) {
- failed = true;
+ return false;
}
}
} else {
@@ -3209,34 +3144,32 @@ gjs_g_arg_release_internal(JSContext *context,
g_assert(len != -1);
for (i = 0; i < len; i++) {
- gjs_arg_set(&elem, gjs_arg_get<void**>(arg)[i]);
+ gjs_arg_set(&elem, arg_array[i]);
if (!gjs_g_arg_release_internal(context,
GI_TRANSFER_EVERYTHING,
param_info,
element_type,
&elem)) {
- failed = true;
+ return false;
}
}
}
}
- g_clear_pointer(&gjs_arg_member<void*>(arg), g_free);
break;
+ }
case GI_TYPE_TAG_VOID:
default:
gjs_throw(context,
"Releasing a C array with explicit length, that was nested"
"inside another container. This is not supported (and will leak)");
- failed = true;
+ return false;
}
-
- g_base_info_unref((GIBaseInfo*) param_info);
} else if (array_type == GI_ARRAY_TYPE_ARRAY) {
- GITypeInfo *param_info;
GITypeTag element_type;
- param_info = g_type_info_get_param_type(type_info, 0);
+ GjsAutoTypeInfo param_info =
+ g_type_info_get_param_type(type_info, 0);
element_type = g_type_info_get_tag(param_info);
switch (element_type) {
@@ -3263,12 +3196,12 @@ gjs_g_arg_release_internal(JSContext *context,
case GI_TYPE_TAG_GLIST:
case GI_TYPE_TAG_GSLIST:
case GI_TYPE_TAG_GHASH:
- case GI_TYPE_TAG_ERROR:
- if (transfer == GI_TRANSFER_CONTAINER) {
- g_clear_pointer(&gjs_arg_member<GArray*>(arg),
- g_array_unref);
- } else if (type_needs_out_release (param_info, element_type)) {
- GArray* array = gjs_arg_get<GArray*>(arg);
+ case GI_TYPE_TAG_ERROR: {
+ GjsAutoPointer<GArray, GArray, g_array_unref> array =
+ gjs_arg_steal<GArray*>(arg);
+
+ if (transfer != GI_TRANSFER_CONTAINER &&
+ type_needs_out_release(param_info, element_type)) {
guint i;
for (i = 0; i < array->len; i++) {
@@ -3276,34 +3209,32 @@ gjs_g_arg_release_internal(JSContext *context,
gjs_arg_set(&arg_iter,
g_array_index(array, gpointer, i));
- failed = !gjs_g_arg_release_internal(
- context, transfer, param_info, element_type,
- &arg_iter);
+ if (!gjs_g_arg_release_internal(
+ context, transfer, param_info, element_type,
+ &arg_iter))
+ return false;
}
-
- g_array_free (array, true);
}
break;
+ }
case GI_TYPE_TAG_VOID:
default:
gjs_throw(context,
"Don't know how to release GArray element-type %d",
element_type);
- failed = true;
+ return false;
}
- g_base_info_unref((GIBaseInfo*) param_info);
} else if (array_type == GI_ARRAY_TYPE_BYTE_ARRAY) {
g_clear_pointer(&gjs_arg_member<GByteArray*>(arg),
g_byte_array_unref);
} else if (array_type == GI_ARRAY_TYPE_PTR_ARRAY) {
- GITypeInfo *param_info;
- GPtrArray *array;
-
- param_info = g_type_info_get_param_type(type_info, 0);
- array = gjs_arg_get<GPtrArray*>(arg);
+ GjsAutoTypeInfo param_info =
+ g_type_info_get_param_type(type_info, 0);
+ GjsAutoPointer<GPtrArray, GPtrArray, g_ptr_array_unref> array =
+ gjs_arg_steal<GPtrArray*>(arg);
if (transfer != GI_TRANSFER_CONTAINER) {
guint i;
@@ -3312,14 +3243,11 @@ gjs_g_arg_release_internal(JSContext *context,
GArgument arg_iter;
gjs_arg_set(&arg_iter, g_ptr_array_index(array, i));
- failed = !gjs_g_argument_release(context, transfer,
- param_info, &arg_iter);
+ if (!gjs_g_argument_release(context, transfer, param_info,
+ &arg_iter))
+ return false;
}
}
-
- g_ptr_array_free(array, true);
-
- g_base_info_unref((GIBaseInfo*) param_info);
} else {
g_assert_not_reached();
}
@@ -3336,8 +3264,10 @@ gjs_g_arg_release_internal(JSContext *context,
case GI_TYPE_TAG_GHASH:
if (gjs_arg_get<GHashTable*>(arg)) {
+ GjsAutoPointer<GHashTable, GHashTable, g_hash_table_destroy>
+ hash_table = gjs_arg_steal<GHashTable*>(arg);
if (transfer == GI_TRANSFER_CONTAINER)
- g_hash_table_steal_all(gjs_arg_get<GHashTable*>(arg));
+ g_hash_table_steal_all(hash_table);
else {
GHR_closure c = {
context, NULL, NULL,
@@ -3346,21 +3276,15 @@ gjs_g_arg_release_internal(JSContext *context,
};
c.key_param_info = g_type_info_get_param_type(type_info, 0);
- g_assert(c.key_param_info != NULL);
+ g_assert(c.key_param_info != nullptr);
c.val_param_info = g_type_info_get_param_type(type_info, 1);
- g_assert(c.val_param_info != NULL);
-
- g_hash_table_foreach_steal(gjs_arg_get<GHashTable*>(arg),
- gjs_ghr_helper, &c);
+ g_assert(c.val_param_info != nullptr);
- failed = c.failed;
+ g_hash_table_foreach_steal(hash_table, gjs_ghr_helper, &c);
- g_base_info_unref ((GIBaseInfo *)c.key_param_info);
- g_base_info_unref ((GIBaseInfo *)c.val_param_info);
+ if (c.failed)
+ return false;
}
-
- g_clear_pointer(&gjs_arg_member<GHashTable*>(arg),
- g_hash_table_destroy);
}
break;
@@ -3370,7 +3294,7 @@ gjs_g_arg_release_internal(JSContext *context,
return false;
}
- return !failed;
+ return true;
}
bool
@@ -3426,10 +3350,8 @@ gjs_g_argument_release_in_arg(JSContext *context,
bool gjs_g_argument_release_in_array(JSContext* context, GITransfer transfer,
GITypeInfo* type_info, unsigned length,
GIArgument* arg) {
- GITypeInfo *param_type;
GArgument elem;
guint i;
- bool ret = true;
GITypeTag type_tag;
if (transfer != GI_TRANSFER_NOTHING)
@@ -3438,14 +3360,13 @@ bool gjs_g_argument_release_in_array(JSContext* context, GITransfer transfer,
gjs_debug_marshal(GJS_DEBUG_GFUNCTION,
"Releasing GArgument array in param");
- void** array = gjs_arg_get<void**>(arg);
-
- param_type = g_type_info_get_param_type(type_info, 0);
+ GjsAutoPointer<void*, void, g_free> array = gjs_arg_steal<void**>(arg);
+ GjsAutoTypeInfo param_type = g_type_info_get_param_type(type_info, 0);
type_tag = g_type_info_get_tag(param_type);
if (is_gvalue_flat_array(param_type, type_tag)) {
for (i = 0; i < length; i++) {
- GValue *v = ((GValue*)array) + i;
+ GValue* v = reinterpret_cast<GValue*>(array.get()) + i;
g_value_unset(v);
}
}
@@ -3455,25 +3376,19 @@ bool gjs_g_argument_release_in_array(JSContext* context, GITransfer transfer,
gjs_arg_set(&elem, array[i]);
if (!gjs_g_arg_release_internal(context, (GITransfer) TRANSFER_IN_NOTHING,
param_type, type_tag, &elem)) {
- ret = false;
- break;
+ return false;
}
}
}
- g_base_info_unref(param_type);
- g_free(array);
-
- return ret;
+ return true;
}
bool gjs_g_argument_release_out_array(JSContext* context, GITransfer transfer,
GITypeInfo* type_info, unsigned length,
GIArgument* arg) {
- GITypeInfo *param_type;
GArgument elem;
guint i;
- bool ret = true;
GITypeTag type_tag;
if (transfer == GI_TRANSFER_NOTHING)
@@ -3482,9 +3397,8 @@ bool gjs_g_argument_release_out_array(JSContext* context, GITransfer transfer,
gjs_debug_marshal(GJS_DEBUG_GFUNCTION,
"Releasing GArgument array out param");
- void** array = gjs_arg_get<void**>(arg);
-
- param_type = g_type_info_get_param_type(type_info, 0);
+ GjsAutoPointer<void*, void, g_free> array = gjs_arg_steal<void**>(arg);
+ GjsAutoTypeInfo param_type = g_type_info_get_param_type(type_info, 0);
type_tag = g_type_info_get_tag(param_type);
if (transfer != GI_TRANSFER_CONTAINER &&
@@ -3497,13 +3411,10 @@ bool gjs_g_argument_release_out_array(JSContext* context, GITransfer transfer,
param_type,
type_tag,
&elem)) {
- ret = false;
+ return false;
}
}
}
- g_base_info_unref(param_type);
- g_free(array);
-
- return ret;
+ return true;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]