Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Marshalling objects (was: French interactive fiction, anyone ?)
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jacques Garrigue <garrigue@k...>
Subject: Re: [Caml-list] Marshalling objects (was: French interactive fiction, anyone ?)
From: Berke Durak <berke@altern.org>

> Well, this is not exactly about marshalling code : I'm not asking
> Ocaml to be able to transfer pieces of code between different
> programs. Just being able to save an object and reload it in the same
> executable later would suffice : since Caml can save closures under
> the same constraints, the reason why objects can't be saved must be
> something else.

Actually I cannot remember any such reason.
I actually tried, just commenting out the Object_tag case in
byterun/extern.c, and it works!
There's a single glitch: as it just handles objects as normal data,
oid's are not updated. This means that equality on objects (which is
oid based) will be incorrect.
Can somebody comment about other possible problems?
I join some test code at the end of this mail, to run after commenting
out Object_tag.

On the other hand, objects are not just closures, and it would be nice
to be able to serialize their data in a code-independent way. Not so
unreasonable: class names are unique. This would require a bit of
runtime support, to be able to retrieve method tables.

Jacques Garrigue

(* objext.ml *)
class c (n : int) =
  object (self)
    method private n = n
    method get_n = self#n
    method show = string_of_int self#n
  end

let () =
  let o =
    if Sys.file_exists "objext.dat" then
      let ic = open_in "objext.dat" in
      let o : c = input_value ic in
      close_in ic;
      Printf.printf "old value: %s\n" o#show;
      let o' = new c (o#get_n + 1) in
      Printf.printf "new value: %s\n" o'#show;
      Printf.printf "old %s new\n" (if o = o' then "=" else "<>");
      o'
    else begin
      print_endline "created objext.dat";
      new c 0
    end
  in
  let oc = open_out "objext.dat" in
  Marshal.to_channel oc o [Marshal.Closures];
  close_out oc
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners