factor/library/compiler/alien/structs.factor

55 lines
1.7 KiB
Factor
Raw Normal View History

2005-04-09 18:30:46 -04:00
! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: alien
USING: assembler compiler errors generic
2006-05-15 01:01:47 -04:00
hashtables kernel kernel-internals math namespaces parser
2005-12-02 02:25:44 -05:00
sequences strings words ;
2005-04-09 18:30:46 -04:00
! Some code for interfacing with C structures.
2006-05-19 15:53:30 -04:00
: c-getter* ( name -- quot )
c-getter [
[ "Cannot read struct fields with type" throw ]
] unless* ;
2005-04-09 18:30:46 -04:00
: define-getter ( offset type name -- )
#! Define a word with stack effect ( alien -- obj ) in the
#! current 'in' vocabulary.
2006-05-19 15:53:30 -04:00
create-in >r c-getter* swap add* r> swap define-compound ;
: c-setter* ( name -- quot )
c-setter [
[ "Cannot write struct fields with type" throw ]
] unless* ;
2005-04-09 18:30:46 -04:00
: define-setter ( offset type name -- )
#! Define a word with stack effect ( obj alien -- ) in the
#! current 'in' vocabulary.
2006-05-19 15:53:30 -04:00
"set-" swap append create-in >r c-setter* swap add* r>
swap define-compound ;
2005-04-09 18:30:46 -04:00
: define-field ( offset type name -- offset )
>r dup >r c-align align r> r>
2005-05-18 16:26:22 -04:00
"struct-name" get swap "-" swap append3
2005-04-09 18:30:46 -04:00
3dup define-getter 3dup define-setter
drop c-size + ;
2005-04-09 18:30:46 -04:00
: define-member ( max type -- max )
c-size max ;
2005-04-09 18:30:46 -04:00
: define-struct-type ( width -- )
#! Define inline and pointer type for the struct. Pointer
#! type is exactly like void*.
2005-04-16 00:23:27 -04:00
[
"width" set
bootstrap-cell "align" set
2005-04-16 00:23:27 -04:00
[ swap <displaced-alien> ] "getter" set
2006-07-03 02:52:44 -04:00
"width" get [ nip %unbox-struct ] curry "unboxer" set
"width" get [ nip %box-struct ] curry "boxer" set
"struct" on
] "struct-name" get define-c-type
"struct-name" get in get init-c-type ;
: c-struct? ( type -- ? )
c-types get hash [ "struct" swap hash ] [ f ] if* ;