From cd8fbd68415d87d95aab29e102de73f498ab2009 Mon Sep 17 00:00:00 2001 From: Mischan Toosarani-Hausberger Date: Thu, 6 Feb 2025 12:05:15 +0100 Subject: [PATCH 01/16] Base implementation --- include/sentry.h | 14 ++++++++++++ src/sentry_value.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/include/sentry.h b/include/sentry.h index 39f4b2cc7..3f52ec8c1 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -244,6 +244,20 @@ SENTRY_API int sentry_value_remove_by_key(sentry_value_t value, const char *k); SENTRY_API int sentry_value_remove_by_key_n( sentry_value_t value, const char *k, size_t k_len); +/** + * WIP: Iteration. + */ +struct sentry_item_iter_s; +typedef struct sentry_item_iter_s sentry_item_iter_t; + +SENTRY_API sentry_item_iter_t *sentry_value_new_item_iter(sentry_value_t value); +SENTRY_API void sentry_value_item_iter_next(sentry_item_iter_t *item_iter); +SENTRY_API int sentry_value_item_iter_valid(sentry_item_iter_t *item_iter); +SENTRY_API const char *sentry_value_item_iter_get_key( + sentry_item_iter_t *item_iter); +SENTRY_API sentry_value_t sentry_value_item_iter_get_value( + sentry_item_iter_t *item_iter); + /** * Appends a value to a list. * diff --git a/src/sentry_value.c b/src/sentry_value.c index 1258ee818..ff37d4ef4 100644 --- a/src/sentry_value.c +++ b/src/sentry_value.c @@ -778,6 +778,62 @@ sentry_value_get_by_key_owned(sentry_value_t value, const char *k) return rv; } +/** + * WIP: Iteration. + */ + +struct sentry_item_iter_s { + size_t len; + obj_pair_t *pairs; + size_t index; +}; + +sentry_item_iter_t * +sentry_value_new_item_iter(sentry_value_t value) +{ + const thing_t *thing = value_as_thing(value); + if (thing && thing_get_type(thing) == THING_TYPE_OBJECT) { + obj_t *o = thing->payload._ptr; + sentry_item_iter_t *item_iter = SENTRY_MAKE(sentry_item_iter_t); + item_iter->len = o->len; + item_iter->pairs = o->pairs; + item_iter->index = 0; + return item_iter; + } + return NULL; +} + +void sentry_value_item_iter_next(sentry_item_iter_t *item_iter) +{ + item_iter->index++; +} + +const char * +sentry_value_item_iter_get_key(sentry_item_iter_t *item_iter) +{ + if (item_iter->index >= item_iter->len) { + return NULL; + } + return item_iter->pairs[item_iter->index].k; +} + +sentry_value_t +sentry_value_item_iter_get_value(sentry_item_iter_t *item_iter) +{ + if (item_iter->index >= item_iter->len) { + return sentry_value_new_null(); + } + return item_iter->pairs[item_iter->index].v; +} + +int +sentry_value_item_iter_valid(sentry_item_iter_t *item_iter) +{ + return item_iter->index < item_iter->len && item_iter->pairs != NULL; +} + +// *** + sentry_value_t sentry_value_get_by_index(sentry_value_t value, size_t index) { From bf04599ef56864cf2743083fb435a5070c05af31 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Thu, 6 Feb 2025 14:25:02 +0100 Subject: [PATCH 02/16] Add `sentry_value_item_iter_remove_item(it)` --- include/sentry.h | 1 + src/sentry_value.c | 28 +++++++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/include/sentry.h b/include/sentry.h index 3f52ec8c1..5b2982809 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -257,6 +257,7 @@ SENTRY_API const char *sentry_value_item_iter_get_key( sentry_item_iter_t *item_iter); SENTRY_API sentry_value_t sentry_value_item_iter_get_value( sentry_item_iter_t *item_iter); +SENTRY_API void sentry_value_item_iter_erase(sentry_item_iter_t *item_iter); /** * Appends a value to a list. diff --git a/src/sentry_value.c b/src/sentry_value.c index ff37d4ef4..bda6521ca 100644 --- a/src/sentry_value.c +++ b/src/sentry_value.c @@ -783,7 +783,7 @@ sentry_value_get_by_key_owned(sentry_value_t value, const char *k) */ struct sentry_item_iter_s { - size_t len; + size_t *len; // Pointer to length! obj_pair_t *pairs; size_t index; }; @@ -795,7 +795,7 @@ sentry_value_new_item_iter(sentry_value_t value) if (thing && thing_get_type(thing) == THING_TYPE_OBJECT) { obj_t *o = thing->payload._ptr; sentry_item_iter_t *item_iter = SENTRY_MAKE(sentry_item_iter_t); - item_iter->len = o->len; + item_iter->len = &o->len; item_iter->pairs = o->pairs; item_iter->index = 0; return item_iter; @@ -803,7 +803,8 @@ sentry_value_new_item_iter(sentry_value_t value) return NULL; } -void sentry_value_item_iter_next(sentry_item_iter_t *item_iter) +void +sentry_value_item_iter_next(sentry_item_iter_t *item_iter) { item_iter->index++; } @@ -811,7 +812,7 @@ void sentry_value_item_iter_next(sentry_item_iter_t *item_iter) const char * sentry_value_item_iter_get_key(sentry_item_iter_t *item_iter) { - if (item_iter->index >= item_iter->len) { + if (item_iter->index >= *item_iter->len) { return NULL; } return item_iter->pairs[item_iter->index].k; @@ -820,7 +821,7 @@ sentry_value_item_iter_get_key(sentry_item_iter_t *item_iter) sentry_value_t sentry_value_item_iter_get_value(sentry_item_iter_t *item_iter) { - if (item_iter->index >= item_iter->len) { + if (item_iter->index >= *item_iter->len) { return sentry_value_new_null(); } return item_iter->pairs[item_iter->index].v; @@ -829,10 +830,23 @@ sentry_value_item_iter_get_value(sentry_item_iter_t *item_iter) int sentry_value_item_iter_valid(sentry_item_iter_t *item_iter) { - return item_iter->index < item_iter->len && item_iter->pairs != NULL; + return item_iter->index < *item_iter->len && item_iter->pairs != NULL; } -// *** +void +sentry_value_item_iter_erase(sentry_item_iter_t *item_iter) +{ + if (item_iter->index >= *item_iter->len) { + return; + } + obj_pair_t *pair = &item_iter->pairs[item_iter->index]; + sentry_free(pair->k); + sentry_value_decref(pair->v); + memmove(item_iter->pairs + item_iter->index, + item_iter->pairs + item_iter->index + 1, + (*item_iter->len - item_iter->index - 1) * sizeof(item_iter->pairs[0])); + (*item_iter->len)--; +} sentry_value_t sentry_value_get_by_index(sentry_value_t value, size_t index) From 2b7c381eb63ffee69bd84f810f7932f55e949042 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 11:47:22 +0100 Subject: [PATCH 03/16] Handle frozen objects --- include/sentry.h | 2 +- src/sentry_value.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/sentry.h b/include/sentry.h index 5b2982809..f8567b153 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -257,7 +257,7 @@ SENTRY_API const char *sentry_value_item_iter_get_key( sentry_item_iter_t *item_iter); SENTRY_API sentry_value_t sentry_value_item_iter_get_value( sentry_item_iter_t *item_iter); -SENTRY_API void sentry_value_item_iter_erase(sentry_item_iter_t *item_iter); +SENTRY_API int sentry_value_item_iter_erase(sentry_item_iter_t *item_iter); /** * Appends a value to a list. diff --git a/src/sentry_value.c b/src/sentry_value.c index bda6521ca..2ccef8067 100644 --- a/src/sentry_value.c +++ b/src/sentry_value.c @@ -786,6 +786,7 @@ struct sentry_item_iter_s { size_t *len; // Pointer to length! obj_pair_t *pairs; size_t index; + int frozen; }; sentry_item_iter_t * @@ -798,6 +799,7 @@ sentry_value_new_item_iter(sentry_value_t value) item_iter->len = &o->len; item_iter->pairs = o->pairs; item_iter->index = 0; + item_iter->frozen = thing_is_frozen(thing); return item_iter; } return NULL; @@ -833,11 +835,11 @@ sentry_value_item_iter_valid(sentry_item_iter_t *item_iter) return item_iter->index < *item_iter->len && item_iter->pairs != NULL; } -void +int sentry_value_item_iter_erase(sentry_item_iter_t *item_iter) { - if (item_iter->index >= *item_iter->len) { - return; + if (item_iter->frozen || item_iter->index >= *item_iter->len) { + return 1; } obj_pair_t *pair = &item_iter->pairs[item_iter->index]; sentry_free(pair->k); @@ -846,6 +848,7 @@ sentry_value_item_iter_erase(sentry_item_iter_t *item_iter) item_iter->pairs + item_iter->index + 1, (*item_iter->len - item_iter->index - 1) * sizeof(item_iter->pairs[0])); (*item_iter->len)--; + return 0; } sentry_value_t From d1f42e4d2ee30b32d90b907a884efb691ff987f4 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 12:03:10 +0100 Subject: [PATCH 04/16] Add descriptions --- include/sentry.h | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/include/sentry.h b/include/sentry.h index f8567b153..27b7fc302 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -245,18 +245,45 @@ SENTRY_API int sentry_value_remove_by_key_n( sentry_value_t value, const char *k, size_t k_len); /** - * WIP: Iteration. + * Map items iterator. + * + * It's used to iterate over the key-value pairs of an object. */ struct sentry_item_iter_s; typedef struct sentry_item_iter_s sentry_item_iter_t; +/** + * Creates a new map items iterator. + */ SENTRY_API sentry_item_iter_t *sentry_value_new_item_iter(sentry_value_t value); + +/** + * Frees an item iterator. + */ SENTRY_API void sentry_value_item_iter_next(sentry_item_iter_t *item_iter); + +/** + * Returns true if the iterator is valid. + */ SENTRY_API int sentry_value_item_iter_valid(sentry_item_iter_t *item_iter); + +/** + * Returns the key the current item. + */ SENTRY_API const char *sentry_value_item_iter_get_key( sentry_item_iter_t *item_iter); + +/** + * Returns the value the current item. + */ SENTRY_API sentry_value_t sentry_value_item_iter_get_value( sentry_item_iter_t *item_iter); + +/** + * Erases the current item and advances the iterator to the next item. + * + * Returns false if the iterator is exhausted or if the map is frozen. + */ SENTRY_API int sentry_value_item_iter_erase(sentry_item_iter_t *item_iter); /** @@ -1162,7 +1189,7 @@ SENTRY_API void sentry_options_set_require_user_consent( sentry_options_t *opts, int val); /** - * Returns true if user consent is required. + * ` true if user consent is required. */ SENTRY_API int sentry_options_get_require_user_consent( const sentry_options_t *opts); From 057223789cf2234a412ef41e7b6d4935f705566e Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 12:17:46 +0100 Subject: [PATCH 05/16] Test iteration --- tests/unit/test_value.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index 8e738bc1d..b75e950c6 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -290,6 +290,39 @@ SENTRY_TEST(value_object) sentry_value_decref(val); } +SENTRY_TEST(value_object_iteration) +{ + sentry_value_t val = sentry_value_new_object(); + for (size_t i = 0; i < 10; i++) { + char key[100]; + sprintf(key, "key%d", (int)i); + sentry_value_set_by_key(val, key, sentry_value_new_int32((int32_t)i)); + } + + sentry_item_iter_t *it = sentry_value_new_item_iter(val); + TEST_CHECK(it != NULL); + + size_t count = 0; + for(; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { + const char *key = sentry_value_item_iter_get_key(it); + sentry_value_t value = sentry_value_item_iter_get_value(it); + + TEST_CHECK(key != NULL); + TEST_CHECK(sentry_value_get_type(value) == SENTRY_VALUE_TYPE_INT32); + + int32_t expected_value; + sscanf(key, "key%d", &expected_value); + TEST_CHECK(sentry_value_as_int32(value) == expected_value); + + count++; + } + + TEST_CHECK(count == 10); + + sentry_free(it); + sentry_value_decref(val); +} + SENTRY_TEST(value_object_merge) { sentry_value_t dst = sentry_value_new_object(); From 338913c6cecba32a0358cf7d22c2919dbabe2c06 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 12:24:43 +0100 Subject: [PATCH 06/16] Test item erase --- tests/unit/test_value.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index b75e950c6..86a834097 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -320,6 +320,19 @@ SENTRY_TEST(value_object_iteration) TEST_CHECK(count == 10); sentry_free(it); + + count = 0; + it = sentry_value_new_item_iter(val); + const char* prev_key; + while(sentry_value_item_iter_erase(it)) { + TEST_CHECK(strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); + prev_key = sentry_value_item_iter_get_key(it); + } + TEST_CHECK(sentry_value_get_length(val) == 0); + TEST_CHECK(count == 0); + + sentry_free(it); + sentry_value_decref(val); } From 1ee402d1b3e1e72cf3b12e53718a61d062818c24 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 12:26:56 +0100 Subject: [PATCH 07/16] make format --- tests/unit/test_value.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index 86a834097..97b755982 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -303,7 +303,7 @@ SENTRY_TEST(value_object_iteration) TEST_CHECK(it != NULL); size_t count = 0; - for(; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { + for (; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { const char *key = sentry_value_item_iter_get_key(it); sentry_value_t value = sentry_value_item_iter_get_value(it); @@ -323,8 +323,8 @@ SENTRY_TEST(value_object_iteration) count = 0; it = sentry_value_new_item_iter(val); - const char* prev_key; - while(sentry_value_item_iter_erase(it)) { + const char *prev_key; + while (sentry_value_item_iter_erase(it)) { TEST_CHECK(strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); prev_key = sentry_value_item_iter_get_key(it); } From eb2bbb192b6a24d38eae01d3902c2675bb935033 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 12:48:59 +0100 Subject: [PATCH 08/16] Fix tests --- src/sentry_value.c | 4 ---- tests/unit/test_value.c | 19 +++++++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/sentry_value.c b/src/sentry_value.c index 2ccef8067..25c1377b5 100644 --- a/src/sentry_value.c +++ b/src/sentry_value.c @@ -778,10 +778,6 @@ sentry_value_get_by_key_owned(sentry_value_t value, const char *k) return rv; } -/** - * WIP: Iteration. - */ - struct sentry_item_iter_s { size_t *len; // Pointer to length! obj_pair_t *pairs; diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index 97b755982..7f3f164f2 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -312,24 +312,27 @@ SENTRY_TEST(value_object_iteration) int32_t expected_value; sscanf(key, "key%d", &expected_value); - TEST_CHECK(sentry_value_as_int32(value) == expected_value); + TEST_CHECK_INT_EQUAL(sentry_value_as_int32(value), expected_value); count++; } - TEST_CHECK(count == 10); + TEST_CHECK_INT_EQUAL(count, 10); sentry_free(it); count = 0; it = sentry_value_new_item_iter(val); - const char *prev_key; - while (sentry_value_item_iter_erase(it)) { - TEST_CHECK(strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); - prev_key = sentry_value_item_iter_get_key(it); + const char *prev_key = ""; + while (sentry_value_item_iter_erase(it) == 0) { + if (sentry_value_item_iter_valid(it)) { + TEST_CHECK(strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); + prev_key = sentry_value_item_iter_get_key(it); + } + count++; } - TEST_CHECK(sentry_value_get_length(val) == 0); - TEST_CHECK(count == 0); + TEST_CHECK_INT_EQUAL(sentry_value_get_length(val), 0); + TEST_CHECK_INT_EQUAL(count, 10); sentry_free(it); From 5254d252845c0ee82a64588f10995e75ca955bdb Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 14:35:34 +0100 Subject: [PATCH 09/16] Fix and expand tests --- tests/unit/test_value.c | 94 ++++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 29 deletions(-) diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index 7f3f164f2..c846508bf 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -292,51 +292,87 @@ SENTRY_TEST(value_object) SENTRY_TEST(value_object_iteration) { - sentry_value_t val = sentry_value_new_object(); + sentry_value_t obj = sentry_value_new_object(); + + // Populate. for (size_t i = 0; i < 10; i++) { char key[100]; sprintf(key, "key%d", (int)i); - sentry_value_set_by_key(val, key, sentry_value_new_int32((int32_t)i)); + sentry_value_set_by_key(obj, key, sentry_value_new_int32((int32_t)i)); } - sentry_item_iter_t *it = sentry_value_new_item_iter(val); - TEST_CHECK(it != NULL); - - size_t count = 0; - for (; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { - const char *key = sentry_value_item_iter_get_key(it); - sentry_value_t value = sentry_value_item_iter_get_value(it); + // Iterate over items. + { + sentry_item_iter_t *it = sentry_value_new_item_iter(obj); + size_t count = 0; + TEST_CHECK(it != NULL); + for (; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { + const char *key = sentry_value_item_iter_get_key(it); + sentry_value_t value = sentry_value_item_iter_get_value(it); - TEST_CHECK(key != NULL); - TEST_CHECK(sentry_value_get_type(value) == SENTRY_VALUE_TYPE_INT32); + TEST_CHECK(key != NULL); + TEST_CHECK(sentry_value_get_type(value) == SENTRY_VALUE_TYPE_INT32); - int32_t expected_value; - sscanf(key, "key%d", &expected_value); - TEST_CHECK_INT_EQUAL(sentry_value_as_int32(value), expected_value); + int32_t key_idx; + sscanf(key, "key%d", &key_idx); + TEST_CHECK_INT_EQUAL(key_idx, sentry_value_as_int32(value)); - count++; + count++; + } + TEST_CHECK_INT_EQUAL(count, 10); + sentry_free(it); } - TEST_CHECK_INT_EQUAL(count, 10); - - sentry_free(it); - - count = 0; - it = sentry_value_new_item_iter(val); - const char *prev_key = ""; - while (sentry_value_item_iter_erase(it) == 0) { - if (sentry_value_item_iter_valid(it)) { + // Erase even-numbered items. + { + sentry_item_iter_t *it = sentry_value_new_item_iter(obj); + TEST_CHECK(it != NULL); + size_t count = 0; + const char *prev_key = ""; + size_t i = 0; + while (sentry_value_item_iter_valid(it)) { TEST_CHECK(strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); prev_key = sentry_value_item_iter_get_key(it); + if (i % 2 == 0) { + int err = sentry_value_item_iter_erase(it); + TEST_CHECK_INT_EQUAL(err, 0); + } else { + sentry_value_item_iter_next(it); + count++; + } + i++; } - count++; + TEST_CHECK_INT_EQUAL(sentry_value_get_length(obj), 5); + TEST_CHECK_INT_EQUAL(count, 5); + sentry_free(it); } - TEST_CHECK_INT_EQUAL(sentry_value_get_length(val), 0); - TEST_CHECK_INT_EQUAL(count, 10); - sentry_free(it); + // Verify if the right items were removed. + { + sentry_item_iter_t *it = sentry_value_new_item_iter(obj); + for (; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { + const char *key = sentry_value_item_iter_get_key(it); + int32_t key_idx; + sscanf(key, "key%d", &key_idx); + TEST_CHECK(key_idx % 2 != 0); + } + sentry_free(it); + } - sentry_value_decref(val); + // Erase the rest of the items. + { + sentry_item_iter_t *it = sentry_value_new_item_iter(obj); + size_t count = 0; + TEST_CHECK(it != NULL); + while (sentry_value_item_iter_erase(it) == 0) { + count++; + } + TEST_CHECK_INT_EQUAL(sentry_value_get_length(obj), 0); + TEST_CHECK_INT_EQUAL(count, 5); + sentry_free(it); + } + + sentry_value_decref(obj); } SENTRY_TEST(value_object_merge) From c0974e38f5c86a3fbe9d7cbd98490b5ea6fbd15a Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 14:36:34 +0100 Subject: [PATCH 10/16] Formatting --- tests/unit/test_value.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index c846508bf..88306f88f 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -306,7 +306,8 @@ SENTRY_TEST(value_object_iteration) sentry_item_iter_t *it = sentry_value_new_item_iter(obj); size_t count = 0; TEST_CHECK(it != NULL); - for (; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { + for (; sentry_value_item_iter_valid(it); + sentry_value_item_iter_next(it)) { const char *key = sentry_value_item_iter_get_key(it); sentry_value_t value = sentry_value_item_iter_get_value(it); @@ -331,7 +332,8 @@ SENTRY_TEST(value_object_iteration) const char *prev_key = ""; size_t i = 0; while (sentry_value_item_iter_valid(it)) { - TEST_CHECK(strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); + TEST_CHECK( + strcmp(prev_key, sentry_value_item_iter_get_key(it)) != 0); prev_key = sentry_value_item_iter_get_key(it); if (i % 2 == 0) { int err = sentry_value_item_iter_erase(it); @@ -350,7 +352,8 @@ SENTRY_TEST(value_object_iteration) // Verify if the right items were removed. { sentry_item_iter_t *it = sentry_value_new_item_iter(obj); - for (; sentry_value_item_iter_valid(it); sentry_value_item_iter_next(it)) { + for (; sentry_value_item_iter_valid(it); + sentry_value_item_iter_next(it)) { const char *key = sentry_value_item_iter_get_key(it); int32_t key_idx; sscanf(key, "key%d", &key_idx); From 7512069c7e715f0118b0ac5c2b2b2b0d0d511819 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 14:43:15 +0100 Subject: [PATCH 11/16] Fix blunder --- include/sentry.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sentry.h b/include/sentry.h index 27b7fc302..27339e8f2 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -1189,7 +1189,7 @@ SENTRY_API void sentry_options_set_require_user_consent( sentry_options_t *opts, int val); /** - * ` true if user consent is required. + * Returns true if user consent is required. */ SENTRY_API int sentry_options_get_require_user_consent( const sentry_options_t *opts); From 1a1cb69b218b07dec513d20aa97fd48d8e681e08 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 14:48:33 +0100 Subject: [PATCH 12/16] Update comments --- include/sentry.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/include/sentry.h b/include/sentry.h index 27339e8f2..4d32db7cf 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -245,25 +245,27 @@ SENTRY_API int sentry_value_remove_by_key_n( sentry_value_t value, const char *k, size_t k_len); /** - * Map items iterator. + * Map item iterator. * - * It's used to iterate over the key-value pairs of an object. + * It's used to iterate over the key-value pairs of a map. */ struct sentry_item_iter_s; typedef struct sentry_item_iter_s sentry_item_iter_t; /** - * Creates a new map items iterator. + * Creates a new map item iterator. + * + * Returns NULL if the given value is not a map. */ SENTRY_API sentry_item_iter_t *sentry_value_new_item_iter(sentry_value_t value); /** - * Frees an item iterator. + * Advances the item iterator to the next item. */ SENTRY_API void sentry_value_item_iter_next(sentry_item_iter_t *item_iter); /** - * Returns true if the iterator is valid. + * Returns true if the item iterator is valid. */ SENTRY_API int sentry_value_item_iter_valid(sentry_item_iter_t *item_iter); From dcc5f2089896cffcf9a65ba3cfcf72a856165080 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 7 Feb 2025 14:56:29 +0100 Subject: [PATCH 13/16] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba5eda662..7ee4e9cdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Add map item iterators. ([#1143](https://github.com/getsentry/sentry-native/pull/1143)) + ## 0.7.20 **Features**: From 959c375fc4f151ddd0ee948963604ebeb4847d7d Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 14 Feb 2025 12:31:26 +0100 Subject: [PATCH 14/16] Apply suggestions from code review Co-authored-by: Mischan Toosarani-Hausberger --- include/sentry.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/include/sentry.h b/include/sentry.h index 4d32db7cf..a00f1b151 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -245,17 +245,17 @@ SENTRY_API int sentry_value_remove_by_key_n( sentry_value_t value, const char *k, size_t k_len); /** - * Map item iterator. + * Object item iterator. * - * It's used to iterate over the key-value pairs of a map. + * It's used to iterate over the key-value pairs of an object. */ struct sentry_item_iter_s; typedef struct sentry_item_iter_s sentry_item_iter_t; /** - * Creates a new map item iterator. + * Creates a new object item iterator. * - * Returns NULL if the given value is not a map. + * Returns `NULL` if the given value is not an object. */ SENTRY_API sentry_item_iter_t *sentry_value_new_item_iter(sentry_value_t value); @@ -270,13 +270,17 @@ SENTRY_API void sentry_value_item_iter_next(sentry_item_iter_t *item_iter); SENTRY_API int sentry_value_item_iter_valid(sentry_item_iter_t *item_iter); /** - * Returns the key the current item. + * Returns the key to the current item. + * + * Returns a `NULL` pointer if the iterator is invalid. */ SENTRY_API const char *sentry_value_item_iter_get_key( sentry_item_iter_t *item_iter); /** - * Returns the value the current item. + * Returns the value of the current item. + * + * Returns a null value if the iterator is invalid. */ SENTRY_API sentry_value_t sentry_value_item_iter_get_value( sentry_item_iter_t *item_iter); @@ -284,7 +288,7 @@ SENTRY_API sentry_value_t sentry_value_item_iter_get_value( /** * Erases the current item and advances the iterator to the next item. * - * Returns false if the iterator is exhausted or if the map is frozen. + * Returns 0 if the iterator is exhausted or the object is frozen. */ SENTRY_API int sentry_value_item_iter_erase(sentry_item_iter_t *item_iter); From 1accd8994f4147af74509588a736db14c8e66755 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 14 Feb 2025 12:36:53 +0100 Subject: [PATCH 15/16] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ee4e9cdb..9b3fc7446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -- Add map item iterators. ([#1143](https://github.com/getsentry/sentry-native/pull/1143)) +- Add object item iterators. ([#1143](https://github.com/getsentry/sentry-native/pull/1143)) ## 0.7.20 From 96a344c7344b72cdc6338ae8ef5e1448f3afeaa0 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Fri, 14 Feb 2025 12:52:16 +0100 Subject: [PATCH 16/16] Fix sentry_value_item_iter_erase description return value --- include/sentry.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sentry.h b/include/sentry.h index 2ac4a7e7a..040e99655 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -288,7 +288,7 @@ SENTRY_API sentry_value_t sentry_value_item_iter_get_value( /** * Erases the current item and advances the iterator to the next item. * - * Returns 0 if the iterator is exhausted or the object is frozen. + * Returns 1 if the iterator is exhausted or the object is frozen. */ SENTRY_API int sentry_value_item_iter_erase(sentry_item_iter_t *item_iter);