alien-invoke no longer generates calls to consing unbox_* functions -- instead we just unbox the parameter list first, in factor code

slava 2006-11-03 21:39:37 +00:00
parent e509dba687
commit 861a6d32cf
6 changed files with 51 additions and 32 deletions

View File

@ -1,9 +1,6 @@
+ allot refactoring: + allot refactoring:
- inline float allocation needs a gc check - inline float allocation needs a gc check
- fix alien invoke as required
- we can just convert strings to aliens beforehand
- >float first too
- docs: don't pass volatile aliens to callbacks - docs: don't pass volatile aliens to callbacks
+ ui: + ui:

View File

@ -28,16 +28,32 @@ M: alien-invoke-error summary
[ alien-invoke-dlsym dlsym drop ] [ alien-invoke-dlsym dlsym drop ]
[ inference-warning ] recover ; [ inference-warning ] recover ;
: (make-prep-quot) ( parameters -- )
dup empty? [
drop
] [
unclip c-type c-type-prep %
\ >r , (make-prep-quot) \ r> ,
] if ;
: make-prep-quot ( parameters -- quot )
[ <reversed> (make-prep-quot) ] [ ] make ;
: prep-alien-invoke ( node -- )
alien-invoke-parameters make-prep-quot infer-quot ;
\ alien-invoke [ string object string object ] [ ] <effect> \ alien-invoke [ string object string object ] [ ] <effect>
"infer-effect" set-word-prop "infer-effect" set-word-prop
\ alien-invoke [ \ alien-invoke [
empty-node <alien-invoke> dup node, empty-node <alien-invoke>
pop-literal nip over set-alien-invoke-parameters pop-literal nip over set-alien-invoke-parameters
pop-literal nip over set-alien-invoke-function pop-literal nip over set-alien-invoke-function
pop-literal nip over set-alien-invoke-library pop-literal nip over set-alien-invoke-library
pop-literal nip over set-alien-invoke-return pop-literal nip over set-alien-invoke-return
dup prep-alien-invoke
dup ensure-dlsym dup ensure-dlsym
dup node,
alien-invoke-stack alien-invoke-stack
] "infer" set-word-prop ] "infer" set-word-prop

View File

@ -7,7 +7,6 @@ bootstrap-cell
"unbox_alien" "unbox_alien"
"void*" define-primitive-type "void*" define-primitive-type
[ alien-signed-8 ] [ alien-signed-8 ]
[ set-alien-signed-8 ] [ set-alien-signed-8 ]
8 8
@ -15,7 +14,6 @@ bootstrap-cell
"unbox_signed_8" "unbox_signed_8"
"longlong" define-primitive-type "longlong" define-primitive-type
[ alien-unsigned-8 ] [ alien-unsigned-8 ]
[ set-alien-unsigned-8 ] [ set-alien-unsigned-8 ]
8 8
@ -23,7 +21,6 @@ bootstrap-cell
"unbox_unsigned_8" "unbox_unsigned_8"
"ulonglong" define-primitive-type "ulonglong" define-primitive-type
[ alien-signed-cell ] [ alien-signed-cell ]
[ set-alien-signed-cell ] [ set-alien-signed-cell ]
bootstrap-cell bootstrap-cell
@ -31,7 +28,6 @@ bootstrap-cell
"unbox_signed_cell" "unbox_signed_cell"
"long" define-primitive-type "long" define-primitive-type
[ alien-unsigned-cell ] [ alien-unsigned-cell ]
[ set-alien-unsigned-cell ] [ set-alien-unsigned-cell ]
bootstrap-cell bootstrap-cell
@ -39,7 +35,6 @@ bootstrap-cell
"unbox_unsigned_cell" "unbox_unsigned_cell"
"ulong" define-primitive-type "ulong" define-primitive-type
[ alien-signed-4 ] [ alien-signed-4 ]
[ set-alien-signed-4 ] [ set-alien-signed-4 ]
4 4
@ -47,7 +42,6 @@ bootstrap-cell
"unbox_signed_4" "unbox_signed_4"
"int" define-primitive-type "int" define-primitive-type
[ alien-unsigned-4 ] [ alien-unsigned-4 ]
[ set-alien-unsigned-4 ] [ set-alien-unsigned-4 ]
4 4
@ -55,7 +49,6 @@ bootstrap-cell
"unbox_unsigned_4" "unbox_unsigned_4"
"uint" define-primitive-type "uint" define-primitive-type
[ alien-signed-2 ] [ alien-signed-2 ]
[ set-alien-signed-2 ] [ set-alien-signed-2 ]
2 2
@ -63,7 +56,6 @@ bootstrap-cell
"unbox_signed_2" "unbox_signed_2"
"short" define-primitive-type "short" define-primitive-type
[ alien-unsigned-2 ] [ alien-unsigned-2 ]
[ set-alien-unsigned-2 ] [ set-alien-unsigned-2 ]
2 2
@ -71,7 +63,6 @@ bootstrap-cell
"unbox_unsigned_2" "unbox_unsigned_2"
"ushort" define-primitive-type "ushort" define-primitive-type
[ alien-signed-1 ] [ alien-signed-1 ]
[ set-alien-signed-1 ] [ set-alien-signed-1 ]
1 1
@ -79,7 +70,6 @@ bootstrap-cell
"unbox_signed_1" "unbox_signed_1"
"char" define-primitive-type "char" define-primitive-type
[ alien-unsigned-1 ] [ alien-unsigned-1 ]
[ set-alien-unsigned-1 ] [ set-alien-unsigned-1 ]
1 1
@ -87,23 +77,6 @@ bootstrap-cell
"unbox_unsigned_1" "unbox_unsigned_1"
"uchar" define-primitive-type "uchar" define-primitive-type
[ alien-unsigned-cell <alien> alien>char-string ]
[ >r >r alien-address r> r> set-alien-unsigned-cell ]
bootstrap-cell
"box_char_string"
"unbox_char_string"
"char*" define-primitive-type
[ alien-unsigned-cell <alien> alien>u16-string ]
[ >r >r alien-address r> r> set-alien-unsigned-cell ]
4
"box_u16_string"
"unbox_u16_string"
"ushort*" define-primitive-type
[ alien-unsigned-4 zero? not ] [ alien-unsigned-4 zero? not ]
[ 1 0 ? set-alien-unsigned-4 ] [ 1 0 ? set-alien-unsigned-4 ]
4 4
@ -111,7 +84,6 @@ bootstrap-cell
"unbox_boolean" "unbox_boolean"
"bool" define-primitive-type "bool" define-primitive-type
[ alien-float ] [ alien-float ]
[ set-alien-float ] [ set-alien-float ]
4 4
@ -120,6 +92,7 @@ bootstrap-cell
"float" define-primitive-type "float" define-primitive-type
T{ float-regs f 4 } "float" c-type set-c-type-reg-class T{ float-regs f 4 } "float" c-type set-c-type-reg-class
[ >float ] "float" c-type set-c-type-prep
[ alien-double ] [ alien-double ]
[ set-alien-double ] [ set-alien-double ]
@ -129,3 +102,22 @@ T{ float-regs f 4 } "float" c-type set-c-type-reg-class
"double" define-primitive-type "double" define-primitive-type
T{ float-regs f 8 } "double" c-type set-c-type-reg-class T{ float-regs f 8 } "double" c-type set-c-type-reg-class
[ >float ] "double" c-type set-c-type-prep
[ alien-unsigned-cell <alien> alien>char-string ]
[ >r >r alien-address r> r> set-alien-unsigned-cell ]
bootstrap-cell
"box_char_string"
"unbox_alien"
"char*" define-primitive-type
[ string>char-alien ] "char*" c-type set-c-type-prep
[ alien-unsigned-cell <alien> alien>u16-string ]
[ >r >r alien-address r> r> set-alien-unsigned-cell ]
4
"box_u16_string"
"unbox_alien"
"ushort*" define-primitive-type
[ string>u16-alien ] "ushort*" c-type set-c-type-prep

View File

@ -86,3 +86,8 @@ cpu "x86" = macosx? and [
[ 5 ] [ 5 ]
[ 2 3 "ffi_test_2" f dlsym indirect-test-2 ] [ 2 3 "ffi_test_2" f dlsym indirect-test-2 ]
unit-test unit-test
FUNCTION: char* ffi_test_15 char* x char* y ;
[ "foo" ] [ "xy" "zt" ffi_test_15 ] unit-test
[ "bar" ] [ "xy" "xy" ffi_test_15 ] unit-test

View File

@ -93,3 +93,11 @@ struct foo ffi_test_14(int x, int y)
r.x = x; r.y = y; r.x = x; r.y = y;
return r; return r;
} }
char *ffi_test_15(char *x, char *y)
{
if(strcmp(x,y))
return "foo";
else
return "bar";
}

View File

@ -15,3 +15,4 @@ struct rect { float x, y, w, h; };
DLLEXPORT int ffi_test_12(int a, int b, struct rect c, int d, int e, int f); DLLEXPORT int ffi_test_12(int a, int b, struct rect c, int d, int e, int f);
DLLEXPORT int ffi_test_13(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k); DLLEXPORT int ffi_test_13(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k);
DLLEXPORT struct foo ffi_test_14(int x, int y); DLLEXPORT struct foo ffi_test_14(int x, int y);
DLLEXPORT char *ffi_test_15(char *x, char *y);