From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by yquem.inria.fr (Postfix) with ESMTP id 31420BC6B for ; Mon, 5 Nov 2007 21:50:47 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAAAgRL0fAXQImh2dsb2JhbACOegEBAQgKKYEP X-IronPort-AV: E=Sophos;i="4.21,374,1188770400"; d="scan'208";a="5480631" Received: from discorde.inria.fr ([192.93.2.38]) by mail3-smtp-sop.national.inria.fr with ESMTP; 05 Nov 2007 21:50:46 +0100 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id lA5KokYq026648 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Mon, 5 Nov 2007 21:50:46 +0100 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAAMcQL0dA6ba4mGdsb2JhbACOegEBAQEHAgYTGIEP X-IronPort-AV: E=Sophos;i="4.21,374,1188770400"; d="scan'208";a="18966604" Received: from nf-out-0910.google.com ([64.233.182.184]) by mail4-smtp-sop.national.inria.fr with ESMTP; 05 Nov 2007 21:50:48 +0100 Received: by nf-out-0910.google.com with SMTP id g13so1302135nfb for ; Mon, 05 Nov 2007 12:50:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:sender:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references:x-google-sender-auth; bh=nRzXprX8W1TX7QA8GSxPpjxk/QxzH8SnVjf8w3gJnXQ=; b=hgHbpG184/a1YIP60cqf/8EW8GuyCATJuPvxSJ4m6MBX/GCRu9HZyeujd6ayiKUvLVTSHL7T1KDRCjHmCamoACtGGaAaqQgOeJ56+MdrCx1Sa19EqLzd79uNpuGbuD9Ak47O4IhzZ55CAy74GsKud2blFe5h6f2TTwYr1VwUJ2Y= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:sender:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references:x-google-sender-auth; b=EWJ0y39cMpTQRbmaNC+tC5NDHoOsCmsMRExufWwIjJlau9r0u0Astfk/GThdRJZDaWgdCL6+4y5J+DJFGEv5qk3p35ddDVx/OpY2nfzhA4SsTTVKMQ+X/bewt5mAVz+4D3luDr6jReuHN8rNUG6GiMrhzkjHQl9M1L9LwZoFoSA= Received: by 10.78.149.13 with SMTP id w13mr4161072hud.1194295843699; Mon, 05 Nov 2007 12:50:43 -0800 (PST) Received: by 10.78.157.16 with HTTP; Mon, 5 Nov 2007 12:50:43 -0800 (PST) Message-ID: <4a051d930711051250j20042a4chac2ce518a6d979e9@mail.gmail.com> Date: Mon, 5 Nov 2007 16:50:43 -0400 From: "Christopher L Conway" Sender: christopherleeconway@gmail.com To: "Jakob Lichtenberg" Subject: Re: [Caml-list] FW: CamlIDL: Returning a whole array of cows Cc: "caml-list@inria.fr" In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline References: X-Google-Sender-Auth: 548e53d581b1843c X-Miltered: at discorde with ID 472F8226.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; camlidl:01 iirc:01 hand-code:01 camlidl:01 stub:01 malloc:01 pointer:01 stub:01 stubs:01 mlsize:01 struct:01 struct:01 ctxs:01 ctxs:01 malloc:01 Jakob, I sent out pretty much the same question to the list just last week and also didn't get a satisfactory answer (see here: http://caml.inria.fr/pub/ml-archives/caml-list/2007/10/efb73229fa177fb413e6= 63a2c1ad28b4.en.html). It seems that when you add a size_is annotation to a parameter, the size is treated as a pre-condition, not as a post-condition. If you have the freedom to change the C API, you might try: [size_is(*outputlen)] cow *get_cows_inout([in] int inputlen, [ignore] int *outputlen); IIRC, this will give you the correct behavior. The alternative is hand-code the wrapper. Regards, Chris On 11/5/07, Jakob Lichtenberg wrote: > > > > > Resending due to no answer. > > > > - Jakob > > > > > > From: Jakob Lichtenberg > Sent: Monday, September 17, 2007 1:11 PM > To: 'caml-list@inria.fr' > Subject: CamlIDL: Returning a whole array of cows > > > > 1. Summary: Stub code generated by Camlidl seems to call camlidl_malloc w= ith > an uninitialized size. > > > > > > 2. Details: > > > > I am declaring a function 'void get_cows([out] int* len, [length_is(*len)= , > size_is(*len), out] cow** cows);' that creates and returns an array of co= ws. > (Each cow is just a pointer to a structure.) The generated stub code se= ems > incorrect: > > > > cow_stubs.c: > > value camlidl_cow_get_cows(value _unit) > > { > > int *len; /*out*/ > > cow **cows; /*out*/ > > int _c1; > > mlsize_t _c2; > > value _v3; > > value _vres; > > > > struct camlidl_ctx_struct _ctxs =3D { CAMLIDL_TRANSIENT, NULL }; > > camlidl_ctx _ctx =3D &_ctxs; > > len =3D &_c1; > > cows =3D camlidl_malloc(*len * sizeof(cow *), _ctx); > > get_cows(len, cows); > > _vres =3D camlidl_alloc(*len, 0); > > Begin_root(_vres) > > for (_c2 =3D 0; _c2 < *len; _c2++) { > > _v3 =3D camlidl_c2ml_cow_cow(&*cows[_c2], _ctx); > > modify(&Field(_vres, _c2), _v3); > > } > > End_roots() > > camlidl_free(_ctx); > > return _vres; > > } > > > > As you can see camlidl_malloc is called with an uninitialized value. > > > > Is this a bug in camlidl, or am I writing my IDL file incorrectly. Anoth= er > way to ask: How do I declared that a function reserves an array > > > > > > 3. Implementation details: > > > > This is my C api I'd like to access from ocaml: > > > > cow.h: > > typedef struct _cow { > > char* name; > > int age; > > } *cow; > > > > cow get_dummy_cow(); > > > > void get_cows_inout(int inputlen, int *outputlen, cow ca[]); // Write cow= s > to 'ca', however not more than 'inputlen' elements. Write number of cows > written to '*outputlen'. > > > > void get_cows(int* len, cow **ca); // Malloc array for cows. Save number= of > elements to *len, save address for array in '*ca'. > > > > void print_cow(cow o); > > > > I'd like to access this API from OCaml using CamlIDL. I use the followin= g > idl file: > > > > cow.idl: > > typedef [abstract] void* cow; > > > > [pointer_default(ref)] interface Cow { > > > > cow get_dummy_cow(void); > > > > void get_cows_inout([in] int inputlen, [out] int * outputlen, > > > [in,out,size_is(inputlen),length_is(*outputlen)] cow d[]); > > > > void get_cows([out] int* len, [length_is(*len), size_is(*len), out] cow** > cows); > > > > void print_cow(cow o); > > > > } > > > > I compile this using: > > > > camlidl cow.idl > > > > And use it from the following ML program: > > > > mlmain.ml: > > let main use_inout =3D > > let cows =3D > > if use_inout then Cow.get_cows_inout(Array.create 3 > (Cow.get_dummy_cow())) > > else Cow.get_cows() > > in > > Array.iter Cow.print_cow cows > > > > let _ =3D main true; > > > > This works fine. However, if I change the call to main to 'main false' = I > get a crash. > > > > Thanks, > > > > - Jakob > > > > PS. I know that I am leaking memory =96 that I can fix with a simple > quote(dealloc, "free(*cows);"); > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: > http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > >