fix module redefinition handling

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@985 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2004-02-13 13:31:44 +00:00
parent 072dc0a7b7
commit 4402a10f44
2 changed files with 34 additions and 27 deletions

View File

@ -498,6 +498,9 @@ print_message(Level, Mss) :-
'$output_error_message'(permission_error(modify,static_procedure_in_use,_), Where) :-
'$format'(user_error,"[ PERMISSION ERROR- ~w: modifying a static procedure in use ]~n",
[Where]).
'$output_error_message'(permission_error(module,redefined,Mod), Who) :-
'$format'(user_error,"[ PERMISSION ERROR ~w- redefining module ~a in a different file ]~n",
[Who,Mod]).
'$output_error_message'(permission_error(open,source_sink,Stream), Where) :-
'$format'(user_error,"[ PERMISSION ERROR- ~w: cannot open file ~w ]~n",
[Where,Stream]).

View File

@ -119,17 +119,7 @@ use_module(Mod,F,I) :-
'$file_name'(Stream, F).
'$module'(reconsult,N,P) :- !,
'$abolish_module_data'(N),
'$module_dec'(N,P).
'$module'(consult,N,P) :-
( recorded('$module','$module'(F,N,_),_),
'$format'(user_error,"[ Module ~w was already defined in file ~w]~n",[N,F]),
'$abolish_module_data'(N),
fail
;
true
),
'$module'(_,N,P) :-
'$module_dec'(N,P).
'$module'(O,N,P,Opts) :- !,
@ -179,24 +169,47 @@ module(N) :-
'$do_error'(instantiation_error,module(N)).
module(N) :-
atom(N), !,
'$current_module'(_,N),
get_value('$consulting_file',F),
( recordzifnot('$module','$module'(N),_) -> true; true),
( recordaifnot('$module','$module'(F,N,[]),_) -> true, true).
% set it as current module.
'$current_module'(_,N).
module(N) :-
'$do_error'(type_error(atom,N),module(N)).
'$module_dec'(N,P) :-
'$current_module'(Old,N),
get_value('$consulting_file',F),
( recordzifnot('$module','$module'(N),_) -> true; true),
recorda('$module','$module'(F,N,P),_),
'$add_module_on_file'(N, F, P),
( recorded('$importing','$importing'(F),_) ->
true
;
'$import'(P,N,Old)
'$import'(P,N,Old)
).
'$add_module_on_file'(Mod, F, Exports) :-
recorded('$module','$module'(F0,Mod,_),R), !,
'$add_preexisting_module_on_file'(F, F0, Mod, Exports, R).
'$add_module_on_file'(Mod, F, Exports) :-
recorda('$module','$module'(F,Mod,Exports),_).
% redefining a previously-defined file, no problem.
'$add_preexisting_module_on_file'(F, F, Mod, Exports, R) :- !,
erase(R),
( recorded('$import','$import'(M,T,_,_),R), erase(R), fail; true),
recorda('$module','$module'(F,Mod,Exports),_).
'$add_preexisting_module_on_file'(F,F0,Mod,Exports,R) :-
repeat,
'$format'(user_error, "The module ~a is being redefined.~n Old file: ~a~n New file: ~a~nDo you really want to redefine it? (y or n)",[Mod,F0,F]),
'$mod_scan'(C), !,
( C is "y" ->
'$add_preexisting_module_on_file'(F, F, Mod, Exports, R)
;
'$do_error'(permission_error(module,redefined,Mod),module(Mod,Exports))
).
'$mod_scan'(C) :-
get0(C),
'$skipeol'(C),
(C is "y" ; C is "n").
'$import'([],_,_) :- !.
'$import'([N/K|L],M,T) :-
integer(K), atom(N), !,
@ -251,15 +264,6 @@ module(N) :-
true
).
'$abolish_module_data'(M) :-
'$current_module'(T),
( recorded('$import','$import'(M,T,_,_),R), erase(R), fail; true),
recorded('$module','$module'(_,M,_),R),
erase(R),
fail.
'$abolish_module_data'(_).
% expand module names in a clause
'$module_expansion'(((Mod:H) :-B ),((Mod:H) :- B1),((Mod:H) :- BO),M) :- !,
'$prepare_body_with_correct_modules'(B, M, B0),