empty-node <alien-indirect>
pop-literal nip over set-alien-indirect-abi
pop-literal nip over set-alien-indirect-parameters
- pop-literal nip swap set-alien-indirect-return
- dup alien-indirect-parameters prep-alien-parameters
- dup node,
+ pop-literal nip over set-alien-indirect-return
+ dup alien-indirect-parameters
+ make-prep-quot 1 make-dip infer-quot
+ node,
] "infer" set-word-prop
: generate-indirect-cleanup ( node -- )
pop-literal nip over set-alien-invoke-function
pop-literal nip over set-alien-invoke-library
pop-literal nip over set-alien-invoke-return
- dup alien-invoke-parameters prep-alien-parameters
+ dup alien-invoke-parameters make-prep-quot infer-quot
dup ensure-dlsym
dup node,
alien-invoke-stack
: if-void ( type true false -- )
pick "void" = [ drop nip call ] [ nip call ] if ; inline
-: make-prep-quot ( parameters -- )
+: (make-prep-quot) ( parameters -- )
dup empty? [
drop
] [
unclip c-type c-type-prep %
- \ >r , make-prep-quot \ r> ,
+ \ >r , (make-prep-quot) \ r> ,
] if ;
-: prep-alien-parameters ( parameters -- quot )
- [ <reversed> make-prep-quot ] [ ] make infer-quot ;
+: make-prep-quot ( parameters -- quot )
+ [ <reversed> (make-prep-quot) ] [ ] make ;
fp-scratch swap %move-int>int
fp-scratch %move-int>float ;
-: load-zone-ptr ( vreg -- )
+: load-zone-ptr ( reg -- )
#! Load pointer to start of zone array
- dup "generations" f [ dlsym MOV ] 2keep
- rel-absolute-cell rel-dlsym
+ 0 MOV
+ dup "generations" f rel-absolute-cell rel-dlsym
dup [] MOV ;
: load-allot-ptr ( vreg -- )
! User environment
: %userenv ( -- )
- "x" operand "userenv" f [ dlsym MOV ] 2keep
- rel-absolute-cell rel-dlsym
+ "x" operand 0 MOV
+ "userenv" f rel-absolute-cell rel-dlsym
"n" operand fixnum>slot@
"n" operand "x" operand ADD ;