scala-native / scala-native-bindgen

Scala Native Binding Generator

Home Page:https://scala-native.github.io/scala-native-bindgen/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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