Override ByteArrayOutputStream::write(byte[],int,int). Fixes #322.

This commit is contained in:
Marco Castelluccio 2014-09-26 10:37:25 -07:00
Родитель f3e7e6dbe2
Коммит 893b6a11c7
1 изменённых файлов: 25 добавлений и 0 удалений

Просмотреть файл

@ -39,3 +39,28 @@ Override["java/lang/Math.min.(II)I"] = function(ctx, stack) {
var b = stack.pop(), a = stack.pop();
stack.push(a <= b ? a : b);
}
Override["java/io/ByteArrayOutputStream.write.([BII)V"] = function(ctx, stack) {
var len = stack.pop(), off = stack.pop(), b = stack.pop(), _this = stack.pop();
if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
ctx.raiseExceptionAndYield("java/lang/IndexOutOfBoundsException");
} else if (len == 0) {
return;
}
var count = _this.class.getField("count", "I").get(_this);
var buf = _this.class.getField("buf", "[B").get(_this);
var newcount = count + len;
if (newcount > buf.length) {
var newbuf = ctx.newPrimitiveArray("B", Math.max(buf.length << 1, newcount));
newbuf.set(buf);
buf = newbuf;
_this.class.getField("buf", "[B").set(_this, buf);
}
buf.set(b.subarray(off, off + len), count);
_this.class.getField("count", "I").set(_this, newcount);
}