diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1998-06-11 12:53:45 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1998-06-11 12:53:45 +0000 |
commit | d9b1220dcaa9a9d049f07900a78dd30dc4856651 (patch) | |
tree | 648a6f3bc523e64eb9c841103a3d4c9f10c38e01 /byterun | |
parent | 8b7bcb0bda0088906032068de8f293660fda26f8 (diff) | |
download | ocaml-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.c | 10 | ||||
-rw-r--r-- | byterun/intern.c | 26 |
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; |