Hi Matt.
  Thanks for the quick answer.

What's about 

> >
> >    2) Can ArraySlice.copy be patched to use System_move_words after
> >       a check that the arrays are actually not the same?
> >


This would only be a minor change.

Is the patch below safe?


fun copy {src = Slice{array=s, start=srcStart, length=srcLen}, dst, di: int} =
        if di < 0 orelse di+srcLen > Array.length dst
        then raise General.Subscript
*        else if s <> dst then
*         System_move_words(RunCall.unsafeCast s, srcStart+1, 
RunCall.unsafeCast dst, di+1, srcLen)
        else (* We can't use System_move_words because of the potential overlap 
problem. *)
        let
            fun copyUp n =
            if n = srcLen then ()
            else (Array.update(dst, n+di, Array.sub(s, n+srcStart)); 
copyUp(n+1))

            and copyDown n =
            if n < 0 then ()
            else (Array.update(dst, n+di, Array.sub(s, n+srcStart)); 
copyDown(n-1))
        in
            if di > srcStart then copyDown(srcLen-1) else copyUp 0
        end

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

Reply via email to