【问题标题】:scala native: dynamically compose dynamically loaded functionsscala native:动态组合动态加载的函数
【发布时间】:2020-09-08 08:36:03
【问题描述】:

我正在尝试定义一个辅助方法来动态组合动态加载的函数。

import scala.scalanative.native._

@extern
@link("dl")
object dl {
  def dlopen(path: CString, mode: CInt): Ptr[Byte] = extern
  def dlsym(handle: Ptr[Byte], sym: CString): Ptr[Unit] = extern
}

object Sample extends App {
  type Lambda = CFunctionPtr1[Ptr[Unit], Ptr[Unit]]

  def compose[A,B](fs: Lambda*)(in: Ptr[A]): Ptr[B] =
    fs.foldLeft(in.asInstanceOf[Ptr[Unit]]){case (acc, f) =>
      f.apply(acc)
    }.asInstanceOf[Ptr[B]]

  def compose[A, B](f: Lambda, g: Lambda)(in: Ptr[A]): Ptr[B] =
    g(f(in.asInstanceOf[Ptr[Unit]])).asInstanceOf[Ptr[B]]

  Zone { implicit alloc =>
    val handle = dl.dlopen(toCString("functions.so"), 1)
    val fOne = dl.dlsym(handle, toCString("one")).asInstanceOf[Lambda]
    val fTwo = dl.dlsym(handle, toCString("two")).asInstanceOf[Lambda]
    val ptr = stdlib.malloc(sizeof[CInt]).asInstanceOf[Ptr[CInt]]

    val result = compose[CInt, CBool](fOne, fTwo)(ptr)
    println(!result)
  }
}

上述代码适用于固定参数compose,但不适用于可变参数compose

在后一种情况下,我得到:

[error] (Compile / nativeLink) scala.scalanative.util.UnsupportedException: can't cast from Class(Top(java.lang.Object)) to Ptr

我正在使用 scala native 0.3.9 和 scala 2.11.12

【问题讨论】:

    标签: scala-native


    【解决方案1】:

    上述错误has been fixed0.4.0another issue 用于CFuncPtr <-> Ptr[Byte] 转换仍然在scala native 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-16
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2012-01-31
      相关资源
      最近更新 更多