[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Matching multibyte alphabetical characters with LPeG
- From: William Ahern <william@...>
- Date: Wed, 20 Jun 2012 19:25:00 -0700
On Wed, Jun 20, 2012 at 04:49:34PM +0200, Thijs Schreijer wrote:
>
> > > and why cast it (incorrectly) as a lua_CFunction? Why not a boxed
> > userdata?
> >
> > It is not incorrect. ANSI C ensures that all pointers to functions are
> > compatible. That is, if A and B are pointers to functions, we can
> > convert from A to B and back to A without loss. Now that Lua 5.2 has
> > light C functions, this looks like an interesting technique to store
> > pointers to functions in Lua (as long as Lua code has no access to
> > them).
> >
> > -- Roberto
>
> You refer specifically to 5.2. Does this mean it cannot be done reliably in
> 5.1 using lightuserdata for example?
>
Standard C doesn't allow conversion between between object pointers and
function pointers. This code is undefined in C:
void *foo(void) { return (void *)&foo; }
See 6.3.2.3p1, 6.3.2.3p7, and 6.3.2.3p8 of C99. Those are the sections which
would define the behavior, but they don't; and no other section does.
In practice most platforms allow this, and POSIX actually requires it:
2.12.3 Pointer Types
All function pointer types shall have the same representation as the
type pointer to void. Conversion of a function pointer to void *
shall not alter the representation. A void * value resulting from
such a conversion can be converted back to the original function
pointer type, using an explicit cast, without loss of information.
Lua, OTOH, strives to be a strict adherent to the church of ISO C. She may
fantasize about--and ocassionally indulge--inappropriate relations between
object and void pointers, but she knows it's wrong. Still, if your platform
allows these conversions, then Lua can't prevent it.