On 16/01/2016 08:51, David Matthews wrote:
On 15/01/2016 16:13, Phil Clayton wrote:
The functions getX and setX in Foreign.Memory take an offset as a
Word.word.  I'm finding that it is possible to have a negative offset by
negating the word offset, e.g.
   get8 (p, ~ 0w1)
Is that guaranteed work generally?

Given that
   Word.wordSize = 63
   SysWord.wordSize = 64
I wouldn't have expected this to work for get8/set8 but it does.

Phil

P.S. My efforts to inspect the source didn't get far as these functions
go straight to run-time calls and I'm not familiar with internal
representations in Poly/ML...

The intention is that they should work correctly for negative offsets.
It seemed more useful that way.  Word.toIntX does imply that the basis
library understands signed word values.

Yes - the getX/setX operations are more useful by allowing negative offsets. Unfortunately, the word offset can be viewed in an unsigned way. I would suggest e.g.
  getX : voidStar * int -> Word8.word
unless use of an int introduces more overhead.

Certainly the Basis Library understands sign extension of words. If the Word.word offset is signed extended to a SysWord.word (the underlying pointer representation) then I see no problem.


Currently these functions end up in the assembly code, in the case of
getX as cmem_load_asm_8, where it uses an arithmetic shift to detag. I'm
currently working on incorporating them into the code-generator which
will much improve efficiency but that will have to wait for the next
release.

Good to know, thanks.

Phil

_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to