summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBasile Starynkevitch <basile.starynkevitch@inria.fr>2004-04-26 12:02:07 +0000
committerBasile Starynkevitch <basile.starynkevitch@inria.fr>2004-04-26 12:02:07 +0000
commit41edc1a23794aacb5d642cdffb1d53b775aaebc9 (patch)
tree72a631942daa89ffcd2e51052dc116ae16f62484
parentd2441b0b7f32103b4cb12ed7f7b8c80a5cfe8e95 (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.c9
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;