2005-01-23 16:47:28 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
2005-01-30 15:57:25 -05:00
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2004-09-25 16:18:11 -04:00
|
|
|
IN: alien
|
2005-01-30 15:57:25 -05:00
|
|
|
USING: assembler compiler errors generic inference interpreter
|
|
|
|
kernel lists math namespaces parser words hashtables strings
|
|
|
|
unparser ;
|
2004-12-25 15:52:08 -05:00
|
|
|
|
|
|
|
! Command line parameters specify libraries to load.
|
|
|
|
!
|
2005-02-10 17:32:39 -05:00
|
|
|
! -libraries:<foo>:name=<soname> -- define a library <foo>, to be
|
2004-12-25 15:52:08 -05:00
|
|
|
! loaded from the <soname> DLL.
|
|
|
|
!
|
2005-02-10 17:32:39 -05:00
|
|
|
! -libraries:<foo>:abi=stdcall -- define a library using the
|
2004-12-25 15:52:08 -05:00
|
|
|
! stdcall ABI. This ABI is usually used on Win32. Any other abi
|
|
|
|
! parameter, or a missing abi parameter indicates the cdecl ABI
|
|
|
|
! should be used, which is common on Unix.
|
2004-09-25 16:18:11 -04:00
|
|
|
|
2005-03-06 20:03:22 -05:00
|
|
|
: null? ( alien -- ? ) dup [ alien-address 0 = ] when ;
|
|
|
|
|
2004-12-23 01:14:07 -05:00
|
|
|
M: alien hashcode ( obj -- n )
|
2004-12-31 02:17:45 -05:00
|
|
|
alien-address >fixnum ;
|
2004-12-23 01:14:07 -05:00
|
|
|
|
|
|
|
M: alien = ( obj obj -- ? )
|
|
|
|
over alien? [
|
|
|
|
over local-alien? over local-alien? or [
|
|
|
|
eq?
|
|
|
|
] [
|
|
|
|
alien-address swap alien-address =
|
|
|
|
] ifte
|
|
|
|
] [
|
|
|
|
2drop f
|
|
|
|
] ifte ;
|
|
|
|
|
2005-01-23 16:47:28 -05:00
|
|
|
M: alien unparse ( obj -- str )
|
|
|
|
[
|
|
|
|
"#<" ,
|
|
|
|
dup local-alien? "local-alien" "alien" ? ,
|
|
|
|
" @ " ,
|
|
|
|
alien-address unparse ,
|
|
|
|
">" ,
|
|
|
|
] make-string ;
|
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
: library ( name -- object )
|
|
|
|
dup [ "libraries" get hash ] when ;
|
2004-09-25 16:18:11 -04:00
|
|
|
|
2004-12-25 18:08:20 -05:00
|
|
|
: load-dll ( name -- dll )
|
|
|
|
#! Higher level wrapper around dlopen primitive.
|
|
|
|
library dup [
|
|
|
|
[
|
|
|
|
"dll" get dup [
|
|
|
|
drop "name" get dlopen dup "dll" set
|
|
|
|
] unless
|
|
|
|
] bind
|
|
|
|
] when ;
|
|
|
|
|
2004-12-23 06:51:42 -05:00
|
|
|
: add-library ( library name abi -- )
|
|
|
|
"libraries" get [
|
|
|
|
<namespace> [
|
|
|
|
"abi" set
|
|
|
|
"name" set
|
|
|
|
] extend put
|
|
|
|
] bind ;
|
|
|
|
|
2004-12-13 19:14:03 -05:00
|
|
|
SYMBOL: #cleanup ( unwind stack by parameter )
|
|
|
|
|
|
|
|
SYMBOL: #c-call ( jump to raw address )
|
|
|
|
|
|
|
|
SYMBOL: #unbox ( move top of datastack to C stack )
|
|
|
|
SYMBOL: #box ( move EAX to datastack )
|
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
: library-abi ( library -- abi )
|
|
|
|
library [ [ "abi" get ] bind ] [ "cdecl" ] ifte* ;
|
2004-12-13 19:14:03 -05:00
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
SYMBOL: #alien-invoke
|
2004-12-18 00:38:51 -05:00
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
! These are set in the #alien-invoke dataflow IR node.
|
2004-12-13 19:14:03 -05:00
|
|
|
SYMBOL: alien-returns
|
|
|
|
SYMBOL: alien-parameters
|
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
: set-alien-returns ( returns node -- )
|
|
|
|
[ dup alien-returns set ] bind
|
|
|
|
"void" = [
|
|
|
|
[ object ] produce-d 1 0 node-outputs
|
|
|
|
] unless ;
|
|
|
|
|
|
|
|
: set-alien-parameters ( parameters node -- )
|
|
|
|
[ dup alien-parameters set ] bind
|
|
|
|
[ drop object ] map dup dup ensure-d
|
|
|
|
length 0 node-inputs consume-d ;
|
|
|
|
|
|
|
|
: alien-node ( returns params function library -- )
|
|
|
|
cons #alien-invoke dataflow,
|
|
|
|
[ set-alien-parameters ] keep
|
|
|
|
set-alien-returns ;
|
|
|
|
|
2004-12-18 00:38:51 -05:00
|
|
|
: infer-alien ( -- )
|
2004-12-23 01:14:07 -05:00
|
|
|
[ object object object object ] ensure-d
|
2005-01-31 14:02:09 -05:00
|
|
|
dataflow-drop, pop-d literal-value
|
|
|
|
dataflow-drop, pop-d literal-value >r
|
|
|
|
dataflow-drop, pop-d literal-value
|
|
|
|
dataflow-drop, pop-d literal-value -rot
|
2004-12-25 15:52:08 -05:00
|
|
|
r> swap alien-node ;
|
2004-12-13 19:14:03 -05:00
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
: box-parameter
|
|
|
|
c-type [
|
|
|
|
"width" get cell align
|
|
|
|
"unboxer" get
|
|
|
|
] bind #unbox swons , ;
|
2004-12-13 19:14:03 -05:00
|
|
|
|
|
|
|
: linearize-parameters ( params -- count )
|
|
|
|
#! Generate code for boxing a list of C types.
|
|
|
|
#! Return amount stack must be unwound by.
|
2004-12-16 19:57:03 -05:00
|
|
|
[ alien-parameters get reverse ] bind 0 swap [
|
2004-12-25 15:52:08 -05:00
|
|
|
box-parameter +
|
2004-12-13 19:14:03 -05:00
|
|
|
] each ;
|
|
|
|
|
|
|
|
: linearize-returns ( returns -- )
|
|
|
|
[ alien-returns get ] bind dup "void" = [
|
|
|
|
drop
|
|
|
|
] [
|
2004-12-25 15:52:08 -05:00
|
|
|
c-type [ "boxer" get ] bind #box swons ,
|
2004-12-13 19:14:03 -05:00
|
|
|
] ifte ;
|
|
|
|
|
|
|
|
: linearize-alien ( node -- )
|
|
|
|
dup linearize-parameters >r
|
|
|
|
dup [ node-param get ] bind #c-call swons ,
|
2004-12-25 22:15:37 -05:00
|
|
|
dup [ node-param get cdr library-abi "stdcall" = ] bind
|
2004-12-25 15:52:08 -05:00
|
|
|
r> swap [ drop ] [ #cleanup swons , ] ifte
|
2004-12-13 19:14:03 -05:00
|
|
|
linearize-returns ;
|
|
|
|
|
2005-03-05 14:45:23 -05:00
|
|
|
#alien-invoke [ linearize-alien ] "linearizer" set-word-prop
|
2004-12-13 19:14:03 -05:00
|
|
|
|
2004-12-17 23:02:19 -05:00
|
|
|
: alien-invoke ( ... returns library function parameters -- ... )
|
2004-12-18 00:38:51 -05:00
|
|
|
#! Call a C library function.
|
|
|
|
#! 'returns' is a type spec, and 'parameters' is a list of
|
|
|
|
#! type specs. 'library' is an entry in the "libraries"
|
|
|
|
#! namespace.
|
2004-12-25 15:52:08 -05:00
|
|
|
[
|
|
|
|
"alien-invoke cannot be interpreted. " ,
|
|
|
|
"Either the compiler is disabled, " ,
|
|
|
|
"or the ``" , rot , "'' library is missing. " ,
|
|
|
|
] make-string throw ;
|
2004-12-17 23:02:19 -05:00
|
|
|
|
2004-12-24 17:29:16 -05:00
|
|
|
\ alien-invoke [ [ object object object object ] [ ] ]
|
2005-03-05 14:45:23 -05:00
|
|
|
"infer-effect" set-word-prop
|
2004-12-17 23:02:19 -05:00
|
|
|
|
2005-03-05 14:45:23 -05:00
|
|
|
\ alien-invoke [ infer-alien ] "infer" set-word-prop
|
2004-12-17 23:02:19 -05:00
|
|
|
|
2004-12-13 19:14:03 -05:00
|
|
|
global [
|
|
|
|
"libraries" get [ <namespace> "libraries" set ] unless
|
|
|
|
] bind
|