From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: weis Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id QAA16588 for caml-redistribution; Fri, 10 Sep 1999 16:55:34 +0200 (MET DST) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id PAA14200 for ; Fri, 10 Sep 1999 15:14:46 +0200 (MET DST) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.8.7/8.8.7) with ESMTP id PAA10364; Fri, 10 Sep 1999 15:14:40 +0200 (MET DST) Received: (from vouillon@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id PAA15342; Fri, 10 Sep 1999 15:14:39 +0200 (MET DST) Message-ID: <19990910151439.21068@pauillac.inria.fr> Date: Fri, 10 Sep 1999 15:14:39 +0200 From: Jerome Vouillon To: Nicolas Ollinger , Jerome Vouillon Cc: caml-list@inria.fr Subject: Re: Efficency in OCaml References: <19990902010939.12962@pauillac.inria.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Mailer: Mutt 0.89.1 In-Reply-To: ; from Nicolas Ollinger on Sat, Sep 04, 1999 at 05:26:33PM +0300 Sender: weis On Sat, Sep 04, 1999 at 05:26:33PM +0300, Nicolas Ollinger wrote: > I played a little with objects representation in OCaml 2.xx. As far as > I understand, at least in bytecode, class instances are represented as > boxed values tagged object_tag with n+2 fields : then first field is the > method array array described by Jerome in last mail, the second field > seems to be a unique id associate to the object, other fields are used > for instance variables in the order of declaration, inherited variables > first. As the method array array is unique for each class, it can be used > to identify the class (notice that classes are represented as global > variables). This is correct. > I'm intrigued by this second field, what is the use of this > id ? Where is the necessity to identify uniquely every object ? This allows to compare objects using "(<)" or "compare" (and therefore makes it easy to create sets of objects). > Concerning marshaling of objects, a simple solution is to use a function > like: > > let crunch o = > let r = Obj.dup (Obj.repr o) in > let idclass = compute_id (Obj.field r 0) in > Obj.set_field r 1 idclass; > Obj.set_tag r Obj.marshaled_object_tag > r;; > > with compute_id a function that deduce a unique class id of the object. > > Then unmarshaling is just doing the inverse operation. Of course, if > you want to share objects between different programs then you must add > some information about the module in which the class is declared, and > so one. This would work. The hard part is to generate this information... -- Jérôme