Skip to content

Commit

Permalink
Fix String class fields offsets
Browse files Browse the repository at this point in the history
  • Loading branch information
lolgab committed Aug 12, 2024
1 parent acfbaf0 commit 89c2d71
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 6 deletions.
7 changes: 7 additions & 0 deletions snunit/src/snunit/unsafe/constants.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package snunit.unsafe

private[unsafe] object Constants {
final val StringCharArrayOffset = 16
final val StringOffsetOffset = 24
final val StringCountOffset = 28
}
6 changes: 3 additions & 3 deletions snunit/src/snunit/unsafe/newCharBuffer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ private[snunit] def newCharBuffer(string: String): CharBuffer = {
// deconstructing string
val stringRawPtr = castObjectToRawPtr(string)
val stringPtr = fromRawPtr[Byte](stringRawPtr)
val array: Array[Char] = loadObject(toRawPtr(stringPtr + 8)).asInstanceOf[Array[Char]]
val offset: Int = loadInt(toRawPtr(stringPtr + 16))
val count: Int = loadInt(toRawPtr(stringPtr + 20))
val array: Array[Char] = loadObject(toRawPtr(stringPtr + Constants.StringCharArrayOffset)).asInstanceOf[Array[Char]]
val offset: Int = loadInt(toRawPtr(stringPtr + Constants.StringOffsetOffset))
val count: Int = loadInt(toRawPtr(stringPtr + Constants.StringCountOffset))

CharBuffer.wrap(array, offset, count)
}
6 changes: 3 additions & 3 deletions snunit/src/snunit/unsafe/stringUtils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ private[snunit] def fromCStringAndSize(cstr: CString, size: Int): String = {
val result = new String(Array.emptyCharArray)
val resultRawPtr = castObjectToRawPtr(result)
val resultPtr = fromRawPtr[Byte](resultRawPtr)
storeObject(toRawPtr(resultPtr + 8), castObjectToRawPtr(output.array()))
storeInt(toRawPtr(resultPtr + 16), 0)
storeObject(toRawPtr(resultPtr + Constants.StringCharArrayOffset), castObjectToRawPtr(output.array()))
storeInt(toRawPtr(resultPtr + Constants.StringOffsetOffset), 0)
val length = output.position()
storeInt(toRawPtr(resultPtr + 20), length)
storeInt(toRawPtr(resultPtr + Constants.StringCountOffset), length)
result
} else ""
}
Expand Down

0 comments on commit 89c2d71

Please sign in to comment.