Skip to content

Commit 30f18ec

Browse files
committed
Add info about duplicated symbols.
1 parent 62b1622 commit 30f18ec

File tree

7 files changed

+54
-8
lines changed

7 files changed

+54
-8
lines changed

source/adt/include/adt/adt_set.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ ADT_API int set_contains(set s, set_key key);
6666

6767
ADT_API int set_contains_any(set dest, set src);
6868

69+
ADT_API int set_contains_which(set dest, set src, set_key *key);
70+
6971
ADT_API set_value set_remove(set s, set_key key);
7072

7173
ADT_API void set_iterate(set s, set_cb_iterate iterate_cb, set_cb_iterate_args args);

source/adt/source/adt_set.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,15 @@ struct set_contains_any_cb_iterator_type
5555
int result;
5656
};
5757

58+
struct set_contains_which_cb_iterator_type
59+
{
60+
set s;
61+
int result;
62+
set_key *key;
63+
};
64+
5865
typedef struct set_contains_any_cb_iterator_type *set_contains_any_cb_iterator;
66+
typedef struct set_contains_which_cb_iterator_type *set_contains_which_cb_iterator;
5967

6068
/* -- Methods -- */
6169

@@ -311,6 +319,40 @@ int set_contains_any(set dest, set src)
311319
return args.result;
312320
}
313321

322+
static int set_contains_which_cb_iterate(set s, set_key key, set_value value, set_cb_iterate_args args)
323+
{
324+
set_contains_which_cb_iterator iterator = (set_contains_which_cb_iterator)args;
325+
326+
(void)s;
327+
(void)value;
328+
329+
iterator->result = set_contains(iterator->s, key);
330+
331+
if (iterator->result == 0)
332+
{
333+
iterator->key = key;
334+
}
335+
336+
/* Stop iteration if we found an element */
337+
return !iterator->result;
338+
}
339+
340+
int set_contains_which(set dest, set src, set_key *key)
341+
{
342+
struct set_contains_which_cb_iterator_type args;
343+
344+
args.s = dest;
345+
args.result = 1;
346+
args.key = NULL;
347+
348+
set_iterate(src, &set_contains_which_cb_iterate, (set_cb_iterate_args)&args);
349+
350+
/* Return which is the duplicated key if any */
351+
*key = args.key;
352+
353+
return args.result;
354+
}
355+
314356
set_value set_remove(set s, set_key key)
315357
{
316358
set_hash h;

source/loader/source/loader_impl.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -664,10 +664,12 @@ int loader_impl_handle_register(loader_impl impl, char *name, loader_handle_impl
664664
{
665665
if (handle_ptr == NULL)
666666
{
667-
if (context_contains(impl->ctx, handle_impl->ctx) == 0)
667+
char *duplicated_key = NULL;
668+
669+
if (context_contains(impl->ctx, handle_impl->ctx, &duplicated_key) == 0)
668670
{
669671
/* TODO: This still does not protect duplicated names between different loaders global scope */
670-
log_write("metacall", LOG_LEVEL_ERROR, "There are duplicated symbols already loaded in the global scope conflicting with handle: %s", name);
672+
log_write("metacall", LOG_LEVEL_ERROR, "Duplicated symbol found named '%s' already defined in the global scope by handle: %s", duplicated_key, name);
671673
}
672674
else if (context_append(impl->ctx, handle_impl->ctx) == 0)
673675
{

source/reflect/include/reflect/reflect_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ REFLECT_API scope context_scope(context ctx);
4141

4242
REFLECT_API int context_append(context dest, context src);
4343

44-
REFLECT_API int context_contains(context dest, context src);
44+
REFLECT_API int context_contains(context dest, context src, char **duplicated);
4545

4646
REFLECT_API int context_remove(context dest, context src);
4747

source/reflect/include/reflect/reflect_scope.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ REFLECT_API value scope_undef(scope sp, const char *key);
5252

5353
REFLECT_API int scope_append(scope dest, scope src);
5454

55-
REFLECT_API int scope_contains(scope dest, scope src);
55+
REFLECT_API int scope_contains(scope dest, scope src, char **duplicated);
5656

5757
REFLECT_API int scope_remove(scope dest, scope src);
5858

source/reflect/source/reflect_context.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ int context_append(context dest, context src)
8787
return scope_append(dest->sp, src->sp);
8888
}
8989

90-
int context_contains(context dest, context src)
90+
int context_contains(context dest, context src, char **duplicated)
9191
{
92-
return scope_contains(dest->sp, src->sp);
92+
return scope_contains(dest->sp, src->sp, duplicated);
9393
}
9494

9595
int context_remove(context dest, context src)

source/reflect/source/reflect_scope.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,9 @@ int scope_append(scope dest, scope src)
457457
return set_append(dest->objects, src->objects);
458458
}
459459

460-
int scope_contains(scope dest, scope src)
460+
int scope_contains(scope dest, scope src, char **duplicated)
461461
{
462-
return set_contains_any(dest->objects, src->objects);
462+
return set_contains_which(dest->objects, src->objects, (set_key*)duplicated);
463463
}
464464

465465
int scope_remove(scope dest, scope src)

0 commit comments

Comments
 (0)