diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index dd2d2911..5255a3cb 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -20,8 +20,7 @@ jobs: - uses: VirtusLab/scala-cli-setup@v0.1.20 with: jvm: temurin:1.${{ matrix.jvm }} - apps: mill - - run: mill j${{ matrix.jvm }}.benchmarks.test -f1 -wi 2 -i 2 -o j${{ matrix.jvm }}-${{ matrix.os }}.bench -rff j${{ matrix.jvm }}-${{ matrix.os }}.json -rf json .*${{ matrix.benchmark }}${{ matrix.jit }}.* + - run: ./mill j${{ matrix.jvm }}.benchmarks.test -f1 -wi 2 -i 2 -o j${{ matrix.jvm }}-${{ matrix.os }}.bench -rff j${{ matrix.jvm }}-${{ matrix.os }}.json -rf json .*${{ matrix.benchmark }}${{ matrix.jit }}.* - run: scala-cli run scripts/PublishBenchmarkReport.sc -- "Java ${{ matrix.jvm}}" ${{ matrix.os }} out/j${{ matrix.jvm }}/benchmarks/test/jmhRun.dest/j${{ matrix.jvm }}-${{ matrix.os }}.json ${{ matrix.benchmark }} ${{ matrix.jit }} >> $GITHUB_STEP_SUMMARY - uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bdb4452d..2f97d45e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,7 @@ jobs: - uses: coursier/setup-action@v1.3.0 with: jvm: temurin:1.17 - apps: mill - - run: mill mill.scalalib.scalafmt.ScalafmtModule/checkFormatAll __.sources + - run: ./mill mill.scalalib.scalafmt.ScalafmtModule/checkFormatAll __.sources unit-tests: strategy: diff --git a/build.sc b/build.sc index 38dba93e..cde30743 100644 --- a/build.sc +++ b/build.sc @@ -16,7 +16,7 @@ trait BaseModule extends ScoverageModule with ScalafmtModule { def scalaVersion = "3.3.0" def scoverageVersion = "2.0.7" - val munitVersion = "1.0.0-M7" + val munitVersion = "1.0.0-M8" val jmhV = "1.33" def ivyDeps = Agg( diff --git a/core/src/fr/hammons/slinc/Allocator.scala b/core/src/fr/hammons/slinc/Allocator.scala index 5c8835a3..a7f39586 100644 --- a/core/src/fr/hammons/slinc/Allocator.scala +++ b/core/src/fr/hammons/slinc/Allocator.scala @@ -4,7 +4,7 @@ import java.lang.invoke.{MethodHandle, MethodType, MethodHandles} import fr.hammons.slinc.modules.DescriptorModule trait Allocator: - def allocate(descriptor: TypeDescriptor, num: Int): Mem + def allocate(descriptor: ForeignTypeDescriptor, num: Int): Mem def addCloseAction(fn: () => Unit): Unit def upcall[Fn](descriptor: FunctionDescriptor, target: Fn): Mem protected def methodHandleFromFn[Fn]( diff --git a/core/src/fr/hammons/slinc/CUnion.scala b/core/src/fr/hammons/slinc/CUnion.scala index aacff1f3..5b885bc7 100644 --- a/core/src/fr/hammons/slinc/CUnion.scala +++ b/core/src/fr/hammons/slinc/CUnion.scala @@ -32,11 +32,12 @@ class CUnion[T <: Tuple](private[slinc] val mem: Mem): setHelper[T, A](a) object CUnion: - private inline def applyHelper[T <: Tuple](td: TypeDescriptor | Null)(using - DescriptorModule - ): TypeDescriptor = inline erasedValue[T] match + private inline def applyHelper[T <: Tuple](td: ForeignTypeDescriptor | Null)( + using DescriptorModule + ): ForeignTypeDescriptor = inline erasedValue[T] match case _: (a *: t) => - val aDesc = summonInline[DescriptorOf[a]].descriptor + val aDesc = + summonInline[DescriptorOf[a]].descriptor.toForeignTypeDescriptor val max = if td != null then if td.size > aDesc.size then td diff --git a/core/src/fr/hammons/slinc/DescriptorOf.scala b/core/src/fr/hammons/slinc/DescriptorOf.scala index e94c7cec..eb7f5f71 100644 --- a/core/src/fr/hammons/slinc/DescriptorOf.scala +++ b/core/src/fr/hammons/slinc/DescriptorOf.scala @@ -58,6 +58,8 @@ object DescriptorOf: given DescriptorOf[VarArgs] with val descriptor: TypeDescriptor { type Inner = VarArgs } = VaListDescriptor + given [A](using t: Transform[A, ?]): DescriptorOf[A] = t + def getDescriptorFor[A](using Quotes, Type[A]) = import quotes.reflect.* val expr = Expr diff --git a/core/src/fr/hammons/slinc/FunctionDescriptor.scala b/core/src/fr/hammons/slinc/FunctionDescriptor.scala index 6df6b9f2..089a36b2 100644 --- a/core/src/fr/hammons/slinc/FunctionDescriptor.scala +++ b/core/src/fr/hammons/slinc/FunctionDescriptor.scala @@ -23,8 +23,11 @@ final case class FunctionDescriptor( case FunctionDescriptor(head +: tail, variadicDescriptors, None) => VoidHelper .methodTypeV( - head.toCarrierType, - tail.view.concat(variadicDescriptors).map(_.toCarrierType).toSeq* + head.toForeignTypeDescriptor.toCarrierType, + tail.view + .concat(variadicDescriptors) + .map(_.toForeignTypeDescriptor.toCarrierType) + .toSeq* ) .nn @@ -35,15 +38,20 @@ final case class FunctionDescriptor( ) => MethodType .methodType( - outputDescriptor.toCarrierType, - head.toCarrierType, - tail.view.concat(variadicDescriptors).map(_.toCarrierType).toSeq* + outputDescriptor.toForeignTypeDescriptor.toCarrierType, + head.toForeignTypeDescriptor.toCarrierType, + tail.view + .concat(variadicDescriptors) + .map(_.toForeignTypeDescriptor.toCarrierType) + .toSeq* ) .nn case FunctionDescriptor(_, _, None) => VoidHelper.methodTypeV().nn case FunctionDescriptor(_, _, Some(outputDescriptor)) => - MethodType.methodType(outputDescriptor.toCarrierType).nn + MethodType + .methodType(outputDescriptor.toForeignTypeDescriptor.toCarrierType) + .nn object FunctionDescriptor: def fromDefDef(using q: Quotes)(symbol: q.reflect.Symbol) = diff --git a/core/src/fr/hammons/slinc/Ptr.scala b/core/src/fr/hammons/slinc/Ptr.scala index aab0bb26..c99dc3e3 100644 --- a/core/src/fr/hammons/slinc/Ptr.scala +++ b/core/src/fr/hammons/slinc/Ptr.scala @@ -29,14 +29,18 @@ class Ptr[A](private[slinc] val mem: Mem, private[slinc] val offset: Bytes): r: ReadWriteModule )(using ClassTag[A]): IArray[A] = IArray.unsafeFromArray( - r.readArray(mem.resize(DescriptorOf[A].size * size), offset, size) + r.readArray( + mem.resize(DescriptorOf[A].toForeignTypeDescriptor.size * size), + offset, + size + ) ) def `unary_!_=`(value: A)(using rwM: ReadWriteModule, desc: DescriptorOf[A]) = rwM.write(mem, offset, desc.descriptor, value) def apply(bytes: Bytes): Ptr[A] = Ptr[A](mem, offset + bytes) def apply(index: Int)(using DescriptorOf[A], DescriptorModule): Ptr[A] = - Ptr[A](mem, offset + (DescriptorOf[A].size * index)) + Ptr[A](mem, offset + (DescriptorOf[A].toForeignTypeDescriptor.size * index)) def castTo[A]: Ptr[A] = this.asInstanceOf[Ptr[A]] private[slinc] def resize(toBytes: Bytes) = @@ -59,12 +63,15 @@ object Ptr: def blankArray[A]( num: Int )(using descriptor: DescriptorOf[A], alloc: Allocator): Ptr[A] = - Ptr[A](alloc.allocate(DescriptorOf[A], num), Bytes(0)) + Ptr[A]( + alloc.allocate(DescriptorOf[A].toForeignTypeDescriptor, num), + Bytes(0) + ) def copy[A]( a: Array[A] )(using alloc: Allocator, descriptor: DescriptorOf[A], rwm: ReadWriteModule) = - val mem = alloc.allocate(DescriptorOf[A], a.size) + val mem = alloc.allocate(DescriptorOf[A].toForeignTypeDescriptor, a.size) rwm.writeArray(mem, Bytes(0), a) Ptr[A](mem, Bytes(0)) @@ -76,7 +83,7 @@ object Ptr: val descriptor: TypeDescriptor { type Inner = A } } ) = - val mem = alloc.allocate(DescriptorOf[A], 1) + val mem = alloc.allocate(DescriptorOf[A].toForeignTypeDescriptor, 1) rwm.write(mem, Bytes(0), descriptor.descriptor, a) Ptr[A](mem, Bytes(0)) diff --git a/core/src/fr/hammons/slinc/Slinc.scala b/core/src/fr/hammons/slinc/Slinc.scala index c7577b6e..4d0a142b 100644 --- a/core/src/fr/hammons/slinc/Slinc.scala +++ b/core/src/fr/hammons/slinc/Slinc.scala @@ -22,7 +22,7 @@ trait Slinc: export types.os def sizeOf[A](using l: DescriptorOf[A]) = - SizeT.maybe(DescriptorOf[A].size.toLong).get + SizeT.maybe(DescriptorOf[A].toForeignTypeDescriptor.size.toLong).get def Null[A] = scopePlatformSpecific.nullPtr[A] diff --git a/core/src/fr/hammons/slinc/Struct.scala b/core/src/fr/hammons/slinc/Struct.scala index 89c32a88..761903d7 100644 --- a/core/src/fr/hammons/slinc/Struct.scala +++ b/core/src/fr/hammons/slinc/Struct.scala @@ -36,7 +36,8 @@ object Struct: rwm: ReadWriteModule, dm: DescriptorModule ): Writer[A] = - val offsets = dm.memberOffsets(memberDescriptors[A]) + val offsets = + dm.memberOffsets(memberDescriptors[A].map(_.toForeignTypeDescriptor)) (mem, offset, value) => writeGenHelper( offsets.map(_ + offset), @@ -67,7 +68,8 @@ object Struct: rwm: ReadWriteModule, dm: DescriptorModule ): Reader[A] = - val offsets: IArray[Bytes] = dm.memberOffsets(memberDescriptors[A]) + val offsets: IArray[Bytes] = + dm.memberOffsets(memberDescriptors[A].map(_.toForeignTypeDescriptor)) (mem, offset) => { val elems: m.MirroredElemTypes = readGenHelper[m.MirroredElemTypes](offsets.map(_ + offset), 0, mem) diff --git a/core/src/fr/hammons/slinc/Transform.scala b/core/src/fr/hammons/slinc/Transform.scala new file mode 100644 index 00000000..bc62875e --- /dev/null +++ b/core/src/fr/hammons/slinc/Transform.scala @@ -0,0 +1,13 @@ +package fr.hammons.slinc + +trait Transform[A, B](using val desc: DescriptorOf[B])( + _transformFrom: B => A, + _transformTo: A => B +) extends DescriptorOf[A]: + val descriptor + : TransformDescriptor { type Inner = A; val cRep: desc.descriptor.type } = + new TransformDescriptor: + val cRep: desc.descriptor.type = desc.descriptor + type Inner = A + val transformFrom = _transformFrom + val transformTo = _transformTo diff --git a/core/src/fr/hammons/slinc/TypeDescriptor.scala b/core/src/fr/hammons/slinc/TypeDescriptor.scala index 38ab3e13..117bebb1 100644 --- a/core/src/fr/hammons/slinc/TypeDescriptor.scala +++ b/core/src/fr/hammons/slinc/TypeDescriptor.scala @@ -22,10 +22,6 @@ sealed trait TypeDescriptor: type Inner given DescriptorOf[Inner] with val descriptor = self - def size(using dm: DescriptorModule): Bytes = dm.sizeOf(this) - def alignment(using dm: DescriptorModule): Bytes = dm.alignmentOf(this) - def toCarrierType(using dm: DescriptorModule): Class[?] = - dm.toCarrierType(this) val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] val writer: (ReadWriteModule, DescriptorModule) ?=> Writer[Inner] @@ -44,7 +40,7 @@ sealed trait TypeDescriptor: Inner ] = val reader = this.reader - val size = this.size + val size = this.toForeignTypeDescriptor.size (mem, offset, num) => { var i = 0 val array = Array.ofDim[Inner](num) @@ -57,12 +53,22 @@ sealed trait TypeDescriptor: val arrayWriter : (ReadWriteModule, DescriptorModule) ?=> Writer[Array[Inner]] = val writer = this.writer - val size = this.size + val size = this.toForeignTypeDescriptor.size (mem, offset, a) => var i = 0 while i < a.length do writer(mem, size * i + offset, a(i)) i += 1 + + def toForeignTypeDescriptor: ForeignTypeDescriptor + +sealed trait ForeignTypeDescriptor extends TypeDescriptor: + def toForeignTypeDescriptor: ForeignTypeDescriptor = this + def size(using dm: DescriptorModule): Bytes = dm.sizeOf(this) + def alignment(using dm: DescriptorModule): Bytes = dm.alignmentOf(this) + def toCarrierType(using dm: DescriptorModule): Class[?] = + dm.toCarrierType(this) + object TypeDescriptor: def fromTypeRepr(using q: Quotes)( typeRepr: q.reflect.TypeRepr @@ -83,7 +89,7 @@ object TypeDescriptor: inline val unusedImplicit = "msg=unused implicit parameter" -sealed trait BasicDescriptor extends TypeDescriptor: +sealed trait BasicDescriptor extends ForeignTypeDescriptor: override val argumentTransition = identity override val returnTransition = _.asInstanceOf[Inner] @@ -118,7 +124,7 @@ case object DoubleDescriptor extends BasicDescriptor: val reader = readWriteModule.doubleReader val writer = readWriteModule.doubleWriter -case object PtrDescriptor extends TypeDescriptor: +case object PtrDescriptor extends ForeignTypeDescriptor: type Inner = Ptr[?] override val reader = (mem, offset) => Ptr(readWriteModule.memReader(mem, offset), Bytes(0)) @@ -152,7 +158,7 @@ trait StructDescriptor( val members: List[StructMemberDescriptor], val clazz: Class[?], val transform: Tuple => Product -) extends TypeDescriptor +) extends ForeignTypeDescriptor case class AliasDescriptor[A](val real: TypeDescriptor) extends TypeDescriptor: type Inner = A @@ -174,13 +180,11 @@ case class AliasDescriptor[A](val real: TypeDescriptor) extends TypeDescriptor: summon[TransitionModule].methodArgument(real, _, summon[Allocator]) override val returnTransition = summon[TransitionModule].methodReturn(real, _) - override def size(using dm: DescriptorModule): Bytes = dm.sizeOf(real) - override def alignment(using dm: DescriptorModule): Bytes = - dm.alignmentOf(real) - override def toCarrierType(using dm: DescriptorModule): Class[?] = - dm.toCarrierType(real) -case object VaListDescriptor extends TypeDescriptor: + def toForeignTypeDescriptor: ForeignTypeDescriptor = + real.toForeignTypeDescriptor + +case object VaListDescriptor extends ForeignTypeDescriptor: type Inner = VarArgs override val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] = @@ -200,7 +204,7 @@ case object VaListDescriptor extends TypeDescriptor: summon[TransitionModule].addressReturn(o).asVarArgs case class CUnionDescriptor(possibleTypes: Set[TypeDescriptor]) - extends TypeDescriptor: + extends ForeignTypeDescriptor: type Inner = CUnion[? <: NonEmptyTuple] override val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] = @@ -223,7 +227,7 @@ case class SetSizeArrayDescriptor( val contained: TypeDescriptor, val number: Int )(using ClassTag[contained.Inner]) - extends TypeDescriptor: + extends ForeignTypeDescriptor: override val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] = (mem, offset) => @@ -256,3 +260,32 @@ case class SetSizeArrayDescriptor( summon[ReadWriteModule].read(mem, Bytes(0), this) type Inner = SetSizeArray[contained.Inner, ?] + +trait TransformDescriptor extends TypeDescriptor: + val cRep: TypeDescriptor + val transformTo: Inner => cRep.Inner + val transformFrom: cRep.Inner => Inner + + protected inline def toInner[A <: Matchable](a: A) = + import scala.compiletime.error + inline a match + case b: cRep.Inner => b + case _ => error("cannot convert") + + override val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] = + (mem: Mem, bytes: Bytes) => transformFrom(cRep.reader(mem, bytes)) + + override val writer: (ReadWriteModule, DescriptorModule) ?=> Writer[Inner] = + (mem, bytes, value) => cRep.writer(mem, bytes, transformTo(value)) + + override val argumentTransition + : (TransitionModule, ReadWriteModule, Allocator) ?=> ArgumentTransition[ + Inner + ] = cRep.argumentTransition.compose(transformTo) + + override val returnTransition + : (TransitionModule, ReadWriteModule) ?=> ReturnTransition[Inner] = + cRep.returnTransition.andThen(transformFrom) + + def toForeignTypeDescriptor: ForeignTypeDescriptor = + cRep.toForeignTypeDescriptor diff --git a/core/src/fr/hammons/slinc/modules/DescriptorModule.scala b/core/src/fr/hammons/slinc/modules/DescriptorModule.scala index ea467972..75b44fa4 100644 --- a/core/src/fr/hammons/slinc/modules/DescriptorModule.scala +++ b/core/src/fr/hammons/slinc/modules/DescriptorModule.scala @@ -1,11 +1,12 @@ package fr.hammons.slinc.modules -import fr.hammons.slinc.{Bytes, TypeDescriptor} +import fr.hammons.slinc.Bytes +import fr.hammons.slinc.ForeignTypeDescriptor /** A module used to perform Platform dependent work with a descriptor */ trait DescriptorModule: - def memberOffsets(sd: List[TypeDescriptor]): IArray[Bytes] - def sizeOf(td: TypeDescriptor): Bytes - def alignmentOf(td: TypeDescriptor): Bytes - def toCarrierType(td: TypeDescriptor): Class[?] + def memberOffsets(sd: List[ForeignTypeDescriptor]): IArray[Bytes] + def sizeOf(td: ForeignTypeDescriptor): Bytes + def alignmentOf(td: ForeignTypeDescriptor): Bytes + def toCarrierType(td: ForeignTypeDescriptor): Class[?] diff --git a/core/src/fr/hammons/slinc/types/Basic.scala b/core/src/fr/hammons/slinc/types/Basic.scala index 1d8e81ad..e4d46218 100644 --- a/core/src/fr/hammons/slinc/types/Basic.scala +++ b/core/src/fr/hammons/slinc/types/Basic.scala @@ -1,8 +1,26 @@ package fr.hammons.slinc.types +import fr.hammons.slinc.Transform + type CChar = Byte type CShort = Short type CInt = Int type CFloat = Float type CDouble = Double type CLongLong = Long + +opaque type CBool >: Boolean <: Boolean = Boolean + +object CBool: + given Transform[CBool, Byte]( + b => if b != (0: Byte) then true else false, + b => if b then 1: Byte else 0: Byte + ) + +opaque type CBoolShort >: Boolean <: Boolean = Boolean + +object CBoolShort: + given Transform[CBoolShort, Short]( + s => if s != (0: Short) then true else false, + b => if b then 1: Short else 0: Short + ) diff --git a/core/test/native/test.c b/core/test/native/test.c deleted file mode 100644 index 53154f83..00000000 --- a/core/test/native/test.c +++ /dev/null @@ -1,174 +0,0 @@ -#include -#include -#include -#include - -struct a_t -{ - int a; - int b; -}; - -struct b_t -{ - int c; - struct a_t d; -}; - -struct c_t -{ - int a[3]; - float b[3]; -}; - -int int_test(int a) -{ - return a + 3; -} - -short short_test(short a) -{ - return a + 2; -} - -char byte_test(char a) -{ - return a + 1; -} - -char char_test(char a) -{ - return toupper(a); -} - -long long_test(long a) -{ - return a + 4; -} - -float float_test(float a) -{ - return a + 4.0f; -} - -double double_test(double a) -{ - return a + 3.0; -} - -int bool_test(int a) -{ - if (a) - { - return !a; - } - else - { - return a; - } -} - -char string_test(char *str) -{ - return str[1]; -} - -char *badval; - -void bad_method(const char *str) -{ - badval = str; - return; -} - -char *ibreak(char *str) -{ - return badval; -} - -int sum(int n, ...) -{ - int Sum = 0; - va_list ptr; - va_start(ptr, n); - for (int i = 0; i < n; i++) - Sum += va_arg(ptr, int); - - va_end(ptr); - - return Sum; -} - -struct b_t slinc_test_modify(struct b_t b) -{ - b.d.a += 6; - return b; -} - -struct c_t slinc_test_addone(struct c_t c) -{ - for (int i = 0; i < 3; i++) - { - c.a[i] += 1; - c.b[i] += 1; - } - - return c; -} - -void slinc_test_passstaticarr(int res[3]) -{ - return; -} - -int *slinc_test_getstaticarr() -{ - - int *ret = malloc(sizeof(int) * 3); - ret[0] = 1; - ret[1] = 2; - ret[2] = 3; - - return ret; -} - -int slinc_two_structs(struct a_t a, struct a_t b) -{ - return a.a * b.a; -} - -int slinc_upcall(int (*zptr)()) -{ - return zptr(); -} - -int slinc_upcall_a_t(struct a_t (*zptr)()) -{ - struct a_t a = zptr(); - return a.a + a.b; -} - -struct a_t get_a_struct() -{ - struct a_t a; - a.a = 3; - a.b = 2; - return a; -} - -typedef struct a_t (*a_fn_ptr)(); -a_fn_ptr slinc_fptr_ret() -{ - return get_a_struct; -} - -int adder(int a, int b) -{ - return a + b; -} - -typedef int (*adderfn)(int, int); -adderfn slinc_fptr_ret2() -{ - return adder; -} diff --git a/core/test/resources/native/test.c b/core/test/resources/native/test.c index 8a7543a7..f4d9e30b 100644 --- a/core/test/resources/native/test.c +++ b/core/test/resources/native/test.c @@ -147,4 +147,8 @@ EXPORTED int* i180_test(int my_array[5]) { i++; } return my_array; +} + +EXPORTED char i213_test(char bool) { + return bool; } \ No newline at end of file diff --git a/core/test/src/fr/hammons/slinc/BindingSpec.scala b/core/test/src/fr/hammons/slinc/BindingSpec.scala index 45df3fe3..3502798f 100644 --- a/core/test/src/fr/hammons/slinc/BindingSpec.scala +++ b/core/test/src/fr/hammons/slinc/BindingSpec.scala @@ -63,6 +63,8 @@ trait BindingSpec(val slinc: Slinc) extends ScalaCheckSuite: input: SetSizeArray[CInt, 5] ): SetSizeArray[CInt, 5] + def i213_test(b: CBool): CBool + test("int_identity") { val test = FSet.instance[TestLib] @@ -198,3 +200,8 @@ trait BindingSpec(val slinc: Slinc) extends ScalaCheckSuite: val retArr = test.i180_test(arr) retArr.zip(arr.map(_ * 2)).foreach(assertEquals(_, _)) + + property("issue 213 - can send and receive boolean values"): + val test = FSet.instance[TestLib] + forAll: (b: Boolean) => + assertEquals(test.i213_test(b), b) diff --git a/core/test/src/fr/hammons/slinc/StdlibSpec.scala b/core/test/src/fr/hammons/slinc/StdlibSpec.scala index 860b092c..30ef9016 100644 --- a/core/test/src/fr/hammons/slinc/StdlibSpec.scala +++ b/core/test/src/fr/hammons/slinc/StdlibSpec.scala @@ -110,7 +110,7 @@ trait StdlibSpec(val slinc: Slinc) extends ScalaCheckSuite: cstd.qsort( cArr, len, - DescriptorOf[Int].size.toSizeT, + DescriptorOf[CInt].toForeignTypeDescriptor.size.toSizeT, Ptr.upcall((a: Ptr[Nothing], b: Ptr[Nothing]) => val aVal = !a.castTo[CInt] val bVal = !b.castTo[CInt] @@ -136,7 +136,7 @@ trait StdlibSpec(val slinc: Slinc) extends ScalaCheckSuite: cstd.qsort( arr, size, - DescriptorOf[CInt].size.toSizeT, + DescriptorOf[CInt].toForeignTypeDescriptor.size.toSizeT, Ptr.upcall: (a, b) => val aVal = !a.castTo[CInt] val bVal = !b.castTo[CInt] diff --git a/core/test/src/fr/hammons/slinc/TypeDescriptorSpec.scala b/core/test/src/fr/hammons/slinc/TypeDescriptorSpec.scala index 72717863..b7b3f28d 100644 --- a/core/test/src/fr/hammons/slinc/TypeDescriptorSpec.scala +++ b/core/test/src/fr/hammons/slinc/TypeDescriptorSpec.scala @@ -25,3 +25,25 @@ class TypeDescriptorSpec extends munit.FunSuite: ) ): TypeDescriptor ) + + test("Transforms work in place of DescriptorOfs"): + val result = compileErrors( + """ + import fr.hammons.slinc.types.* + + trait Test derives FSet{ + def test(a: CBool): CBool + def test2(a: CBoolShort): CBoolShort + } + + val runtime: Slinc = ??? + + import runtime.{*,given} + val test = FSet.instance[Test] + + val bool: Boolean = test.test(true) + val bool2: Boolean = test.test2(true) + """ + ) + + assertNoDiff(result, "") diff --git a/core/test/src/fr/hammons/slinc/TypesSpec.scala b/core/test/src/fr/hammons/slinc/TypesSpec.scala index f49e1ec9..3a5423b8 100644 --- a/core/test/src/fr/hammons/slinc/TypesSpec.scala +++ b/core/test/src/fr/hammons/slinc/TypesSpec.scala @@ -6,7 +6,7 @@ import types.* trait TypesSpec(val slinc: Slinc) extends munit.FunSuite: import slinc.{*, given} test("can create maximally sized CLongs") { - val size = DescriptorOf[CLong].size + val size = DescriptorOf[CLong].toForeignTypeDescriptor.size val x = if size == 4.toBytes then Some(CLong(Int.MaxValue)) else if size == 8.toBytes then CLong.maybe(Long.MaxValue) diff --git a/core/test/src/fr/hammons/slinc/modules/DescriptorSpec.scala b/core/test/src/fr/hammons/slinc/modules/DescriptorSpec.scala index 2519844d..8d9d9089 100644 --- a/core/test/src/fr/hammons/slinc/modules/DescriptorSpec.scala +++ b/core/test/src/fr/hammons/slinc/modules/DescriptorSpec.scala @@ -22,14 +22,16 @@ trait DescriptorSpec(val slinc: Slinc) extends munit.FunSuite: derives Struct test("CUnionDescriptor.size gives the right size"): assertEquals( - DescriptorOf[CUnion[(CInt, A, CFloat)]].size, - DescriptorOf[A].size + DescriptorOf[CUnion[(CInt, A, CFloat)]].toForeignTypeDescriptor.size, + DescriptorOf[A].toForeignTypeDescriptor.size ) test("CUnionDescriptor.alignment gives the right alignment"): assertEquals( - DescriptorOf[CUnion[(CInt, A, CFloat)]].alignment, - DescriptorOf[A].alignment + DescriptorOf[ + CUnion[(CInt, A, CFloat)] + ].toForeignTypeDescriptor.alignment, + DescriptorOf[A].toForeignTypeDescriptor.alignment ) test("ByteDescriptor is 1 byte in size"): @@ -51,25 +53,32 @@ trait DescriptorSpec(val slinc: Slinc) extends munit.FunSuite: assertEquals(DoubleDescriptor.size, Bytes(8)) test("StructDescriptor.alignment is the max of the member elements"): - assertEquals(DescriptorOf[A].alignment, Bytes(8)) + assertEquals(DescriptorOf[A].toForeignTypeDescriptor.alignment, Bytes(8)) test("StructDescriptor.size is a multiple of alignment"): - assertEquals(DescriptorOf[A].size % DescriptorOf[A].alignment, Bytes(0)) + assertEquals( + DescriptorOf[A].toForeignTypeDescriptor.size % DescriptorOf[ + A + ].toForeignTypeDescriptor.alignment, + Bytes(0) + ) assert( - DescriptorOf[A].size >= (DescriptorOf[CInt].size * 3 + DescriptorOf[ + DescriptorOf[A].toForeignTypeDescriptor.size >= (DescriptorOf[ + CInt + ].toForeignTypeDescriptor.size * 3 + DescriptorOf[ CLongLong - ].size * 2) + ].toForeignTypeDescriptor.size * 2) ) test("SetSizeArrayDescriptor is size of inner type * num"): assertEquals( - DescriptorOf[SetSizeArray[CInt, 15]].size, - DescriptorOf[CInt].size * 15 + DescriptorOf[SetSizeArray[CInt, 15]].toForeignTypeDescriptor.size, + DescriptorOf[CInt].toForeignTypeDescriptor.size * 15 ) test("SetSizeArrayDescriptor is alignment of inner type"): assertEquals( - DescriptorOf[SetSizeArray[CInt, 15]].alignment, - DescriptorOf[CInt].alignment + DescriptorOf[SetSizeArray[CInt, 15]].toForeignTypeDescriptor.alignment, + DescriptorOf[CInt].toForeignTypeDescriptor.alignment ) diff --git a/j17/src/fr/hammons/slinc/Allocator17.scala b/j17/src/fr/hammons/slinc/Allocator17.scala index 868800fe..2bb57dc6 100644 --- a/j17/src/fr/hammons/slinc/Allocator17.scala +++ b/j17/src/fr/hammons/slinc/Allocator17.scala @@ -63,7 +63,7 @@ class Allocator17( .nn ) - override def allocate(descriptor: TypeDescriptor, num: Int): Mem = + override def allocate(descriptor: ForeignTypeDescriptor, num: Int): Mem = Mem17( segmentAllocator .allocate(descriptor.size.toLong * num, descriptor.alignment.toLong) diff --git a/j17/src/fr/hammons/slinc/InferredAllocator17.scala b/j17/src/fr/hammons/slinc/InferredAllocator17.scala index 60dfd15b..d6f5727f 100644 --- a/j17/src/fr/hammons/slinc/InferredAllocator17.scala +++ b/j17/src/fr/hammons/slinc/InferredAllocator17.scala @@ -50,7 +50,7 @@ class InferredAllocator17(scope: ResourceScope, linker: CLinker) if allocated.isEmpty then scope.close() ) - override def allocate(descriptor: TypeDescriptor, num: Int): Mem = + override def allocate(descriptor: ForeignTypeDescriptor, num: Int): Mem = val mem = Mem17( allocator .allocate( diff --git a/j17/src/fr/hammons/slinc/VarArgs17.scala b/j17/src/fr/hammons/slinc/VarArgs17.scala index ebefb848..83b5d484 100644 --- a/j17/src/fr/hammons/slinc/VarArgs17.scala +++ b/j17/src/fr/hammons/slinc/VarArgs17.scala @@ -14,7 +14,7 @@ import scala.util.chaining.* class VarArgs17(args: VaList) extends VarArgs: private def get(td: TypeDescriptor): Object = - td match + td.toForeignTypeDescriptor match case ByteDescriptor => Byte.box(args.vargAsInt(C_INT).toByte) case ShortDescriptor => Short.box(args.vargAsInt(C_INT).toShort) case IntDescriptor => Int.box(args.vargAsInt(C_INT)) @@ -32,7 +32,6 @@ class VarArgs17(args: VaList) extends VarArgs: ) .nn ) - case AliasDescriptor(real) => get(real) case cud: CUnionDescriptor => LinkageModule17.tempScope(alloc ?=> args @@ -46,7 +45,7 @@ class VarArgs17(args: VaList) extends VarArgs: transitionModule17.methodReturn[A](d.descriptor, get(d.descriptor)) private def skip(td: TypeDescriptor): Unit = - td match + td.toForeignTypeDescriptor match case ByteDescriptor => args.skip(C_INT) case ShortDescriptor => args.skip(C_INT) case IntDescriptor => args.skip(C_INT) @@ -56,8 +55,7 @@ class VarArgs17(args: VaList) extends VarArgs: case PtrDescriptor | _: SetSizeArrayDescriptor => args.skip(C_POINTER) case sd: StructDescriptor => args.skip(descriptorModule17.toGroupLayout(sd)) - case AliasDescriptor(real) => skip(real) - case VaListDescriptor => args.skip(C_POINTER) + case VaListDescriptor => args.skip(C_POINTER) case cud: CUnionDescriptor => args.skip(descriptorModule17.toMemoryLayout(cud)) diff --git a/j17/src/fr/hammons/slinc/modules/DescriptorModule17.scala b/j17/src/fr/hammons/slinc/modules/DescriptorModule17.scala index 7ab52be5..f6b535c0 100644 --- a/j17/src/fr/hammons/slinc/modules/DescriptorModule17.scala +++ b/j17/src/fr/hammons/slinc/modules/DescriptorModule17.scala @@ -19,7 +19,7 @@ given descriptorModule17: DescriptorModule with val chm: TrieMap[StructDescriptor, GroupLayout] = TrieMap.empty val offsets: TrieMap[List[TypeDescriptor], IArray[Bytes]] = TrieMap.empty - def toCarrierType(td: TypeDescriptor): Class[?] = td match + override def toCarrierType(td: ForeignTypeDescriptor): Class[?] = td match case ByteDescriptor => classOf[Byte] case ShortDescriptor => classOf[Short] case IntDescriptor => classOf[Int] @@ -30,7 +30,6 @@ given descriptorModule17: DescriptorModule with case _: StructDescriptor | _: CUnionDescriptor => classOf[MemorySegment] case VaListDescriptor | _: SetSizeArrayDescriptor => classOf[MemoryAddress] - case ad: AliasDescriptor[?] => toCarrierType(ad.real) def genLayoutList( layouts: Seq[MemoryLayout], @@ -64,15 +63,15 @@ given descriptorModule17: DescriptorModule with else Seq.empty ) - override def sizeOf(td: TypeDescriptor): Bytes = Bytes( + override def sizeOf(td: ForeignTypeDescriptor): Bytes = Bytes( toMemoryLayout(td).byteSize() ) - override def alignmentOf(td: TypeDescriptor): Bytes = Bytes( + override def alignmentOf(td: ForeignTypeDescriptor): Bytes = Bytes( toMemoryLayout(td).byteAlignment ) - override def memberOffsets(sd: List[TypeDescriptor]): IArray[Bytes] = + override def memberOffsets(sd: List[ForeignTypeDescriptor]): IArray[Bytes] = offsets.getOrElseUpdate( sd, { val ll = genLayoutList( @@ -108,16 +107,17 @@ given descriptorModule17: DescriptorModule with case _ => throw Error("Unsupported platform!") def toMemoryLayout(td: TypeDescriptor): MemoryLayout = td match - case ByteDescriptor => platform.jByte - case ShortDescriptor => platform.jShort - case IntDescriptor => platform.jInt - case LongDescriptor => platform.jLong - case FloatDescriptor => platform.jFloat - case DoubleDescriptor => platform.jDouble - case PtrDescriptor => C_POINTER.nn - case VaListDescriptor => C_POINTER.nn - case sd: StructDescriptor => toGroupLayout(sd) - case ad: AliasDescriptor[?] => toMemoryLayout(ad.real) + case ByteDescriptor => platform.jByte + case ShortDescriptor => platform.jShort + case IntDescriptor => platform.jInt + case LongDescriptor => platform.jLong + case FloatDescriptor => platform.jFloat + case DoubleDescriptor => platform.jDouble + case PtrDescriptor => C_POINTER.nn + case VaListDescriptor => C_POINTER.nn + case sd: StructDescriptor => toGroupLayout(sd) + case ad: AliasDescriptor[?] => toMemoryLayout(ad.real) + case td: TransformDescriptor => toMemoryLayout(td.cRep) case SetSizeArrayDescriptor(inner, num) => MemoryLayout.sequenceLayout(num, toMemoryLayout(inner)).nn case CUnionDescriptor(possibleTypes) => diff --git a/j17/src/fr/hammons/slinc/modules/LinkageModule17.scala b/j17/src/fr/hammons/slinc/modules/LinkageModule17.scala index 5ed0d1b4..8e81e12d 100644 --- a/j17/src/fr/hammons/slinc/modules/LinkageModule17.scala +++ b/j17/src/fr/hammons/slinc/modules/LinkageModule17.scala @@ -36,7 +36,9 @@ object LinkageModule17 extends LinkageModule: ) val mtConstructor = (carriers: Seq[Class[?]]) => - descriptor.returnDescriptor.map(toCarrierType) match + descriptor.returnDescriptor + .map(_.toForeignTypeDescriptor) + .map(toCarrierType) match case None => carriers match case head +: tail => @@ -53,6 +55,7 @@ object LinkageModule17 extends LinkageModule: val mt = mtConstructor( descriptor.inputDescriptors.view .concat(variadicDescriptors) + .map(_.toForeignTypeDescriptor) .map(toCarrierType) .toSeq ) diff --git a/j17/src/fr/hammons/slinc/modules/ReadWriteModule17.scala b/j17/src/fr/hammons/slinc/modules/ReadWriteModule17.scala index 6b9c81f2..b97ea5c3 100644 --- a/j17/src/fr/hammons/slinc/modules/ReadWriteModule17.scala +++ b/j17/src/fr/hammons/slinc/modules/ReadWriteModule17.scala @@ -42,20 +42,22 @@ given readWriteModule17: ReadWriteModule with val memReader = (mem, offset) => mem.readAddress(offset) - def unionReader( + override def unionReader( typeDescriptor: TypeDescriptor ): Reader[CUnion[? <: NonEmptyTuple]] = - val size = descriptorModule17.sizeOf(typeDescriptor) + val size = descriptorModule17.sizeOf(typeDescriptor.toForeignTypeDescriptor) (mem, offset) => Scope17.createInferredScope(alloc ?=> - val newMem = alloc.allocate(typeDescriptor, 1) + val newMem = alloc.allocate(typeDescriptor.toForeignTypeDescriptor, 1) newMem.copyFrom(mem.offset(offset).resize(size)) new CUnion(newMem) ) - def unionWriter(td: TypeDescriptor): Writer[CUnion[? <: NonEmptyTuple]] = - val size = descriptorModule17.sizeOf(td) + override def unionWriter( + td: TypeDescriptor + ): Writer[CUnion[? <: NonEmptyTuple]] = + val size = descriptorModule17.sizeOf(td.toForeignTypeDescriptor) (mem, offset, value) => mem.offset(offset).resize(size).copyFrom(value.mem) arrayWriterCache diff --git a/j19/src/fr/hammons/slinc/Allocator19.scala b/j19/src/fr/hammons/slinc/Allocator19.scala index c46dc9b2..dde7ab26 100644 --- a/j19/src/fr/hammons/slinc/Allocator19.scala +++ b/j19/src/fr/hammons/slinc/Allocator19.scala @@ -30,14 +30,16 @@ class Allocator19( val fd = descriptor.outputDescriptor match case Some(r) => JFunctionDescriptor.of( - descriptorModule19.toMemoryLayout(r), + descriptorModule19.toMemoryLayout(r.toForeignTypeDescriptor), descriptor.inputDescriptors.view + .map(_.toForeignTypeDescriptor) .map(descriptorModule19.toMemoryLayout) .toSeq* ) case _ => JFunctionDescriptor.ofVoid( descriptor.inputDescriptors.view + .map(_.toForeignTypeDescriptor) .map(descriptorModule19.toMemoryLayout) .toSeq* ) @@ -46,17 +48,18 @@ class Allocator19( linker.upcallStub(mh, fd, scope).nn ) - override def allocate(descriptor: TypeDescriptor, num: Int): Mem = Mem19( - segmentAllocator - .allocate(descriptor.size.toLong * num, descriptor.alignment.toLong) - .nn - ) + override def allocate(descriptor: ForeignTypeDescriptor, num: Int): Mem = + Mem19( + segmentAllocator + .allocate(descriptor.size.toLong * num, descriptor.alignment.toLong) + .nn + ) override def base: Object = segmentAllocator private def build( builder: VaList.Builder, - typeDescriptor: TypeDescriptor, + typeDescriptor: ForeignTypeDescriptor, value: Matchable ): Unit = (typeDescriptor, value) match @@ -90,8 +93,6 @@ class Allocator19( .asInstanceOf[MemorySegment] ) ) - case (AliasDescriptor(real), v) => - build(builder, real, v) case (VaListDescriptor, varArg: VarArgs19) => builder.addVarg( ValueLayout.ADDRESS, @@ -134,7 +135,12 @@ class Allocator19( val builder = _b.nn vbuilder.vs.foreach: variadic => variadic.use[DescriptorOf](dO ?=> - v => build(builder, dO.descriptor, v.asMatchable) + v => + build( + builder, + dO.descriptor.toForeignTypeDescriptor, + v.asMatchable + ) ) , scope diff --git a/j19/src/fr/hammons/slinc/Slinc19.scala b/j19/src/fr/hammons/slinc/Slinc19.scala index 49b0b3fb..8aeee770 100644 --- a/j19/src/fr/hammons/slinc/Slinc19.scala +++ b/j19/src/fr/hammons/slinc/Slinc19.scala @@ -16,8 +16,6 @@ class Slinc19()(using @SlincImpl(19) object Slinc19: - private val compiler = - scala.quoted.staging.Compiler.make(getClass().getClassLoader().nn) private[slinc] lazy val linker = Linker.nativeLinker().nn val default = Slinc19() val noJit = Slinc19() diff --git a/j19/src/fr/hammons/slinc/VarArgs19.scala b/j19/src/fr/hammons/slinc/VarArgs19.scala index dceb2249..896f5fc1 100644 --- a/j19/src/fr/hammons/slinc/VarArgs19.scala +++ b/j19/src/fr/hammons/slinc/VarArgs19.scala @@ -20,7 +20,7 @@ private class VarArgs19(vaList: VaList) extends VarArgs: .nn .pipe(Mem19.apply(_)) - private def skip(td: TypeDescriptor): Unit = td match + private def skip(td: ForeignTypeDescriptor): Unit = td match case ByteDescriptor | ShortDescriptor | IntDescriptor => vaList.skip(ValueLayout.JAVA_INT) case LongDescriptor => vaList.skip(ValueLayout.JAVA_LONG) @@ -32,13 +32,14 @@ private class VarArgs19(vaList: VaList) extends VarArgs: vaList.skip(descriptorModule19.toGroupLayout(sd)) case cd: CUnionDescriptor => vaList.skip(descriptorModule19.toMemoryLayout(cd)) - case AliasDescriptor(real) => skip(real) - override def skip[A](using dO: DescriptorOf[A]): Unit = skip(dO.descriptor) + override def skip[A](using dO: DescriptorOf[A]): Unit = skip( + dO.descriptor.toForeignTypeDescriptor + ) override def copy(): VarArgs = VarArgs19(vaList.copy().nn) - def as(td: TypeDescriptor): Object = + def as(td: ForeignTypeDescriptor): Object = td match case ByteDescriptor => Byte.box(vaList.nextVarg(ValueLayout.JAVA_INT).toByte) @@ -63,11 +64,7 @@ private class VarArgs19(vaList: VaList) extends VarArgs: ) .nn ) - case AliasDescriptor(real) => as(real) case cud: CUnionDescriptor => - val desc = - descriptorModule19.toMemoryLayout(cud).asInstanceOf[GroupLayout] - LinkageModule19.tempScope(alloc ?=> vaList .nextVarg( @@ -77,4 +74,5 @@ private class VarArgs19(vaList: VaList) extends VarArgs: .nn ) override def get[A](using d: DescriptorOf[A]): A = - transitionModule19.methodReturn[A](d.descriptor, as(d.descriptor)) + transitionModule19 + .methodReturn[A](d.descriptor, as(d.descriptor.toForeignTypeDescriptor)) diff --git a/j19/src/fr/hammons/slinc/modules/DescriptorModule19.scala b/j19/src/fr/hammons/slinc/modules/DescriptorModule19.scala index bc8250d0..63a03b26 100644 --- a/j19/src/fr/hammons/slinc/modules/DescriptorModule19.scala +++ b/j19/src/fr/hammons/slinc/modules/DescriptorModule19.scala @@ -13,7 +13,7 @@ given descriptorModule19: DescriptorModule with private val sdt = TrieMap.empty[StructDescriptor, GroupLayout] private val offsets = TrieMap.empty[List[TypeDescriptor], IArray[Bytes]] - def toMemoryLayout(td: TypeDescriptor): MemoryLayout = td match + def toMemoryLayout(td: ForeignTypeDescriptor): MemoryLayout = td match case ByteDescriptor => ValueLayout.JAVA_BYTE.nn case ShortDescriptor => ValueLayout.JAVA_SHORT.nn case IntDescriptor => ValueLayout.JAVA_INT.nn @@ -23,14 +23,22 @@ given descriptorModule19: DescriptorModule with case PtrDescriptor => ValueLayout.ADDRESS.nn case VaListDescriptor => ValueLayout.ADDRESS.nn case SetSizeArrayDescriptor(inner, num) => - MemoryLayout.sequenceLayout(num, toMemoryLayout(inner)).nn - case sd: StructDescriptor => toGroupLayout(sd) - case ad: AliasDescriptor[?] => toMemoryLayout(ad.real) + MemoryLayout + .sequenceLayout(num, toMemoryLayout(inner.toForeignTypeDescriptor)) + .nn + case sd: StructDescriptor => toGroupLayout(sd) case CUnionDescriptor(possibleTypes) => - MemoryLayout.unionLayout(possibleTypes.view.map(toMemoryLayout).toSeq*).nn + MemoryLayout + .unionLayout( + possibleTypes.view + .map(_.toForeignTypeDescriptor) + .map(toMemoryLayout) + .toSeq* + ) + .nn def toMemoryLayout(smd: StructMemberDescriptor): MemoryLayout = - toMemoryLayout(smd.descriptor).withName(smd.name).nn + toMemoryLayout(smd.descriptor.toForeignTypeDescriptor).withName(smd.name).nn def toGroupLayout(sd: StructDescriptor): GroupLayout = sdt.getOrElseUpdate( @@ -81,11 +89,11 @@ given descriptorModule19: DescriptorModule with ) def toDowncallLayout(td: TypeDescriptor): MemoryLayout = - toMemoryLayout(td) match + toMemoryLayout(td.toForeignTypeDescriptor) match case _: SequenceLayout => ValueLayout.ADDRESS.nn case o => o - def toCarrierType(td: TypeDescriptor): Class[?] = td match + override def toCarrierType(td: ForeignTypeDescriptor): Class[?] = td match case ByteDescriptor => classOf[Byte] case ShortDescriptor => classOf[Short] case IntDescriptor => classOf[Int] @@ -96,9 +104,8 @@ given descriptorModule19: DescriptorModule with classOf[MemoryAddress] case _: StructDescriptor | _: CUnionDescriptor => classOf[MemorySegment] - case ad: AliasDescriptor[?] => toCarrierType(ad.real) - override def memberOffsets(sd: List[TypeDescriptor]): IArray[Bytes] = + override def memberOffsets(sd: List[ForeignTypeDescriptor]): IArray[Bytes] = offsets.getOrElseUpdate( sd, { val ll = genLayoutList( @@ -125,10 +132,10 @@ given descriptorModule19: DescriptorModule with } ) - override def sizeOf(td: TypeDescriptor): Bytes = Bytes( + override def sizeOf(td: ForeignTypeDescriptor): Bytes = Bytes( toMemoryLayout(td).byteSize() ) - override def alignmentOf(td: TypeDescriptor): Bytes = Bytes( + override def alignmentOf(td: ForeignTypeDescriptor): Bytes = Bytes( toMemoryLayout(td).byteAlignment() ) diff --git a/j19/src/fr/hammons/slinc/modules/LinkageModule19.scala b/j19/src/fr/hammons/slinc/modules/LinkageModule19.scala index 507c3886..5a6eb099 100644 --- a/j19/src/fr/hammons/slinc/modules/LinkageModule19.scala +++ b/j19/src/fr/hammons/slinc/modules/LinkageModule19.scala @@ -50,6 +50,7 @@ object LinkageModule19 extends LinkageModule: .map(toDowncallLayout), varargs.view .map(_.use[DescriptorOf](dc ?=> _ => dc.descriptor)) + .map(_.toForeignTypeDescriptor) .map(toMemoryLayout) .toList ) diff --git a/j19/src/fr/hammons/slinc/modules/ReadWriteModule19.scala b/j19/src/fr/hammons/slinc/modules/ReadWriteModule19.scala index 916edb7e..fa803f22 100644 --- a/j19/src/fr/hammons/slinc/modules/ReadWriteModule19.scala +++ b/j19/src/fr/hammons/slinc/modules/ReadWriteModule19.scala @@ -11,16 +11,16 @@ private[slinc] given readWriteModule19: ReadWriteModule with override def unionWriter( td: TypeDescriptor ): Writer[CUnion[? <: NonEmptyTuple]] = - val size = descriptorModule19.sizeOf(td) + val size = descriptorModule19.sizeOf(td.toForeignTypeDescriptor) (mem, offset, value) => mem.offset(offset).resize(size).copyFrom(value.mem) override def unionReader( td: TypeDescriptor ): Reader[CUnion[? <: NonEmptyTuple]] = - val size = descriptorModule19.sizeOf(td) + val size = descriptorModule19.sizeOf(td.toForeignTypeDescriptor) (mem, offset) => Scope19.createInferredScope(alloc ?=> - val newMem = alloc.allocate(td, 1) + val newMem = alloc.allocate(td.toForeignTypeDescriptor, 1) newMem.copyFrom(mem.offset(offset).resize(size)) new CUnion(newMem) )