<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman,new york,times,serif;font-size:12pt">One&nbsp; alternative&nbsp; to&nbsp; Wesley's&nbsp; suggestion&nbsp; (of&nbsp; having&nbsp; C&nbsp; code&nbsp; do the<br>offsetting) is to have the space getting passed between C and&nbsp; MLton&nbsp; be<br>from malloc instead of being from a MLton array.&nbsp; That way it definitely<br>will never move.<br><br>Of course then you have to handle deallocation yourself and on the MLton<br>side can only use functions in MLton.Pointer to access it.<br><br><div><br></div><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><br><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><font size="2" face="Tahoma"><hr size="1"><b><span style="font-weight: bold;">From:</span></b> Wesley W. Terpstra &lt;wesley@terpstra.ca&gt;<br><b><span style="font-weight:
 bold;">To:</span></b> mlton@mlton.org<br><b><span style="font-weight: bold;">Sent:</span></b> Thu, March 10, 2011 7:05:47 AM<br><b><span style="font-weight: bold;">Subject:</span></b> [MLton] [MLton-user] calling MLton from MLton via FFI<br></font><br>
<div class="gmail_quote"><div class="gmail_quote"><div class="im">On Wed, Mar 9, 2011 at 6:36 PM, Christopher Cramer <span dir="ltr">&lt;<a rel="nofollow" ymailto="mailto:tsuyoshi@yumegakanau.org" target="_blank" href="mailto:tsuyoshi@yumegakanau.org">tsuyoshi@yumegakanau.org</a>&gt;</span> wrote:<br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">
I need to call some C functions with a pointer to the middle of an array.<br>
The way I have been doing this is to create a function in ML, and export<br>
it, so that I can convert the array to a pointer and then add the offset.<br>
<br></div>
Is this safe?</blockquote><div><br>No.<br><br></div></div>The moment you call ML from C any pointers into the heap you previously held become invalid. You calling back into MLton via FFI is just a *really short* path through C. ;)<br>

<br>You cannot assume that the parameter pointer given to gzreadoffset is valid. The garbage collector might move it at any time.<br><br>A good way to achieve what you'd like to do is make the gzreadoffset as a small piece of C code:<br>

<br>int gzreadoffset(gzFile *f,&nbsp; unsigned char* buf, int offset, int len) {<br>&nbsp; gzread(f, buf+offset, len);<br>&nbsp; // buf is still valid because we haven't called out to SML<br>}<br><br>
</div><br>
</div></div>
</div></body></html>