fix nb_getval to handle exceptions.
This commit is contained in:
parent
0546df7ac3
commit
233926ea00
@ -1286,8 +1286,7 @@ p_nb_getval(void)
|
|||||||
}
|
}
|
||||||
ge = FindGlobalEntry(AtomOfTerm(t));
|
ge = FindGlobalEntry(AtomOfTerm(t));
|
||||||
if (!ge) {
|
if (!ge) {
|
||||||
Yap_Error(EXISTENCE_ERROR_VARIABLE,t,"nb_getval");
|
return Yap_unify(TermNil, ARG3);
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
READ_LOCK(ge->GRWLock);
|
READ_LOCK(ge->GRWLock);
|
||||||
to = ge->global;
|
to = ge->global;
|
||||||
@ -2636,11 +2635,10 @@ void Yap_InitGlobals(void)
|
|||||||
Yap_InitCPred("$allocate_arena", 2, p_allocate_arena, 0);
|
Yap_InitCPred("$allocate_arena", 2, p_allocate_arena, 0);
|
||||||
Yap_InitCPred("arena_size", 1, p_default_arena_size, 0);
|
Yap_InitCPred("arena_size", 1, p_default_arena_size, 0);
|
||||||
Yap_InitCPred("b_setval", 2, p_b_setval, SafePredFlag);
|
Yap_InitCPred("b_setval", 2, p_b_setval, SafePredFlag);
|
||||||
Yap_InitCPred("b_getval", 2, p_nb_getval, SafePredFlag);
|
|
||||||
Yap_InitCPred("nb_setval", 2, p_nb_setval, 0L);
|
Yap_InitCPred("nb_setval", 2, p_nb_setval, 0L);
|
||||||
Yap_InitCPred("nb_set_shared_val", 2, p_nb_set_shared_val, 0L);
|
Yap_InitCPred("nb_set_shared_val", 2, p_nb_set_shared_val, 0L);
|
||||||
Yap_InitCPred("nb_linkval", 2, p_nb_linkval, 0L);
|
Yap_InitCPred("nb_linkval", 2, p_nb_linkval, 0L);
|
||||||
Yap_InitCPred("nb_getval", 2, p_nb_getval, SafePredFlag);
|
Yap_InitCPred("$nb_getval", 3, p_nb_getval, SafePredFlag);
|
||||||
Yap_InitCPred("nb_setarg", 3, p_nb_setarg, 0L);
|
Yap_InitCPred("nb_setarg", 3, p_nb_setarg, 0L);
|
||||||
Yap_InitCPred("nb_set_shared_arg", 3, p_nb_set_shared_arg, 0L);
|
Yap_InitCPred("nb_set_shared_arg", 3, p_nb_set_shared_arg, 0L);
|
||||||
Yap_InitCPred("nb_linkarg", 3, p_nb_linkarg, 0L);
|
Yap_InitCPred("nb_linkarg", 3, p_nb_linkarg, 0L);
|
||||||
|
31
pl/boot.yap
31
pl/boot.yap
@ -161,10 +161,10 @@ true :- true.
|
|||||||
'$system_catch'('$do_yes_no'((G->true),user),user,Error,user:'$Error'(Error)),
|
'$system_catch'('$do_yes_no'((G->true),user),user,Error,user:'$Error'(Error)),
|
||||||
fail.
|
fail.
|
||||||
'$enter_top_level' :-
|
'$enter_top_level' :-
|
||||||
nb_getval('$break',BreakLevel),
|
'$nb_getval'('$break',BreakLevel,fail),
|
||||||
'$debug_on'(DBON),
|
'$debug_on'(DBON),
|
||||||
(
|
(
|
||||||
nb_getval('$trace',on)
|
'$nb_getval'('$trace', on, fail)
|
||||||
->
|
->
|
||||||
TraceDebug = trace
|
TraceDebug = trace
|
||||||
;
|
;
|
||||||
@ -349,7 +349,7 @@ true :- true.
|
|||||||
'$do_error'(type_error(callable,R),meta_call(Source)).
|
'$do_error'(type_error(callable,R),meta_call(Source)).
|
||||||
'$execute_command'(end_of_file,_,_,_,_) :- !.
|
'$execute_command'(end_of_file,_,_,_,_) :- !.
|
||||||
'$execute_command'(Command,_,_,_,_) :-
|
'$execute_command'(Command,_,_,_,_) :-
|
||||||
nb_getval('$if_skip_mode',skip),
|
'$nb_getval'('$if_skip_mode', skip, fail),
|
||||||
\+ '$if_directive'(Command),
|
\+ '$if_directive'(Command),
|
||||||
!.
|
!.
|
||||||
'$execute_command'((:-G),_,_,Option,_) :- !,
|
'$execute_command'((:-G),_,_,Option,_) :- !,
|
||||||
@ -1296,3 +1296,28 @@ throw(Ball) :-
|
|||||||
'$run_at_thread_start'.
|
'$run_at_thread_start'.
|
||||||
|
|
||||||
|
|
||||||
|
nb_getval(GlobalVariable, Val) :-
|
||||||
|
'$nb_getval'(GlobalVariable, Val, Error),
|
||||||
|
(var(Error)
|
||||||
|
->
|
||||||
|
true
|
||||||
|
;
|
||||||
|
'$getval_exception'(GlobalVariable, Val, nb_getval(GlobalVariable, Val)) ->
|
||||||
|
nb_getval(GlobalVariable, Val)
|
||||||
|
;
|
||||||
|
'$do_error'(existence_error(variable, GlobalVariable),nb_getval(GlobalVariable, Val))
|
||||||
|
).
|
||||||
|
|
||||||
|
|
||||||
|
b_getval(GlobalVariable, Val) :-
|
||||||
|
'$nb_getval'(GlobalVariable, Val, Error),
|
||||||
|
(var(Error)
|
||||||
|
->
|
||||||
|
true
|
||||||
|
;
|
||||||
|
'$getval_exception'(GlobalVariable, Val, b_getval(GlobalVariable, Val)) ->
|
||||||
|
true
|
||||||
|
;
|
||||||
|
'$do_error'(existence_error(variable, GlobalVariable),b_getval(GlobalVariable, Val))
|
||||||
|
).
|
||||||
|
|
||||||
|
@ -202,6 +202,8 @@ yap_hacks:cut_by(CP) :- '$$cut_by'(CP).
|
|||||||
|
|
||||||
:- multifile user:portray_message/2.
|
:- multifile user:portray_message/2.
|
||||||
|
|
||||||
|
:- multifile user:exception/3.
|
||||||
|
|
||||||
file_search_path(library, Dir) :-
|
file_search_path(library, Dir) :-
|
||||||
library_directory(Dir).
|
library_directory(Dir).
|
||||||
file_search_path(commons, Dir) :-
|
file_search_path(commons, Dir) :-
|
||||||
|
20
pl/utils.yap
20
pl/utils.yap
@ -580,3 +580,23 @@ nb_current(GlobalVariable, Val) :-
|
|||||||
'$nb_current'(GlobalVariable),
|
'$nb_current'(GlobalVariable),
|
||||||
nb_getval(GlobalVariable, Val).
|
nb_getval(GlobalVariable, Val).
|
||||||
|
|
||||||
|
'$getval_exception'(GlobalVariable, Val, Caller) :-
|
||||||
|
user:exception(undefined_global_variable, GlobalVariable, Action),
|
||||||
|
!,
|
||||||
|
(
|
||||||
|
Action == fail
|
||||||
|
->
|
||||||
|
fail
|
||||||
|
;
|
||||||
|
Action == retry
|
||||||
|
->
|
||||||
|
b_getval(GlobalVariable, Val)
|
||||||
|
;
|
||||||
|
Action == error
|
||||||
|
->
|
||||||
|
'$do_error'(existence_error(variable, GlobalVariable),Caller)
|
||||||
|
;
|
||||||
|
'$do_error'(type_error(atom, Action),Caller)
|
||||||
|
).
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user