mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 11:54:59 -04:00
fix crash in FragmentedArrayFloatList
This commit is contained in:
parent
c82981eb7a
commit
b8088c18b9
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.util.collections.floats
|
package de.bixilon.minosoft.util.collections.floats
|
||||||
|
|
||||||
|
import de.bixilon.kutil.exception.Broken
|
||||||
import de.bixilon.minosoft.util.collections.floats.FloatListUtil.copy
|
import de.bixilon.minosoft.util.collections.floats.FloatListUtil.copy
|
||||||
import org.lwjgl.system.MemoryUtil.memAllocFloat
|
import org.lwjgl.system.MemoryUtil.memAllocFloat
|
||||||
import org.lwjgl.system.MemoryUtil.memFree
|
import org.lwjgl.system.MemoryUtil.memFree
|
||||||
@ -94,15 +95,16 @@ class FragmentedArrayFloatList(
|
|||||||
for (index in 0 until incomplete.size) {
|
for (index in 0 until incomplete.size) {
|
||||||
val fragment = incomplete[index + indexOffset]
|
val fragment = incomplete[index + indexOffset]
|
||||||
val remaining = fragment.limit() - fragment.position()
|
val remaining = fragment.limit() - fragment.position()
|
||||||
val copy = minOf(array.size, remaining) - offset
|
val copy = minOf(array.size - offset, remaining)
|
||||||
fragment.put(array, offset, copy)
|
fragment.put(array, offset, copy)
|
||||||
offset += copy
|
offset += copy
|
||||||
if (tryPush(fragment)) indexOffset--
|
if (tryPush(fragment)) indexOffset--
|
||||||
|
|
||||||
|
|
||||||
if (array.size - offset < remaining) {
|
if (array.size == offset) {
|
||||||
// everything copied
|
// everything copied
|
||||||
size += array.size
|
size += array.size
|
||||||
|
// verifyPosition()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,6 +115,7 @@ class FragmentedArrayFloatList(
|
|||||||
size += length
|
size += length
|
||||||
next.position(length)
|
next.position(length)
|
||||||
tryPush(next)
|
tryPush(next)
|
||||||
|
// verifyPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun add(buffer: FloatBuffer) {
|
override fun add(buffer: FloatBuffer) {
|
||||||
@ -125,14 +128,15 @@ class FragmentedArrayFloatList(
|
|||||||
for (index in 0 until incomplete.size) {
|
for (index in 0 until incomplete.size) {
|
||||||
val fragment = incomplete[index + indexOffset]
|
val fragment = incomplete[index + indexOffset]
|
||||||
val remaining = fragment.limit() - fragment.position()
|
val remaining = fragment.limit() - fragment.position()
|
||||||
val copy = minOf(position, remaining) - offset
|
val copy = minOf(position - offset, remaining)
|
||||||
buffer.copy(offset, fragment, fragment.position(), copy)
|
buffer.copy(offset, fragment, fragment.position(), copy)
|
||||||
offset += copy
|
offset += copy
|
||||||
if (tryPush(fragment)) indexOffset--
|
if (tryPush(fragment)) indexOffset--
|
||||||
|
|
||||||
if (position - offset < remaining) {
|
if (position == offset) {
|
||||||
// everything copied
|
// everything copied
|
||||||
size += position
|
size += position
|
||||||
|
// verifyPosition()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -143,6 +147,7 @@ class FragmentedArrayFloatList(
|
|||||||
next.position(length)
|
next.position(length)
|
||||||
size += length
|
size += length
|
||||||
tryPush(next)
|
tryPush(next)
|
||||||
|
// verifyPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun add(floatList: AbstractFloatList) {
|
override fun add(floatList: AbstractFloatList) {
|
||||||
@ -241,7 +246,7 @@ class FragmentedArrayFloatList(
|
|||||||
forEach { it.copy(buffer) }
|
forEach { it.copy(buffer) }
|
||||||
if (buffer.position() != this.size) {
|
if (buffer.position() != this.size) {
|
||||||
// TODO: this should never happen, remove this check
|
// TODO: this should never happen, remove this check
|
||||||
throw Exception("Position mismatch: ${buffer.position()}, expected $size")
|
Broken("Position mismatch: ${buffer.position()}, expected $size")
|
||||||
}
|
}
|
||||||
this.buffer = buffer
|
this.buffer = buffer
|
||||||
return buffer
|
return buffer
|
||||||
@ -255,4 +260,13 @@ class FragmentedArrayFloatList(
|
|||||||
callable(buffer)
|
callable(buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun verifyPosition() {
|
||||||
|
val expected = size
|
||||||
|
var actual = 0
|
||||||
|
forEach { actual += it.position() }
|
||||||
|
if (expected != actual) {
|
||||||
|
Broken("Buffer size mismatch: expected=$expected, actual=$actual")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user