fix cache comparison of scope-propagation tables
Repairs 3eb2c20ad0
, which used a scope-set comparison for
a table that maps scopes to propagation actions (add, remove,
or flip).
Closes #1113
Merge to v6.3
This commit is contained in:
parent
bfb245553c
commit
d719c06e00
|
@ -1624,6 +1624,24 @@ case of module-leve bindings; it doesn't cover local bindings.
|
||||||
|
|
||||||
(test 1 values (lifted-require-of-x (submod 'has-a-submodule-that-exports-x b)))
|
(test 1 values (lifted-require-of-x (submod 'has-a-submodule-that-exports-x b)))
|
||||||
|
|
||||||
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; This test happens to trigger a combination
|
||||||
|
;; of lazy adds and reoves that exposed a bug
|
||||||
|
;; in caching lazy scope propagations
|
||||||
|
|
||||||
|
(eval
|
||||||
|
(expand
|
||||||
|
#'(module x racket/kernel
|
||||||
|
(module ma racket/base
|
||||||
|
(#%module-begin
|
||||||
|
(#%require (for-syntax racket/kernel))
|
||||||
|
(define-values (x) 1)
|
||||||
|
(define-syntaxes (foo) (lambda (stx) (quote-syntax x)))
|
||||||
|
(#%provide foo)))
|
||||||
|
(module mb racket/kernel
|
||||||
|
(#%require (submod ".." ma))
|
||||||
|
(foo)))))
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(report-errs)
|
(report-errs)
|
||||||
|
|
|
@ -2915,8 +2915,12 @@ static int hamt_equal_entries(int stype, void *eql_data,
|
||||||
Scheme_Object *k2, Scheme_Object *v2)
|
Scheme_Object *k2, Scheme_Object *v2)
|
||||||
{
|
{
|
||||||
if (stype == scheme_eq_hash_tree_type) {
|
if (stype == scheme_eq_hash_tree_type) {
|
||||||
if (SAME_OBJ(k1, k2))
|
if (SAME_OBJ(k1, k2)) {
|
||||||
|
if (eql_data)
|
||||||
return scheme_recur_equal(v1, v2, eql_data);
|
return scheme_recur_equal(v1, v2, eql_data);
|
||||||
|
else
|
||||||
|
return SAME_OBJ(v1, v2);
|
||||||
|
}
|
||||||
} else if (stype == scheme_hash_tree_type) {
|
} else if (stype == scheme_hash_tree_type) {
|
||||||
if (scheme_recur_equal(k1, k2, eql_data))
|
if (scheme_recur_equal(k1, k2, eql_data))
|
||||||
return scheme_recur_equal(v1, v2, eql_data);
|
return scheme_recur_equal(v1, v2, eql_data);
|
||||||
|
|
|
@ -772,6 +772,13 @@ static int scopes_equal(Scheme_Scope_Set *a, Scheme_Scope_Set *b)
|
||||||
return (scope_set_count(a) == scope_set_count(b)) && scope_subset(a, b);
|
return (scope_set_count(a) == scope_set_count(b)) && scope_subset(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int scope_props_equal(Scheme_Scope_Set *a, Scheme_Scope_Set *b)
|
||||||
|
{
|
||||||
|
return scheme_hash_tree_equal_rec((Scheme_Hash_Tree *)a, (Scheme_Object *)a,
|
||||||
|
(Scheme_Hash_Tree *)b, (Scheme_Object *)b,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static Scheme_Object *make_fallback_pair(Scheme_Object *a, Scheme_Object *b)
|
static Scheme_Object *make_fallback_pair(Scheme_Object *a, Scheme_Object *b)
|
||||||
{
|
{
|
||||||
a = scheme_make_vector(2, a);
|
a = scheme_make_vector(2, a);
|
||||||
|
@ -1809,8 +1816,10 @@ static void intern_scope_set(Scheme_Scope_Table *t, int prop_table)
|
||||||
if (recent_scope_sets[prop_table][i]) {
|
if (recent_scope_sets[prop_table][i]) {
|
||||||
if (recent_scope_sets[prop_table][i] == t->simple_scopes)
|
if (recent_scope_sets[prop_table][i] == t->simple_scopes)
|
||||||
return;
|
return;
|
||||||
if (scopes_equal(recent_scope_sets[prop_table][i], t->simple_scopes)) {
|
if (scopes_equal(recent_scope_sets[prop_table][i], t->simple_scopes)
|
||||||
|
&& (!prop_table || scope_props_equal(recent_scope_sets[prop_table][i], t->simple_scopes))) {
|
||||||
t->simple_scopes = recent_scope_sets[prop_table][i];
|
t->simple_scopes = recent_scope_sets[prop_table][i];
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user