fix comparsion of source module for imports
svn: r3204
This commit is contained in:
parent
bc07332cc2
commit
4ecd4fcb53
|
@ -186,8 +186,6 @@ static Scheme_Object *default_module_resolver(int argc, Scheme_Object **argv);
|
||||||
static void qsort_provides(Scheme_Object **exs, Scheme_Object **exsns, Scheme_Object **exss, char *exps,
|
static void qsort_provides(Scheme_Object **exs, Scheme_Object **exsns, Scheme_Object **exss, char *exps,
|
||||||
int start, int count, int do_uninterned);
|
int start, int count, int do_uninterned);
|
||||||
|
|
||||||
static int same_modidx(Scheme_Object *a, Scheme_Object *b);
|
|
||||||
|
|
||||||
#define MODCHAIN_TABLE(p) ((Scheme_Hash_Table *)(SCHEME_VEC_ELS(p)[0]))
|
#define MODCHAIN_TABLE(p) ((Scheme_Hash_Table *)(SCHEME_VEC_ELS(p)[0]))
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
@ -1716,6 +1714,16 @@ int same_modidx(Scheme_Object *a, Scheme_Object *b)
|
||||||
return scheme_equal(a, b);
|
return scheme_equal(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int same_resolved_modidx(Scheme_Object *a, Scheme_Object *b)
|
||||||
|
{
|
||||||
|
if (SAME_TYPE(SCHEME_TYPE(a), scheme_module_index_type))
|
||||||
|
a = scheme_module_resolve(a);
|
||||||
|
if (SAME_TYPE(SCHEME_TYPE(b), scheme_module_index_type))
|
||||||
|
b = scheme_module_resolve(b);
|
||||||
|
|
||||||
|
return scheme_equal(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
static Scheme_Object *_module_resolve_k(void);
|
static Scheme_Object *_module_resolve_k(void);
|
||||||
|
|
||||||
static Scheme_Object *_module_resolve(Scheme_Object *modidx, Scheme_Object *stx)
|
static Scheme_Object *_module_resolve(Scheme_Object *modidx, Scheme_Object *stx)
|
||||||
|
@ -3704,7 +3712,7 @@ static void check_require_name(Scheme_Object *prnt_name, Scheme_Object *name, Sc
|
||||||
/* Not required, or required from same module: */
|
/* Not required, or required from same module: */
|
||||||
vec = scheme_hash_get(required, name);
|
vec = scheme_hash_get(required, name);
|
||||||
if (vec) {
|
if (vec) {
|
||||||
if (same_modidx(SCHEME_VEC_ELS(vec)[1], modidx)
|
if (same_resolved_modidx(SCHEME_VEC_ELS(vec)[1], modidx)
|
||||||
&& SAME_OBJ(SCHEME_VEC_ELS(vec)[2], exname)) {
|
&& SAME_OBJ(SCHEME_VEC_ELS(vec)[2], exname)) {
|
||||||
/* already required, same source; add redundant nominal (for re-provides) */
|
/* already required, same source; add redundant nominal (for re-provides) */
|
||||||
nml = scheme_make_pair(nominal_modidx, SCHEME_VEC_ELS(vec)[0]);
|
nml = scheme_make_pair(nominal_modidx, SCHEME_VEC_ELS(vec)[0]);
|
||||||
|
@ -5727,7 +5735,7 @@ static void check_dup_require(Scheme_Object *prnt_name, Scheme_Object *name, Sch
|
||||||
i = scheme_hash_get((Scheme_Hash_Table *)ht, name);
|
i = scheme_hash_get((Scheme_Hash_Table *)ht, name);
|
||||||
|
|
||||||
if (i) {
|
if (i) {
|
||||||
if (same_modidx(modidx, SCHEME_CAR(i)) && SAME_OBJ(srcname, SCHEME_CDR(i)))
|
if (same_resolved_modidx(modidx, SCHEME_CAR(i)) && SAME_OBJ(srcname, SCHEME_CDR(i)))
|
||||||
return; /* same source */
|
return; /* same source */
|
||||||
scheme_wrong_syntax(NULL, prnt_name, form, "duplicate import identifier");
|
scheme_wrong_syntax(NULL, prnt_name, form, "duplicate import identifier");
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue
Block a user