Fix constraints ordering #790

Merged
zxq9 merged 1 commits from fix-ets into lima 2021-03-05 18:42:16 +09:00
Showing only changes of commit 4e60d019ca - Show all commits

View File

@ -1557,6 +1557,15 @@ free_vars(L) when is_list(L) ->
[V || Elem <- L, [V || Elem <- L,
V <- free_vars(Elem)]. V <- free_vars(Elem)].
next_count() ->
V = case get(counter) of
undefined ->
0;
X -> X
end,
put(counter, V + 1),
V.
%% Clean up all the ets tables (in case of an exception) %% Clean up all the ets tables (in case of an exception)
ets_tables() -> ets_tables() ->
@ -1602,6 +1611,18 @@ ets_tab2list(Name) ->
TabId = ets_tabid(Name), TabId = ets_tabid(Name),
ets:tab2list(TabId). ets:tab2list(TabId).
ets_insert_ordered(_, []) -> true;
ets_insert_ordered(Name, [H|T]) ->
ets_insert_ordered(Name, H),
ets_insert_ordered(Name, T);
ets_insert_ordered(Name, Object) ->
Count = next_count(),
TabId = ets_tabid(Name),
ets:insert(TabId, {Count, Object}).
ets_tab2list_ordered(Name) ->
[E || {_, E} <- ets_tab2list(Name)].
%% Options %% Options
create_options(Options) -> create_options(Options) ->
@ -1637,17 +1658,17 @@ destroy_and_report_unsolved_constraints(Env) ->
%% -- Named argument constraints -- %% -- Named argument constraints --
create_named_argument_constraints() -> create_named_argument_constraints() ->
ets_new(named_argument_constraints, [bag]). ets_new(named_argument_constraints, [ordered_set]).
destroy_named_argument_constraints() -> destroy_named_argument_constraints() ->
ets_delete(named_argument_constraints). ets_delete(named_argument_constraints).
get_named_argument_constraints() -> get_named_argument_constraints() ->
ets_tab2list(named_argument_constraints). ets_tab2list_ordered(named_argument_constraints).
-spec add_named_argument_constraint(named_argument_constraint()) -> ok. -spec add_named_argument_constraint(named_argument_constraint()) -> ok.
add_named_argument_constraint(Constraint) -> add_named_argument_constraint(Constraint) ->
ets_insert(named_argument_constraints, Constraint), ets_insert_ordered(named_argument_constraints, Constraint),
ok. ok.
solve_named_argument_constraints(Env) -> solve_named_argument_constraints(Env) ->
@ -1686,14 +1707,14 @@ destroy_and_report_unsolved_named_argument_constraints(Env) ->
| {add_bytes, aeso_syntax:ann(), concat | split, utype(), utype(), utype()}. | {add_bytes, aeso_syntax:ann(), concat | split, utype(), utype(), utype()}.
create_bytes_constraints() -> create_bytes_constraints() ->
ets_new(bytes_constraints, [bag]). ets_new(bytes_constraints, [ordered_set]).
get_bytes_constraints() -> get_bytes_constraints() ->
ets_tab2list(bytes_constraints). ets_tab2list_ordered(bytes_constraints).
-spec add_bytes_constraint(byte_constraint()) -> true. -spec add_bytes_constraint(byte_constraint()) -> true.
add_bytes_constraint(Constraint) -> add_bytes_constraint(Constraint) ->
ets_insert(bytes_constraints, Constraint). ets_insert_ordered(bytes_constraints, Constraint).
solve_bytes_constraints(Env) -> solve_bytes_constraints(Env) ->
[ solve_bytes_constraint(Env, C) || C <- get_bytes_constraints() ], [ solve_bytes_constraint(Env, C) || C <- get_bytes_constraints() ],
@ -1747,18 +1768,18 @@ check_bytes_constraint(Env, {add_bytes, Ann, Fun, A0, B0, C0}) ->
create_field_constraints() -> create_field_constraints() ->
%% A relation from uvars to constraints %% A relation from uvars to constraints
ets_new(field_constraints, [bag]). ets_new(field_constraints, [ordered_set]).
destroy_field_constraints() -> destroy_field_constraints() ->
ets_delete(field_constraints). ets_delete(field_constraints).
-spec constrain([field_constraint()]) -> true. -spec constrain([field_constraint()]) -> true.
constrain(FieldConstraints) -> constrain(FieldConstraints) ->
ets_insert(field_constraints, FieldConstraints). ets_insert_ordered(field_constraints, FieldConstraints).
-spec get_field_constraints() -> [field_constraint()]. -spec get_field_constraints() -> [field_constraint()].
get_field_constraints() -> get_field_constraints() ->
ets_tab2list(field_constraints). ets_tab2list_ordered(field_constraints).
solve_field_constraints(Env) -> solve_field_constraints(Env) ->
FieldCs = FieldCs =