caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jake Donham <jake@donham.org>
To: caml-list@inria.fr
Subject: Re: [Caml-list] Uncaught Unix_error.
Date: Thu, 18 Jun 2009 09:47:15 -0700	[thread overview]
Message-ID: <c7e4e9f0906180947y5def2aefu74da838861fe90bc@mail.gmail.com> (raw)
In-Reply-To: <53c655920906180741m71893536he6ea5960c124dddf@mail.gmail.com>

On Thu, Jun 18, 2009 at 7:41 AM, David Baelde<david.baelde@gmail.com> wrote:
> Also, note that the call to read that raises the error is from the
> same module that tries to catch the exception.
>
> I'm lost, I'd like to understand when the exception is registered: at
> runtime initialization? In this case, only one should ever be
> registered (at least it seems easy to enforce). Or is it statically
> registered somehow?

There are two things going on: First, exception tags in OCaml aren't
registered; they consist only of a block containing a distinguished
string. You can see this if you compile unix.ml with -dlambda:

  (let (Unix_error/197 (makeblock 0 "Unix.Unix_error"))

(Enforcing that there is only one of these seems a little bit delicate
with respect to module abstraction.)

Second, exceptions raised from C use Callback.register_exception,
which registers the exception (that is, the block containing the
distinguished string) globally. If you link Unix twice, loading the
second one overwrites the registration of the first. Now an exception
raised from C, by either Unix, cannot be caught by the first Unix but
only by the second.

I complained about this a while back and suggested that the bytecode
linker prevent you from linking the same module twice, but it occurs
to me now that it's necessary to allow this for the toplevel. (Still
perhaps there could be a flag for strict checking.)

I think the best solution is to be sure you have not linked Unix
twice. The objinfo tool (under tools/ in the OCaml distribution) is
useful for checking libraries; for linked binaries it's probably
easiest just to check the link command.

Jake


  reply	other threads:[~2009-06-18 16:47 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-18 12:16 Romain Beauxis
2009-06-18 13:17 ` [Caml-list] " Stéphane Glondu
2009-06-18 13:28   ` Romain Beauxis
2009-06-18 14:41   ` David Baelde
2009-06-18 16:47     ` Jake Donham [this message]
2009-06-18 19:21     ` Stéphane Glondu
2009-06-18 20:16       ` David Baelde
2009-06-19 13:23       ` Romain Beauxis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c7e4e9f0906180947y5def2aefu74da838861fe90bc@mail.gmail.com \
    --to=jake@donham.org \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).