2009-03-22 18:47:48 -04:00
|
|
|
! Copyright (C) 2005, 2009 Slava Pestov.
|
2008-09-03 19:47:52 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: accessors arrays kernel kernel.private math namespaces
|
2008-09-10 21:07:00 -04:00
|
|
|
make sequences strings words effects combinators alien.c-types ;
|
2008-09-03 19:47:52 -04:00
|
|
|
IN: alien.structs.fields
|
|
|
|
|
|
|
|
TUPLE: field-spec name offset type reader writer ;
|
|
|
|
|
|
|
|
: reader-word ( class name vocab -- word )
|
2008-12-03 20:10:41 -05:00
|
|
|
[ "-" glue ] dip create ;
|
2008-09-03 19:47:52 -04:00
|
|
|
|
|
|
|
: writer-word ( class name vocab -- word )
|
2008-11-29 14:37:38 -05:00
|
|
|
[ [ swap "set-" % % "-" % % ] "" make ] dip create ;
|
2008-09-03 19:47:52 -04:00
|
|
|
|
|
|
|
: <field-spec> ( struct-name vocab type field-name -- spec )
|
|
|
|
field-spec new
|
|
|
|
0 >>offset
|
|
|
|
swap >>name
|
|
|
|
swap expand-constants >>type
|
|
|
|
3dup name>> swap reader-word >>reader
|
|
|
|
3dup name>> swap writer-word >>writer
|
|
|
|
2nip ;
|
|
|
|
|
|
|
|
: align-offset ( offset type -- offset )
|
|
|
|
c-type-align align ;
|
|
|
|
|
|
|
|
: struct-offsets ( specs -- size )
|
|
|
|
0 [
|
|
|
|
[ type>> align-offset ] keep
|
|
|
|
[ (>>offset) ] [ type>> heap-size + ] 2bi
|
|
|
|
] reduce ;
|
|
|
|
|
2008-12-15 20:44:56 -05:00
|
|
|
: define-struct-slot-word ( word quot spec effect -- )
|
|
|
|
[ offset>> prefix ] dip define-inline ;
|
2008-09-03 19:47:52 -04:00
|
|
|
|
2009-03-22 18:47:48 -04:00
|
|
|
: define-getter ( spec -- )
|
|
|
|
[ reader>> ] [ type>> c-type-getter-boxer ] [ ] tri
|
2008-12-15 20:44:56 -05:00
|
|
|
(( c-ptr -- value )) define-struct-slot-word ;
|
2008-09-03 19:47:52 -04:00
|
|
|
|
2009-03-22 18:47:48 -04:00
|
|
|
: define-setter ( spec -- )
|
2008-12-15 20:44:56 -05:00
|
|
|
[ writer>> ] [ type>> c-setter ] [ ] tri
|
|
|
|
(( value c-ptr -- )) define-struct-slot-word ;
|
2008-09-03 19:47:52 -04:00
|
|
|
|
2009-03-22 18:47:48 -04:00
|
|
|
: define-field ( spec -- )
|
|
|
|
[ define-getter ] [ define-setter ] bi ;
|