[mercury-users] Abstraction barrier

David Overton dmo at cs.mu.OZ.AU
Tue May 13 15:05:53 AEST 2003

On Tue, May 13, 2003 at 03:18:52PM +1000, Michael Day wrote:
> I wish to call a predicate that returns a value and pass in some data for
> that predicate to access. However, I do not wish the predicate to return
> any of the data that I passed in, as it will unexpectedly go out of scope
> leaving dangling pointers to randomness.
> :- pred foo(magic_data, T, T).
> :- mode foo(in, in, out) is det.
> In the example above, the return T must not contain any references to
> magic_data, or bad things will happen later. But how to enforce that?

One thing you might be able to do is give the `magic_data' argument a
mode of `ui'.  This ensures that that argument will be a unique
reference to the data after foo/3 exits.

Unfortunately, there are some limitations to the current mode system
that mean that this may not always work.  In particular, if magic_data
is a type implemented in Mercury and foo/3 needs to deconstruct it then
the mode checker will not be able to prove that it still has a unique
reference to all the data it contains at the end of the call.  However,
if magic_data is a foreign type with a set of accessor predicates
implemented as foreign_procs then you just need to give them a mode with
`ui' argument (and ensure that their implementations match that mode).

> :- pred foo(magic_data, magic_token, magic_token, T, T).
> :- mode foo(in, di, uo, in, out) is det.
> Perhaps this way, and only provide accessor functions for magic_data that
> require a magic_token to operate, such that even if the function returns
> magic_data nothing can be done with it later?
> For those who care, the trickiest part of using the Win32 API from Mercury
> is managing the expectations of when pointers go out of scope. It's very
> easy to keep references to strings and other data provided by the
> operating system that go out of scope unexpectedly, leading to trouble.

If a string can go out of scope unexpectedly then you probably should
make a copy of it on the Mercury heap.

David Overton                  Uni of Melbourne     +61 3 8344 1354
dmo at cs.mu.oz.au                Monash Uni (Clayton) +61 3 9905 5779
http://www.cs.mu.oz.au/~dmo    Mobile Phone         +61 4 0337 4393
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list