diff options
author | Basile Starynkevitch <basile.starynkevitch@inria.fr> | 2004-04-26 12:02:07 +0000 |
---|---|---|
committer | Basile Starynkevitch <basile.starynkevitch@inria.fr> | 2004-04-26 12:02:07 +0000 |
commit | 41edc1a23794aacb5d642cdffb1d53b775aaebc9 (patch) | |
tree | 72a631942daa89ffcd2e51052dc116ae16f62484 | |
parent | d2441b0b7f32103b4cb12ed7f7b8c80a5cfe8e95 (diff) |
in LOCAL_CALLBACK_BYTECODE mode the return address should be into
the local callback code
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@6256 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | byterun/callback.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/byterun/callback.c b/byterun/callback.c index 53c7cc39b..a960df544 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -32,7 +32,10 @@ CAMLexport int caml_callback_depth = 0; +#ifndef LOCAL_CALLBACK_BYTECODE static opcode_t callback_code[] = { ACC, 0, APPLY, 0, POP, 1, STOP }; +#endif + #ifdef THREADED_CODE @@ -68,16 +71,20 @@ CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) caml_extern_sp -= narg + 4; for (i = 0; i < narg; i++) caml_extern_sp[i] = args[i]; /* arguments */ +#ifndef LOCAL_CALLBACK_BYTECODE caml_extern_sp[narg] = (value) (callback_code + 4); /* return address */ caml_extern_sp[narg + 1] = Val_unit; /* environment */ caml_extern_sp[narg + 2] = Val_long(0); /* extra args */ caml_extern_sp[narg + 3] = closure; -#ifndef LOCAL_CALLBACK_BYTECODE Init_callback(); callback_code[1] = narg + 3; callback_code[3] = narg; res = caml_interprete(callback_code, sizeof(callback_code)); #else /*have LOCAL_CALLBACK_BYTECODE*/ + caml_extern_sp[narg] = (value) (local_callback_code + 4); /* return address */ + caml_extern_sp[narg + 1] = Val_unit; /* environment */ + caml_extern_sp[narg + 2] = Val_long(0); /* extra args */ + caml_extern_sp[narg + 3] = closure; local_callback_code[0] = ACC; local_callback_code[1] = narg + 3; local_callback_code[2] = APPLY; |