Helper methods does not work for CArray fields
kornilova203 opened this issue · comments
Consider following structure with const array:
struct structWithArray {
const int arr[5];
};
Bindgen generates following type and helper methods:
type struct_structWithArray = native.CStruct1[native.CArray[native.CInt, native.Nat._5]]
// ...
implicit class struct_structWithArray_ops(val p: native.Ptr[struct_structWithArray]) extends AnyVal {
def arr: native.CArray[native.CInt, native.Nat._5] = !p._1
def arr_=(value: native.CArray[native.CInt, native.Nat._5]):Unit = !p._1 = value
}
def struct_structWithArray()(implicit z: native.Zone): native.Ptr[struct_structWithArray] = native.alloc[struct_structWithArray]
Lets create instance of struct_structWithArray
and array of type int
package org.scalanative.bindgen.samples
import utest._
import scala.scalanative.native._
import org.scalanative.bindgen.samples.StructHelpers._
// ...
val structWithArray = struct_structWithArray()
val array = alloc[CArray[CInt, Nat._5]]
Following code works fine:
!structWithArray._1 = !array
But code that uses helper method fails:
structWithArray.arr_=(!array) // fails
[error] scala.scalanative.util.UnsupportedException: can't cast from Array(Int,5) to Array(Class(Top(java.lang.Object)),0)
[error] at scala.scalanative.util.package$.unsupported(package.scala:20)
[error] at scala.scalanative.optimizer.pass.AsLowering.onInst(AsLowering.scala:15)
[error] at scala.scalanative.optimizer.Pass.$anonfun$onInsts$1(Pass.scala:44)
[error] at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
[error] at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
[error] at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
[error] at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
[error] at scala.collection.TraversableLike.map(TraversableLike.scala:234)
[error] at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
[error] at scala.collection.AbstractTraversable.map(Traversable.scala:104)
[error] at scala.scalanative.optimizer.Pass.onInsts(Pass.scala:44)
[error] at scala.scalanative.optimizer.Pass.onInsts$(Pass.scala:43)
[error] at scala.scalanative.optimizer.pass.AsLowering.onInsts(AsLowering.scala:9)
[error] at scala.scalanative.optimizer.Pass.onDefn(Pass.scala:32)
Seems like it is related to scala-native/scala-native#555
because if we simply create a functions that accepts an array it will also fail with the same error:
def useArray(value: CArray[CInt, Nat._5]): Unit = {
// fails
}
I suggest to change helper methods for CArray
or CStruct
fields such that they accept/return pointers