Generic slots for the win
parent
78bd877339
commit
3164c857c7
|
@ -77,7 +77,7 @@ ERROR: alien-indirect-error ;
|
||||||
: alien-indirect ( ... funcptr return parameters abi -- )
|
: alien-indirect ( ... funcptr return parameters abi -- )
|
||||||
alien-indirect-error ;
|
alien-indirect-error ;
|
||||||
|
|
||||||
TUPLE: alien-invoke library function return parameters ;
|
TUPLE: alien-invoke library function return parameters abi ;
|
||||||
|
|
||||||
ERROR: alien-invoke-error library symbol ;
|
ERROR: alien-invoke-error library symbol ;
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,9 @@ inference.state inference.backend inference.dataflow system
|
||||||
math.parser classes alien.arrays alien.c-types alien.structs
|
math.parser classes alien.arrays alien.c-types alien.structs
|
||||||
alien.syntax cpu.architecture alien inspector quotations assocs
|
alien.syntax cpu.architecture alien inspector quotations assocs
|
||||||
kernel.private threads continuations.private libc combinators
|
kernel.private threads continuations.private libc combinators
|
||||||
compiler.errors continuations layouts ;
|
compiler.errors continuations layouts accessors ;
|
||||||
IN: alien.compiler
|
IN: alien.compiler
|
||||||
|
|
||||||
! Common protocol for alien-invoke/alien-callback/alien-indirect
|
|
||||||
GENERIC: alien-node-parameters ( node -- seq )
|
|
||||||
GENERIC: alien-node-return ( node -- ctype )
|
|
||||||
GENERIC: alien-node-abi ( node -- str )
|
|
||||||
|
|
||||||
: large-struct? ( ctype -- ? )
|
: large-struct? ( ctype -- ? )
|
||||||
dup c-struct? [
|
dup c-struct? [
|
||||||
heap-size struct-small-enough? not
|
heap-size struct-small-enough? not
|
||||||
|
@ -22,11 +17,11 @@ GENERIC: alien-node-abi ( node -- str )
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: alien-node-parameters* ( node -- seq )
|
: alien-node-parameters* ( node -- seq )
|
||||||
dup alien-node-parameters
|
dup parameters>>
|
||||||
swap alien-node-return large-struct? [ "void*" add* ] when ;
|
swap return>> large-struct? [ "void*" add* ] when ;
|
||||||
|
|
||||||
: alien-node-return* ( node -- ctype )
|
: alien-node-return* ( node -- ctype )
|
||||||
alien-node-return dup large-struct? [ drop "void" ] when ;
|
return>> dup large-struct? [ drop "void" ] when ;
|
||||||
|
|
||||||
: c-type-stack-align ( type -- align )
|
: c-type-stack-align ( type -- align )
|
||||||
dup c-type-stack-align? [ c-type-align ] [ drop cell ] if ;
|
dup c-type-stack-align? [ c-type-align ] [ drop cell ] if ;
|
||||||
|
@ -51,7 +46,7 @@ GENERIC: alien-node-abi ( node -- str )
|
||||||
|
|
||||||
: alien-invoke-frame ( node -- n )
|
: alien-invoke-frame ( node -- n )
|
||||||
#! One cell is temporary storage, temp@
|
#! One cell is temporary storage, temp@
|
||||||
dup alien-node-return return-size
|
dup return>> return-size
|
||||||
swap alien-stack-frame +
|
swap alien-stack-frame +
|
||||||
cell + ;
|
cell + ;
|
||||||
|
|
||||||
|
@ -147,9 +142,9 @@ M: long-long-type flatten-value-type ( type -- )
|
||||||
pick "void" = [ drop nip call ] [ nip call ] if ; inline
|
pick "void" = [ drop nip call ] [ nip call ] if ; inline
|
||||||
|
|
||||||
: alien-invoke-stack ( node extra -- )
|
: alien-invoke-stack ( node extra -- )
|
||||||
over alien-node-parameters length + dup reify-curries
|
over parameters>> length + dup reify-curries
|
||||||
over consume-values
|
over consume-values
|
||||||
dup alien-node-return "void" = 0 1 ?
|
dup return>> "void" = 0 1 ?
|
||||||
swap produce-values ;
|
swap produce-values ;
|
||||||
|
|
||||||
: (make-prep-quot) ( parameters -- )
|
: (make-prep-quot) ( parameters -- )
|
||||||
|
@ -161,11 +156,11 @@ M: long-long-type flatten-value-type ( type -- )
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: make-prep-quot ( node -- quot )
|
: make-prep-quot ( node -- quot )
|
||||||
alien-node-parameters
|
parameters>>
|
||||||
[ <reversed> (make-prep-quot) ] [ ] make ;
|
[ <reversed> (make-prep-quot) ] [ ] make ;
|
||||||
|
|
||||||
: unbox-parameters ( offset node -- )
|
: unbox-parameters ( offset node -- )
|
||||||
alien-node-parameters [
|
parameters>> [
|
||||||
%prepare-unbox >r over + r> unbox-parameter
|
%prepare-unbox >r over + r> unbox-parameter
|
||||||
] reverse-each-parameter drop ;
|
] reverse-each-parameter drop ;
|
||||||
|
|
||||||
|
@ -174,7 +169,7 @@ M: long-long-type flatten-value-type ( type -- )
|
||||||
#! parameters. If the C function is returning a structure,
|
#! parameters. If the C function is returning a structure,
|
||||||
#! the first parameter is an implicit target area pointer,
|
#! the first parameter is an implicit target area pointer,
|
||||||
#! so we need to use a different offset.
|
#! so we need to use a different offset.
|
||||||
alien-node-return dup large-struct?
|
return>> dup large-struct?
|
||||||
[ heap-size %prepare-box-struct cell ] [ drop 0 ] if ;
|
[ heap-size %prepare-box-struct cell ] [ drop 0 ] if ;
|
||||||
|
|
||||||
: objects>registers ( node -- )
|
: objects>registers ( node -- )
|
||||||
|
@ -188,14 +183,7 @@ M: long-long-type flatten-value-type ( type -- )
|
||||||
] with-param-regs ;
|
] with-param-regs ;
|
||||||
|
|
||||||
: box-return* ( node -- )
|
: box-return* ( node -- )
|
||||||
alien-node-return [ ] [ box-return ] if-void ;
|
return>> [ ] [ box-return ] if-void ;
|
||||||
|
|
||||||
M: alien-invoke alien-node-parameters alien-invoke-parameters ;
|
|
||||||
M: alien-invoke alien-node-return alien-invoke-return ;
|
|
||||||
|
|
||||||
M: alien-invoke alien-node-abi
|
|
||||||
alien-invoke-library library
|
|
||||||
[ library-abi ] [ "cdecl" ] if* ;
|
|
||||||
|
|
||||||
M: alien-invoke-error summary
|
M: alien-invoke-error summary
|
||||||
drop
|
drop
|
||||||
|
@ -205,7 +193,7 @@ M: alien-invoke-error summary
|
||||||
|
|
||||||
: stdcall-mangle ( symbol node -- symbol )
|
: stdcall-mangle ( symbol node -- symbol )
|
||||||
"@"
|
"@"
|
||||||
swap alien-node-parameters parameter-sizes drop
|
swap parameters>> parameter-sizes drop
|
||||||
number>string 3append ;
|
number>string 3append ;
|
||||||
|
|
||||||
TUPLE: no-such-library name ;
|
TUPLE: no-such-library name ;
|
||||||
|
@ -256,6 +244,10 @@ M: no-such-symbol compiler-error-type
|
||||||
pop-literal nip over set-alien-invoke-return
|
pop-literal nip over set-alien-invoke-return
|
||||||
! Quotation which coerces parameters to required types
|
! Quotation which coerces parameters to required types
|
||||||
dup make-prep-quot recursive-state get infer-quot
|
dup make-prep-quot recursive-state get infer-quot
|
||||||
|
! Set ABI
|
||||||
|
dup alien-invoke-library
|
||||||
|
library [ library-abi ] [ "cdecl" ] if*
|
||||||
|
over set-alien-invoke-abi
|
||||||
! Add node to IR
|
! Add node to IR
|
||||||
dup node,
|
dup node,
|
||||||
! Magic #: consume exactly the number of inputs
|
! Magic #: consume exactly the number of inputs
|
||||||
|
@ -274,10 +266,6 @@ M: alien-invoke generate-node
|
||||||
iterate-next
|
iterate-next
|
||||||
] with-stack-frame ;
|
] with-stack-frame ;
|
||||||
|
|
||||||
M: alien-indirect alien-node-parameters alien-indirect-parameters ;
|
|
||||||
M: alien-indirect alien-node-return alien-indirect-return ;
|
|
||||||
M: alien-indirect alien-node-abi alien-indirect-abi ;
|
|
||||||
|
|
||||||
M: alien-indirect-error summary
|
M: alien-indirect-error summary
|
||||||
drop "Words calling ``alien-indirect'' must be compiled with the optimizing compiler." ;
|
drop "Words calling ``alien-indirect'' must be compiled with the optimizing compiler." ;
|
||||||
|
|
||||||
|
@ -323,10 +311,6 @@ callbacks global [ H{ } assoc-like ] change-at
|
||||||
|
|
||||||
: register-callback ( word -- ) dup callbacks get set-at ;
|
: register-callback ( word -- ) dup callbacks get set-at ;
|
||||||
|
|
||||||
M: alien-callback alien-node-parameters alien-callback-parameters ;
|
|
||||||
M: alien-callback alien-node-return alien-callback-return ;
|
|
||||||
M: alien-callback alien-node-abi alien-callback-abi ;
|
|
||||||
|
|
||||||
M: alien-callback-error summary
|
M: alien-callback-error summary
|
||||||
drop "Words calling ``alien-callback'' must be compiled with the optimizing compiler." ;
|
drop "Words calling ``alien-callback'' must be compiled with the optimizing compiler." ;
|
||||||
|
|
||||||
|
@ -373,7 +357,7 @@ TUPLE: callback-context ;
|
||||||
wait-to-return ; inline
|
wait-to-return ; inline
|
||||||
|
|
||||||
: prepare-callback-return ( ctype -- quot )
|
: prepare-callback-return ( ctype -- quot )
|
||||||
alien-node-return {
|
return>> {
|
||||||
{ [ dup "void" = ] [ drop [ ] ] }
|
{ [ dup "void" = ] [ drop [ ] ] }
|
||||||
{ [ dup large-struct? ] [ heap-size [ memcpy ] curry ] }
|
{ [ dup large-struct? ] [ heap-size [ memcpy ] curry ] }
|
||||||
{ [ t ] [ c-type c-type-prep ] }
|
{ [ t ] [ c-type c-type-prep ] }
|
||||||
|
@ -390,8 +374,8 @@ TUPLE: callback-context ;
|
||||||
|
|
||||||
: callback-unwind ( node -- n )
|
: callback-unwind ( node -- n )
|
||||||
{
|
{
|
||||||
{ [ dup alien-node-abi "stdcall" = ] [ alien-stack-frame ] }
|
{ [ dup abi>> "stdcall" = ] [ alien-stack-frame ] }
|
||||||
{ [ dup alien-node-return large-struct? ] [ drop 4 ] }
|
{ [ dup return>> large-struct? ] [ drop 4 ] }
|
||||||
{ [ t ] [ drop 0 ] }
|
{ [ t ] [ drop 0 ] }
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ cpu.x86.architecture cpu.x86.intrinsics cpu.x86.allot
|
||||||
cpu.architecture kernel kernel.private math namespaces sequences
|
cpu.architecture kernel kernel.private math namespaces sequences
|
||||||
generator.registers generator.fixup generator system layouts
|
generator.registers generator.fixup generator system layouts
|
||||||
alien.compiler combinators command-line
|
alien.compiler combinators command-line
|
||||||
compiler compiler.units io vocabs.loader ;
|
compiler compiler.units io vocabs.loader accessors ;
|
||||||
IN: cpu.x86.32
|
IN: cpu.x86.32
|
||||||
|
|
||||||
PREDICATE: x86-backend x86-32-backend
|
PREDICATE: x86-backend x86-32-backend
|
||||||
|
@ -244,10 +244,10 @@ M: x86-32-backend %cleanup ( alien-node -- )
|
||||||
#! have to fix ESP.
|
#! have to fix ESP.
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
[ dup alien-node-abi "stdcall" = ]
|
[ dup abi>> "stdcall" = ]
|
||||||
[ alien-stack-frame ESP swap SUB ]
|
[ alien-stack-frame ESP swap SUB ]
|
||||||
} {
|
} {
|
||||||
[ dup alien-node-return large-struct? ]
|
[ dup return>> large-struct? ]
|
||||||
[ drop EAX PUSH ]
|
[ drop EAX PUSH ]
|
||||||
} {
|
} {
|
||||||
[ t ] [ drop ]
|
[ t ] [ drop ]
|
||||||
|
|
Loading…
Reference in New Issue