fix a bug of `string-copy!` with same dist and src

`(let ((str (string-copy "abcde"))) (string-copy! str 1 str 0 2) str)` is expected  to return `"aabde"` but returns `"aaade"`.
This patch fixes it.