^^box-displaced-alien ds-push
] [ emit-primitive ] if ;
-: prepare-alien-accessor ( infos -- offset-vreg )
- <reversed> second class>>
- [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add ;
-
:: inline-alien ( node quot test -- )
[let | infos [ node node-input-infos ] |
infos test call
[ second class>> fixnum class<= ]
bi and ;
+: prepare-alien-accessor ( info -- offset-vreg )
+ class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add ;
+
+: prepare-alien-getter ( infos -- offset-vreg )
+ first prepare-alien-accessor ;
+
: inline-alien-getter ( node quot -- )
- '[ prepare-alien-accessor @ ds-push ]
+ '[ prepare-alien-getter @ ds-push ]
[ inline-alien-getter? ] inline-alien ; inline
: inline-alien-setter? ( infos class -- ? )
[ third class>> fixnum class<= ]
tri and and ;
+: prepare-alien-setter ( infos -- offset-vreg )
+ second prepare-alien-accessor ;
+
: inline-alien-integer-setter ( node quot -- )
- '[ prepare-alien-accessor ds-pop ^^untag-fixnum @ ]
+ '[ prepare-alien-setter ds-pop ^^untag-fixnum @ ]
[ fixnum inline-alien-setter? ]
inline-alien ; inline
: inline-alien-cell-setter ( node quot -- )
- '[ [ prepare-alien-accessor ds-pop ] [ first class>> ] bi ^^unbox-c-ptr @ ]
+ '[ [ prepare-alien-setter ds-pop ] [ first class>> ] bi ^^unbox-c-ptr @ ]
[ pinned-c-ptr inline-alien-setter? ]
inline-alien ; inline
: inline-alien-float-setter ( node quot -- )
- '[ prepare-alien-accessor ds-pop @ ]
+ '[ prepare-alien-setter ds-pop @ ]
[ float inline-alien-setter? ]
inline-alien ; inline
ds-push
] emit-vector-op ;
-: inline-alien-vector-setter ( node quot -- )
- '[ ds-drop prepare-alien-accessor ds-pop @ ]
- [ byte-array inline-alien-setter? ]
- inline-alien ; inline
-
: emit-alien-vector ( node -- )
dup [
'[
- ds-drop prepare-alien-accessor
+ ds-drop prepare-alien-getter
_ ^^alien-vector ds-push
]
[ inline-alien-getter? ] inline-alien
: emit-set-alien-vector ( node -- )
dup [
'[
+ ds-drop prepare-alien-setter ds-pop
_ ##set-alien-vector
- ] inline-alien-vector-setter
+ ]
+ [ byte-array inline-alien-setter? ]
+ inline-alien
] with emit-vector-op ;