@JRubyMethod(name = "putc", required = 1) @Override public IRubyObject putc(IRubyObject obj) { checkWritable(); byte c = RubyNumeric.num2chr(obj); checkFrozen(); data.internal.modify(); ByteList bytes = data.internal.getByteList(); if (data.modes.isAppendable()) { data.pos = bytes.length(); bytes.append(c); } else { if (isEndOfString()) bytes.length((int) data.pos + 1); bytes.set((int) data.pos, c); data.pos++; } return obj; }
private int writeInternal(ThreadContext context, IRubyObject arg) { checkWritable(); checkFrozen(); RubyString val = arg.asString(); data.internal.modify(); if (data.modes.isAppendable()) { data.internal.getByteList().append(val.getByteList()); data.pos = data.internal.getByteList().length(); } else { int left = data.internal.getByteList().length() - (int) data.pos; data.internal .getByteList() .replace((int) data.pos, Math.min(val.getByteList().length(), left), val.getByteList()); data.pos += val.getByteList().length(); } if (val.isTaint()) { data.internal.setTaint(true); } return val.getByteList().length(); }