mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
Fixes for error handling in ml api
This commit is contained in:
parent
ae5f96895d
commit
949317ccfc
|
@ -1,2 +1,2 @@
|
||||||
# Customize error handling for contexts created in ML:
|
# Customize error handling for contexts created in ML:
|
||||||
s/Z3_API Z3_mk_context(\(.*\))/Z3_API Z3_mk_context(\1) quote(dealloc,\"Z3_set_error_handler(_res, caml_z3_error_handler);\")/g
|
s/Z3_API Z3_mk_context(\(.*\))/Z3_API Z3_mk_context(\1) quote(dealloc,\"Z3_set_error_handler(_res, (void*)caml_z3_error_handler);\")/g
|
||||||
|
|
|
@ -53,6 +53,12 @@ Author:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// The V3 API uses a single handler irregardless of UNSAFE_ERRORS
|
||||||
|
quote(c,"
|
||||||
|
/* All contexts share the same handler */
|
||||||
|
static value caml_z3_error_handler = 0;
|
||||||
|
");
|
||||||
|
|
||||||
#ifdef SAFE_ERRORS
|
#ifdef SAFE_ERRORS
|
||||||
|
|
||||||
quote(mlmli,"
|
quote(mlmli,"
|
||||||
|
@ -64,7 +70,7 @@ quote(mlmli,"
|
||||||
exception Error of context * error_code
|
exception Error of context * error_code
|
||||||
");
|
");
|
||||||
quote(ml,"
|
quote(ml,"
|
||||||
/* Register dynamically-generated exception tag for use from C */
|
(* Register dynamically-generated exception tag for use from C *)
|
||||||
let _ = Callback.register_exception \"Z3.Error\" (Error (Obj.magic None, OK))
|
let _ = Callback.register_exception \"Z3.Error\" (Error (Obj.magic None, OK))
|
||||||
");
|
");
|
||||||
|
|
||||||
|
@ -108,7 +114,7 @@ quote(mlmli,"
|
||||||
exception Error of context * error_code
|
exception Error of context * error_code
|
||||||
");
|
");
|
||||||
quote(ml,"
|
quote(ml,"
|
||||||
/* Register dynamically-generated exception tag for use from C */
|
(* Register dynamically-generated exception tag for use from C *)
|
||||||
let _ = Callback.register_exception \"Z3.Error\" (Error (Obj.magic None, OK))
|
let _ = Callback.register_exception \"Z3.Error\" (Error (Obj.magic None, OK))
|
||||||
");
|
");
|
||||||
|
|
||||||
|
@ -116,9 +122,6 @@ quote(c,"
|
||||||
/* Error checking routine that does nothing */
|
/* Error checking routine that does nothing */
|
||||||
void check_error_code(Z3_context c) {}
|
void check_error_code(Z3_context c) {}
|
||||||
|
|
||||||
/* All contexts share the same handler */
|
|
||||||
static value caml_error_handler = 0;
|
|
||||||
|
|
||||||
static void error_handler_static (Z3_context c, Z3_error_code e)
|
static void error_handler_static (Z3_context c, Z3_error_code e)
|
||||||
{
|
{
|
||||||
static struct camlidl_ctx_struct _ctxs = { CAMLIDL_TRANSIENT, NULL };
|
static struct camlidl_ctx_struct _ctxs = { CAMLIDL_TRANSIENT, NULL };
|
||||||
|
@ -126,8 +129,8 @@ static void error_handler_static (Z3_context c, Z3_error_code e)
|
||||||
value ctx_err[2];
|
value ctx_err[2];
|
||||||
ctx_err[0] = c2ml_Z3_context(&c);
|
ctx_err[0] = c2ml_Z3_context(&c);
|
||||||
ctx_err[1] = camlidl_c2ml_z3_Z3_error_code(&e, &_ctxs);
|
ctx_err[1] = camlidl_c2ml_z3_Z3_error_code(&e, &_ctxs);
|
||||||
if (caml_error_handler) {
|
if (caml_z3_error_handler) {
|
||||||
caml_callback2(caml_error_handler, ctx_err[0], ctx_err[1]);
|
caml_callback2(caml_z3_error_handler, ctx_err[0], ctx_err[1]);
|
||||||
} else {
|
} else {
|
||||||
/* if no handler set, raise OCaml Error exception */
|
/* if no handler set, raise OCaml Error exception */
|
||||||
exn_tag = caml_named_value(\"Z3.Error\");
|
exn_tag = caml_named_value(\"Z3.Error\");
|
||||||
|
@ -141,7 +144,7 @@ static void error_handler_static (Z3_context c, Z3_error_code e)
|
||||||
|
|
||||||
void ml2c_Z3_error_handler (value ml_handler, void* c_handler)
|
void ml2c_Z3_error_handler (value ml_handler, void* c_handler)
|
||||||
{
|
{
|
||||||
caml_error_handler = ml_handler;
|
caml_z3_error_handler = ml_handler;
|
||||||
c_handler = (void*)error_handler_static;
|
c_handler = (void*)error_handler_static;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue