core/string_mirror.rb
module Rubinius
class Mirror
class String < Mirror
self.subject = ::String
def character_to_byte_index(idx, start=0)
Rubinius.invoke_primitive :string_character_byte_index, @object, idx, start
end
def byte_to_character_index(idx, start=0)
Rubinius.invoke_primitive :string_byte_character_index, @object, idx, start
end
def character_index(str, start)
Rubinius.invoke_primitive :string_character_index, @object, str, start
end
def byte_index(value, start=0)
Rubinius.invoke_primitive :string_byte_index, @object, value, start
end
def find_string(pattern, start)
Rubinius.invoke_primitive :string_index, @object, pattern, start
end
def find_string_reverse(pattern, start)
Rubinius.invoke_primitive :string_rindex, @object, pattern, start
end
def previous_byte_index(index)
Rubinius.invoke_primitive :string_previous_byte_index, @object, index
end
def copy_from(other, start, size, dest)
Rubinius.invoke_primitive :string_copy_from, @object, other, start, size, dest
end
def resize_capacity(count)
Rubinius.invoke_primitive :string_resize_capacity, @object, count
end
def splice(start, count, replacement)
str = @object
# TODO: copy_from unshares
str.modify!
bs = str.bytesize
rbs = replacement.bytesize
bytes = bs - count + rbs
s = start + count
b = bs - s
d = start + rbs
# Always resize if the resulting size is different to prevent "leaking"
# bytes in large ByteArray instances when splicing out chunks.
if rbs < count
copy_from str, s, b, d
resize_capacity bytes
elsif rbs > count
resize_capacity bytes
copy_from str, s, b, d
end
copy_from replacement, 0, rbs, start if rbs > 0
str.num_bytes = bytes
self
end
end
end
end