On Tue, 24 Jun 2014 12:55:09 -0400, H. S. Teoh via Digitalmars-d
<[email protected]> wrote:
On Tue, Jun 24, 2014 at 11:36:26AM -0400, Steven Schveighoffer via
Digitalmars-d wrote:
On Tue, 24 Jun 2014 00:24:50 -0400, deadalnix <[email protected]>
wrote:
[...]
>Anything that JIT is affected. Consider the pseudocode:
>
>void JIT() {
> void* code = malloc(XXX);
> // Write instructions into the allocated chunk of memory.
>
> membar(); // Memory barrier to avoid reordering.
>
> auto fun = cast(void function()) code;
> fun(); // Even if your codegen is correct, anything can happen
this point.
>}
This is not what we are talking about.
We are talking about whether a valid function pointer can be cast to
void * and back again. It is undefined for C/C++. Should it be defined
for D?
[...]
It's a judgment call. Defining it means that (void*).sizeof must be the
size of the largest pointer type on a particular platform, meaning that
if, for example, pointer to data is 32-bit but pointer to function is
64-bit, then we're effectively doubling the size of void* (it must be
64-bit to support free casting to/from function pointers) relative to
any other non-function pointer. So code that deals only with data void*
will have to pay for this cost for no benefit.
there are other options. We can not support the platform (I don't think
this is a huge loss). We can not support casting function pointers to void
* on that platform.
-Steve