summaryrefslogtreecommitdiff
path: root/byterun
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1998-06-11 12:53:45 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1998-06-11 12:53:45 +0000
commitd9b1220dcaa9a9d049f07900a78dd30dc4856651 (patch)
tree648a6f3bc523e64eb9c841103a3d4c9f10c38e01 /byterun
parent8b7bcb0bda0088906032068de8f293660fda26f8 (diff)
downloadocaml-d9b1220dcaa9a9d049f07900a78dd30dc4856651.tar.gz
Ajout de output_value_to_malloc and input_value_from_malloc
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1985 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun')
-rw-r--r--byterun/extern.c10
-rw-r--r--byterun/intern.c26
2 files changed, 35 insertions, 1 deletions
diff --git a/byterun/extern.c b/byterun/extern.c
index 031d5ef3b0..2e09368594 100644
--- a/byterun/extern.c
+++ b/byterun/extern.c
@@ -402,7 +402,7 @@ void output_val(struct channel *chan, value v, value flags)
value output_value(value vchan, value v, value flags) /* ML */
{
struct channel * channel = Channel(vchan);
- Begin_root(v)
+ Begin_roots2(v, flags)
Lock(channel);
output_val(channel, v, flags);
Unlock(channel);
@@ -433,3 +433,11 @@ value output_value_to_buffer(value buf, value ofs, value len, value v, value fla
return Val_long(len_res);
}
+void output_value_to_malloc(value v, value flags,
+ /*out*/ char ** buf, /*out*/ long * len)
+{
+ alloc_extern_block();
+ *buf = extern_block;
+ *len = extern_value(v, flags);
+}
+
diff --git a/byterun/intern.c b/byterun/intern.c
index 6c79996b1e..08dec7e8fe 100644
--- a/byterun/intern.c
+++ b/byterun/intern.c
@@ -335,6 +335,32 @@ value input_value_from_string(value str, value ofs) /* ML */
return input_val_from_string(str, Long_val(ofs));
}
+value input_value_from_malloc(char * data, long ofs)
+{
+ mlsize_t num_objects, size_32, size_64, whsize;
+ value obj;
+
+ intern_input = (unsigned char *) data;
+ intern_src = intern_input + ofs + 2*4;
+ intern_input_malloced = 1;
+ num_objects = read32u();
+ size_32 = read32u();
+ size_64 = read32u();
+ /* Allocate result */
+#ifdef ARCH_SIXTYFOUR
+ whsize = size_64;
+#else
+ whsize = size_32;
+#endif
+ intern_alloc(whsize, num_objects);
+ /* Fill it in */
+ intern_rec(&obj);
+ /* Free everything */
+ stat_free(intern_input);
+ if (intern_obj_table != NULL) stat_free(intern_obj_table);
+ return obj;
+}
+
value marshal_data_size(value buff, value ofs) /* ML */
{
uint32 magic;