diff --git a/basis/alien/marshall/marshall.factor b/basis/alien/marshall/marshall.factor index ef8ce56f60..e863108190 100644 --- a/basis/alien/marshall/marshall.factor +++ b/basis/alien/marshall/marshall.factor @@ -14,8 +14,8 @@ specialized-arrays.ulonglong specialized-arrays.ushort strings unix.utilities vocabs.parser words libc.private struct-arrays ; IN: alien.marshall -<< primitive-types [ "void*" = not ] filter -[ define-primitive-marshallers ] each >> +<< primitive-types [ [ "void*" = ] [ "bool" = ] bi or not ] +filter [ define-primitive-marshallers ] each >> TUPLE: alien-wrapper { underlying alien } ; TUPLE: struct-wrapper < alien-wrapper disposed ; @@ -56,6 +56,32 @@ M: struct-wrapper unmarshall-cast ; : marshall-char**-or-strings ( n/string -- alien ) [ (marshall-char**-or-strings) ] ptr-pass-through ; +: marshall-bool ( ? -- n ) + >boolean [ 1 ] [ 0 ] if ; + +: (marshall-bool*) ( ?/seq -- alien ) + [ marshall-bool malloc-byte-array ] + [ >bool-array malloc-underlying ] + marshall-x* ; + +: marshall-bool* ( ?/seq -- alien ) + [ (marshall-bool*) ] ptr-pass-through ; + +: (marshall-bool**) ( seq -- alien ) + [ marshall-bool* ] map >void*-array malloc-underlying ; + +: marshall-bool** ( seq -- alien ) + [ (marshall-bool**) ] ptr-pass-through ; + +: unmarshall-bool ( n -- ? ) + 0 = not ; + +: unmarshall-bool* ( alien -- ? ) + *bool unmarshall-bool ; + +: unmarshall-bool*-free ( alien -- ? ) + [ *bool unmarshall-bool ] keep add-malloc free ; + : primitive-marshaller ( type -- quot/f ) { { "bool" [ [ marshall-bool ] ] } @@ -138,9 +164,6 @@ M: struct-wrapper unmarshall-cast ; : unmarshall-char*-to-string-free ( alien -- string ) [ unmarshall-char*-to-string ] keep add-malloc free ; -: unmarshall-bool ( n -- ? ) - 0 = not ; - : primitive-unmarshaller ( type -- quot/f ) { { "bool" [ [ unmarshall-bool ] ] }