]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' into abi-symbols
authorJoe Groff <arcata@gmail.com>
Thu, 1 Apr 2010 22:28:36 +0000 (15:28 -0700)
committerJoe Groff <arcata@gmail.com>
Thu, 1 Apr 2010 22:28:36 +0000 (15:28 -0700)
80 files changed:
basis/alien/fortran/fortran.factor
basis/alien/libraries/libraries-docs.factor
basis/alien/libraries/libraries.factor
basis/alien/remote-control/remote-control.factor
basis/cairo/ffi/ffi.factor
basis/cocoa/subclassing/subclassing.factor
basis/compiler/cfg/builder/builder-tests.factor
basis/compiler/codegen/codegen.factor
basis/compiler/tests/alien.factor
basis/compiler/tests/redefine24.factor
basis/compression/zlib/ffi/ffi.factor
basis/core-foundation/run-loop/run-loop.factor
basis/cpu/architecture/architecture.factor
basis/cpu/ppc/linux/linux.factor
basis/cpu/ppc/macosx/macosx.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/32/32-tests.factor
basis/cpu/x86/32/32.factor
basis/cpu/x86/64/64-tests.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/64/unix/unix.factor
basis/cpu/x86/64/winnt/winnt.factor
basis/cpu/x86/features/features.factor
basis/db/postgresql/ffi/ffi.factor
basis/db/sqlite/ffi/ffi.factor
basis/glib/glib.factor
basis/io/backend/unix/multiplexers/run-loop/run-loop.factor
basis/io/sockets/secure/openssl/openssl.factor
basis/io/sockets/windows/nt/nt.factor
basis/math/floats/env/x86/32/32.factor
basis/math/floats/env/x86/64/64.factor
basis/opengl/gl/macosx/macosx.factor
basis/opengl/gl/unix/unix.factor
basis/opengl/gl/windows/windows.factor
basis/openssl/libcrypto/libcrypto.factor
basis/openssl/libssl/libssl.factor
basis/pango/cairo/cairo.factor
basis/pango/pango.factor
basis/tools/deploy/test/9/9.factor
basis/tools/disassembler/udis/udis.factor
basis/tools/profiler/profiler-tests.factor
basis/ui/backend/windows/windows.factor
basis/unix/ffi/ffi.factor
basis/windows/ce/ce.factor
basis/windows/com/syntax/syntax.factor
basis/windows/com/wrapper/wrapper.factor
basis/windows/ddk/hid/hid.factor
basis/windows/ddk/setupapi/setupapi.factor
basis/windows/ddk/winusb/winusb.factor
basis/windows/dwmapi/dwmapi.factor
basis/windows/nt/nt.factor
core/alien/alien.factor
extra/benchmark/fib6/fib6.factor
extra/chipmunk/ffi/ffi.factor
extra/curses/ffi/ffi.factor
extra/cursors/cursors-tests.factor
extra/freetype/freetype.factor
extra/libusb/libusb.factor
extra/llvm/core/core.factor
extra/llvm/invoker/invoker.factor
extra/ogg/ogg.factor
extra/ogg/theora/theora.factor
extra/ogg/vorbis/vorbis.factor
extra/openal/alut/alut.factor
extra/openal/openal.factor
extra/opencl/ffi/ffi.factor
extra/opengl/glu/glu.factor
extra/tokyo/alien/tcrdb/tcrdb.factor
extra/tokyo/alien/tcutil/tcutil.factor
unmaintained/alien/inline/inline.factor
unmaintained/cryptlib/libcl/libcl.factor
unmaintained/db/mysql/ffi/ffi.factor
unmaintained/jni/jni-internals.factor
unmaintained/ldap/libldap/libldap.factor
unmaintained/lint/lint.factor
unmaintained/odbc/odbc.factor
unmaintained/oracle/liboci/liboci.factor
unmaintained/pdf/libhpdf/libhpdf.factor
vm/ffi_test.c
vm/ffi_test.h

index 9255c66c9f11afc38d358a23d8d56fc36de1a6bb..8c74aa102a8028753d63ef7cbfff5c938e7c3a23 100644 (file)
@@ -13,8 +13,8 @@ SINGLETONS: f2c-abi g95-abi gfortran-abi intel-unix-abi intel-windows-abi ;
 
 << 
 : add-f2c-libraries ( -- )
-    "I77" "libI77.so" "cdecl" add-library
-    "F77" "libF77.so" "cdecl" add-library ;
+    "I77" "libI77.so" cdecl add-library
+    "F77" "libF77.so" cdecl add-library ;
 
 os netbsd? [ add-f2c-libraries ] when
 >>
@@ -42,11 +42,11 @@ library-fortran-abis [ H{ } clone ] initialize
     [ "__" append ] [ "_" append ] if ;
 
 HOOK: fortran-c-abi fortran-abi ( -- abi )
-M: f2c-abi fortran-c-abi "cdecl" ;
-M: g95-abi fortran-c-abi "cdecl" ;
-M: gfortran-abi fortran-c-abi "cdecl" ;
-M: intel-unix-abi fortran-c-abi "cdecl" ;
-M: intel-windows-abi fortran-c-abi "cdecl" ;
+M: f2c-abi fortran-c-abi cdecl ;
+M: g95-abi fortran-c-abi cdecl ;
+M: gfortran-abi fortran-c-abi cdecl ;
+M: intel-unix-abi fortran-c-abi cdecl ;
+M: intel-windows-abi fortran-c-abi cdecl ;
 
 HOOK: real-functions-return-double? fortran-abi ( -- ? )
 M: f2c-abi real-functions-return-double? t ;
index 59142733b93df8fd76f9250a5036328f9036f7b9..d2e510e0e9af9be91b511e2f637d1685fe6241af 100644 (file)
@@ -6,7 +6,7 @@ IN: alien.libraries
 
 HELP: <library>
 { $values
-     { "path" "a pathname string" } { "abi" "the ABI used by the library, either " { $snippet "cdecl" } " or " { $snippet "stdcall" } }
+     { "path" "a pathname string" } { "abi" "the ABI used by the library, either " { $link cdecl } " or " { $link stdcall } }
      { "library" library } }
 { $description "Opens a C library using the path and ABI parameters and outputs a library tuple." }
 { $notes "User code should use " { $link add-library } " so that the opened library is added to a global hashtable, " { $link libraries } "." } ;
@@ -19,7 +19,7 @@ HELP: library
 { $description "Looks up a library by its logical name. The library object is a hashtable with the following keys:"
     { $list
         { { $snippet "name" } " - the full path of the C library binary" }
-        { { $snippet "abi" } " - the ABI used by the library, either " { $snippet "cdecl" } " or " { $snippet "stdcall" } }
+        { { $snippet "abi" } " - the ABI used by the library, either " { $link cdecl } " or " { $link stdcall } }
         { { $snippet "dll" } " - an instance of the " { $link dll } " class; only set if the library is loaded" }
     }
 } ;
index 47e34fe5fffa495699b6487b5393eece7a23d6a6..5a042fd436d9dee831f923904a9b5e031daad896 100644 (file)
@@ -36,7 +36,7 @@ M: library dispose dll>> [ dispose ] when* ;
     [ <library> swap libraries get set-at ] 3bi ;
 
 : library-abi ( library -- abi )
-    library [ abi>> ] [ "cdecl" ] if* ;
+    library [ abi>> ] [ cdecl ] if* ;
 
 SYMBOL: deploy-libraries
 
index c305d720f000081563af648f556ff4e7f2970bfc..50902809453660cee76c5461e596544d1725390f 100644 (file)
@@ -6,14 +6,14 @@ eval ;
 IN: alien.remote-control
 
 : eval-callback ( -- callback )
-    void* { c-string } "cdecl"
+    void* { c-string } cdecl
     [ eval>string utf8 malloc-string ] alien-callback ;
 
 : yield-callback ( -- callback )
-    void { } "cdecl" [ yield ] alien-callback ;
+    void { } cdecl [ yield ] alien-callback ;
 
 : sleep-callback ( -- callback )
-    void { long } "cdecl" [ sleep ] alien-callback ;
+    void { long } cdecl [ sleep ] alien-callback ;
 
 : ?callback ( word -- alien )
     dup optimized? [ execute ] [ drop f ] if ; inline
index c4700d2dadec0adbb1b05dd9ee4205951a8e3854..2ff688c456c99c2d9daa92311aafee791b4c3c6a 100644 (file)
@@ -10,8 +10,8 @@ alien.libraries classes.struct ;
 
 IN: cairo.ffi
 << {
-    { [ os winnt? ] [ "cairo" "libcairo-2.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "cairo" "/opt/local/lib/libcairo.dylib" "cdecl" add-library ] }
+    { [ os winnt? ] [ "cairo" "libcairo-2.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "cairo" "/opt/local/lib/libcairo.dylib" cdecl add-library ] }
     { [ os unix? ] [ ] }
 } cond >>
 
@@ -38,7 +38,7 @@ TYPEDEF: void* cairo_pattern_t
 
 TYPEDEF: void* cairo_destroy_func_t
 : cairo-destroy-func ( quot -- callback )
-    [ void { pointer: void } "cdecl" ] dip alien-callback ; inline
+    [ void { pointer: void } cdecl ] dip alien-callback ; inline
 
 ! See cairo.h for details
 STRUCT: cairo_user_data_key_t
@@ -79,11 +79,11 @@ CONSTANT: CAIRO_CONTENT_COLOR_ALPHA HEX: 3000
 
 TYPEDEF: void* cairo_write_func_t
 : cairo-write-func ( quot -- callback )
-    [ cairo_status_t { pointer: void c-string int } "cdecl" ] dip alien-callback ; inline
+    [ cairo_status_t { pointer: void c-string int } cdecl ] dip alien-callback ; inline
                           
 TYPEDEF: void* cairo_read_func_t
 : cairo-read-func ( quot -- callback )
-    [ cairo_status_t { pointer: void c-string int } "cdecl" ] dip alien-callback ; inline
+    [ cairo_status_t { pointer: void c-string int } cdecl ] dip alien-callback ; inline
 
 ! Functions for manipulating state objects
 FUNCTION: cairo_t*
index e4db56221f33a40e0c7ba5911bb0e7d3a04f6896..1accb1e8dc1390c9683a80f57b58b021b6676cd5 100644 (file)
@@ -40,7 +40,7 @@ IN: cocoa.subclassing
 
 : prepare-method ( ret types quot -- type imp )
     [ [ encode-types ] 2keep ] dip
-    '[ _ _ "cdecl" _ alien-callback ]
+    '[ _ _ cdecl _ alien-callback ]
     (( -- callback )) define-temp ;
 
 : prepare-methods ( methods -- methods )
index 7f1b6aa6f28fa742777184c1718e1f4484d7136f..b2c05edf7361e00d06260775db6e0457be72c15f 100644 (file)
@@ -68,8 +68,8 @@ IN: compiler.cfg.builder.tests
     [ [ dup ] loop ]
     [ [ 2 ] [ 3 throw ] if 4 ]
     [ int f "malloc" { int } alien-invoke ]
-    [ int { int } "cdecl" alien-indirect ]
-    [ int { int } "cdecl" [ ] alien-callback ]
+    [ int { int } cdecl alien-indirect ]
+    [ int { int } cdecl [ ] alien-callback ]
     [ swap - + * ]
     [ swap slot ]
     [ blahblah ]
index d82ced8a1d8a8b2c4dad3457a80121a0b40be3cd..12e263a3f43e943614ac8dcb8bd42a2c4b26e5a6 100755 (executable)
@@ -300,12 +300,12 @@ M: float-rep next-fastcall-param
 M: double-rep next-fastcall-param
     float-regs inc [ ?dummy-stack-params ] [ ?dummy-int-params ] bi ;
 
-GENERIC: reg-class-full? ( reg-class -- ? )
+GENERIC# reg-class-full? 1 ( reg-class abi -- ? )
 
-M: stack-params reg-class-full? drop t ;
+M: stack-params reg-class-full? 2drop t ;
 
 M: reg-class reg-class-full?
-    [ get ] [ param-regs length ] bi >= ;
+    [ get ] swap '[ _ param-regs length ] bi >= ;
 
 : alloc-stack-param ( rep -- n reg-class rep )
     stack-params get
@@ -315,10 +315,10 @@ M: reg-class reg-class-full?
 : alloc-fastcall-param ( rep -- n reg-class rep )
     [ [ reg-class-of get ] [ reg-class-of ] [ next-fastcall-param ] tri ] keep ;
 
-: alloc-parameter ( parameter -- reg rep )
-    c-type-rep dup reg-class-of reg-class-full?
+:: alloc-parameter ( parameter abi -- reg rep )
+    parameter c-type-rep dup reg-class-of abi reg-class-full?
     [ alloc-stack-param ] [ alloc-fastcall-param ] if
-    [ param-reg ] dip ;
+    [ abi param-reg ] dip ;
 
 : (flatten-int-type) ( type -- seq )
     stack-size cell align cell /i void* c-type <repetition> ;
@@ -355,8 +355,8 @@ M: c-type-name flatten-value-type c-type flatten-value-type ;
     #! Moves values from C stack to registers (if word is
     #! %load-param-reg) and registers to C stack (if word is
     #! %save-param-reg).
-    [ alien-parameters flatten-value-types ]
-    [ '[ alloc-parameter _ execute ] ]
+    [ [ alien-parameters flatten-value-types ] [ abi>> ] bi ]
+    [ '[ alloc-parameter _ execute ] ]
     bi* each-parameter ; inline
 
 : reverse-each-parameter ( parameters quot -- )
@@ -412,7 +412,7 @@ M: array dlsym-valid? '[ _ dlsym ] any? ;
     3array ;
 
 : alien-invoke-dlsym ( params -- symbols dll )
-    [ dup abi>> "stdcall" = [ stdcall-mangle ] [ function>> ] if ]
+    [ dup abi>> stdcall = [ stdcall-mangle ] [ function>> ] if ]
     [ library>> load-library ]
     bi 2dup check-dlsym ;
 
index 692dbee4c54aeb03ab7fe38301c2dc64f2a7d9c5..7aab8c8920bc8de6fe55d04b17fe1697b9852da8 100755 (executable)
@@ -19,9 +19,11 @@ IN: compiler.tests.alien
         { [ os unix?  ]  [ "libfactor-ffi-test.so" ] }
     } cond append-path ;
 
-"f-cdecl" libfactor-ffi-tests-path "cdecl" add-library
+"f-cdecl" libfactor-ffi-tests-path cdecl add-library
 
-"f-stdcall" libfactor-ffi-tests-path "stdcall" add-library
+"f-stdcall" libfactor-ffi-tests-path stdcall add-library
+
+"f-fastcall" libfactor-ffi-tests-path fastcall add-library
 >>
 
 LIBRARY: f-cdecl
@@ -90,7 +92,7 @@ FUNCTION: TINY ffi_test_17 int x ;
 [ [ alien-indirect ] infer ] [ inference-error? ] must-fail-with
 
 : indirect-test-1 ( ptr -- result )
-    int { } "cdecl" alien-indirect ;
+    int { } cdecl alien-indirect ;
 
 { 1 1 } [ indirect-test-1 ] must-infer-as
 
@@ -99,7 +101,7 @@ FUNCTION: TINY ffi_test_17 int x ;
 [ 3 ] [ &: ffi_test_1 indirect-test-1 ] unit-test
 
 : indirect-test-1' ( ptr -- )
-    int { } "cdecl" alien-indirect drop ;
+    int { } cdecl alien-indirect drop ;
 
 { 1 0 } [ indirect-test-1' ] must-infer-as
 
@@ -108,7 +110,7 @@ FUNCTION: TINY ffi_test_17 int x ;
 [ -1 indirect-test-1 ] must-fail
 
 : indirect-test-2 ( x y ptr -- result )
-    int { int int } "cdecl" alien-indirect gc ;
+    int { int int } cdecl alien-indirect gc ;
 
 { 3 1 } [ indirect-test-2 ] must-infer-as
 
@@ -117,11 +119,11 @@ FUNCTION: TINY ffi_test_17 int x ;
 unit-test
 
 : indirect-test-3 ( a b c d ptr -- result )
-    int { int int int int } "stdcall" alien-indirect
+    int { int int int int } stdcall alien-indirect
     gc ;
 
 [ f ] [ "f-stdcall" load-library f = ] unit-test
-[ "stdcall" ] [ "f-stdcall" library abi>> ] unit-test
+[ stdcall ] [ "f-stdcall" library abi>> ] unit-test
 
 : ffi_test_18 ( w x y z -- int )
     int "f-stdcall" "ffi_test_18" { int int int int }
@@ -314,21 +316,21 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
 
 ! Test callbacks
 
-: callback-1 ( -- callback ) void { } "cdecl" [ ] alien-callback ;
+: callback-1 ( -- callback ) void { } cdecl [ ] alien-callback ;
 
 [ 0 1 ] [ [ callback-1 ] infer [ in>> length ] [ out>> length ] bi ] unit-test
 
 [ t ] [ callback-1 alien? ] unit-test
 
-: callback_test_1 ( ptr -- ) void { } "cdecl" alien-indirect ;
+: callback_test_1 ( ptr -- ) void { } cdecl alien-indirect ;
 
 [ ] [ callback-1 callback_test_1 ] unit-test
 
-: callback-2 ( -- callback ) void { } "cdecl" [ [ 5 throw ] ignore-errors ] alien-callback ;
+: callback-2 ( -- callback ) void { } cdecl [ [ 5 throw ] ignore-errors ] alien-callback ;
 
 [ ] [ callback-2 callback_test_1 ] unit-test
 
-: callback-3 ( -- callback ) void { } "cdecl" [ 5 "x" set ] alien-callback ;
+: callback-3 ( -- callback ) void { } cdecl [ 5 "x" set ] alien-callback ;
 
 [ t 3 5 ] [
     [
@@ -340,38 +342,38 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
 ] unit-test
 
 : callback-5 ( -- callback )
-    void { } "cdecl" [ gc ] alien-callback ;
+    void { } cdecl [ gc ] alien-callback ;
 
 [ "testing" ] [
     "testing" callback-5 callback_test_1
 ] unit-test
 
 : callback-5b ( -- callback )
-    void { } "cdecl" [ compact-gc ] alien-callback ;
+    void { } cdecl [ compact-gc ] alien-callback ;
 
 [ "testing" ] [
     "testing" callback-5b callback_test_1
 ] unit-test
 
 : callback-6 ( -- callback )
-    void { } "cdecl" [ [ continue ] callcc0 ] alien-callback ;
+    void { } cdecl [ [ continue ] callcc0 ] alien-callback ;
 
 [ 1 2 3 ] [ callback-6 callback_test_1 1 2 3 ] unit-test
 
 : callback-7 ( -- callback )
-    void { } "cdecl" [ 1000000 sleep ] alien-callback ;
+    void { } cdecl [ 1000000 sleep ] alien-callback ;
 
 [ 1 2 3 ] [ callback-7 callback_test_1 1 2 3 ] unit-test
 
 [ f ] [ namespace global eq? ] unit-test
 
 : callback-8 ( -- callback )
-    void { } "cdecl" [ [ ] in-thread yield ] alien-callback ;
+    void { } cdecl [ [ ] in-thread yield ] alien-callback ;
 
 [ ] [ callback-8 callback_test_1 ] unit-test
 
 : callback-9 ( -- callback )
-    int { int int int } "cdecl" [
+    int { int int int } cdecl [
         + + 1 +
     ] alien-callback ;
 
@@ -429,13 +431,13 @@ STRUCT: double-rect
     } cleave ;
 
 : double-rect-callback ( -- alien )
-    void { void* void* double-rect } "cdecl"
+    void { void* void* double-rect } cdecl
     [ "example" set-global 2drop ] alien-callback ;
 
 : double-rect-test ( arg -- arg' )
     f f rot
     double-rect-callback
-    void { void* void* double-rect } "cdecl" alien-indirect
+    void { void* void* double-rect } cdecl alien-indirect
     "example" get-global ;
 
 [ 1.0 2.0 3.0 4.0 ]
@@ -452,7 +454,7 @@ FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 ) ;
 ] unit-test
 
 : callback-10 ( -- callback )
-    test_struct_14 { double double } "cdecl"
+    test_struct_14 { double double } cdecl
     [
         test_struct_14 <struct>
             swap >>x2
@@ -460,7 +462,7 @@ FUNCTION: test_struct_14 ffi_test_40 ( double x1, double x2 ) ;
     ] alien-callback ;
 
 : callback-10-test ( x1 x2 callback -- result )
-    test_struct_14 { double double } "cdecl" alien-indirect ;
+    test_struct_14 { double double } cdecl alien-indirect ;
 
 [ 1.0 2.0 ] [
     1.0 2.0 callback-10 callback-10-test
@@ -475,7 +477,7 @@ FUNCTION: test-struct-12 ffi_test_41 ( int a, double x ) ;
 ] unit-test
 
 : callback-11 ( -- callback )
-    test-struct-12 { int double } "cdecl"
+    test-struct-12 { int double } cdecl
     [
         test-struct-12 <struct>
             swap >>x
@@ -483,7 +485,7 @@ FUNCTION: test-struct-12 ffi_test_41 ( int a, double x ) ;
     ] alien-callback ;
 
 : callback-11-test ( x1 x2 callback -- result )
-    test-struct-12 { int double } "cdecl" alien-indirect ;
+    test-struct-12 { int double } cdecl alien-indirect ;
 
 [ 1 2.0 ] [
     1 2.0 callback-11 callback-11-test
@@ -499,7 +501,7 @@ FUNCTION: test_struct_15 ffi_test_42 ( float x, float y ) ;
 [ 1.0 2.0 ] [ 1.0 2.0 ffi_test_42 [ x>> ] [ y>> ] bi ] unit-test
 
 : callback-12 ( -- callback )
-    test_struct_15 { float float } "cdecl"
+    test_struct_15 { float float } cdecl
     [
         test_struct_15 <struct>
             swap >>y
@@ -507,7 +509,7 @@ FUNCTION: test_struct_15 ffi_test_42 ( float x, float y ) ;
     ] alien-callback ;
 
 : callback-12-test ( x1 x2 callback -- result )
-    test_struct_15 { float float } "cdecl" alien-indirect ;
+    test_struct_15 { float float } cdecl alien-indirect ;
 
 [ 1.0 2.0 ] [
     1.0 2.0 callback-12 callback-12-test [ x>> ] [ y>> ] bi
@@ -522,7 +524,7 @@ FUNCTION: test_struct_16 ffi_test_43 ( float x, int a ) ;
 [ 1.0 2 ] [ 1.0 2 ffi_test_43 [ x>> ] [ a>> ] bi ] unit-test
 
 : callback-13 ( -- callback )
-    test_struct_16 { float int } "cdecl"
+    test_struct_16 { float int } cdecl
     [
         test_struct_16 <struct>
             swap >>a
@@ -530,7 +532,7 @@ FUNCTION: test_struct_16 ffi_test_43 ( float x, int a ) ;
     ] alien-callback ;
 
 : callback-13-test ( x1 x2 callback -- result )
-    test_struct_16 { float int } "cdecl" alien-indirect ;
+    test_struct_16 { float int } cdecl alien-indirect ;
 
 [ 1.0 2 ] [
     1.0 2 callback-13 callback-13-test
@@ -581,13 +583,13 @@ FUNCTION: short ffi_test_48 ( bool-field-test x ) ;
 
 ! Test interaction between threads and callbacks
 : thread-callback-1 ( -- callback )
-    int { } "cdecl" [ yield 100 ] alien-callback ;
+    int { } cdecl [ yield 100 ] alien-callback ;
 
 : thread-callback-2 ( -- callback )
-    int { } "cdecl" [ yield 200 ] alien-callback ;
+    int { } cdecl [ yield 200 ] alien-callback ;
 
 : thread-callback-invoker ( callback -- n )
-    int { } "cdecl" alien-indirect ;
+    int { } cdecl alien-indirect ;
 
 <promise> "p" set
 [ thread-callback-1 thread-callback-invoker "p" get fulfill ] in-thread
@@ -600,6 +602,43 @@ FUNCTION: void this_does_not_exist ( ) ;
 [ this_does_not_exist ] [ { "kernel-error" 9 f f } = ] must-fail-with
 
 ! More alien-assembly tests are in cpu.* vocabs
-: assembly-test-1 ( -- ) void { } "cdecl" [ ] alien-assembly ;
+: assembly-test-1 ( -- ) void { } cdecl [ ] alien-assembly ;
 
 [ ] [ assembly-test-1 ] unit-test
+
+[ f ] [ "f-fastcall" load-library f = ] unit-test
+[ fastcall ] [ "f-fastcall" library abi>> ] unit-test
+
+: ffi_test_49 ( x -- int )
+    int "f-fastcall" "ffi_test_49" { int }
+    alien-invoke gc ;
+: ffi_test_50 ( x y -- int )
+    int "f-fastcall" "ffi_test_50" { int int }
+    alien-invoke gc ;
+: ffi_test_51 ( x y z -- int )
+    int "f-fastcall" "ffi_test_51" { int int int }
+    alien-invoke gc ;
+: ffi_test_52 ( x y z -- int )
+    int "f-fastcall" "ffi_test_52" { int float int }
+    alien-invoke gc ;
+: ffi_test_53 ( x y z w -- int )
+    int "f-fastcall" "ffi_test_53" { int int int int }
+    alien-invoke gc ;
+: ffi_test_54 ( x y -- int )
+    int "f-fastcall" "ffi_test_54" { test-struct-11 int }
+    alien-invoke gc ;
+: ffi_test_55 ( x y z -- int )
+    int "f-fastcall" "ffi_test_55" { test-struct-11 int int }
+    alien-invoke gc ;
+: ffi_test_56 ( x y z w -- int )
+    int "f-fastcall" "ffi_test_56" { test-struct-11 int int int }
+    alien-invoke gc ;
+    
+[ 4 ] [ 3 ffi_test_49 ] unit-test
+[ 8 ] [ 3 4 ffi_test_50 ] unit-test
+[ 13 ] [ 3 4 5 ffi_test_51 ] unit-test
+[ 13 ] [ 3 4.0 5 ffi_test_52 ] unit-test
+[ 19 ] [ 3 4.0 5 6 ffi_test_53 ] unit-test
+[ 13 ] [ 3 4 test-struct-11 <struct-boa> 5 ffi_test_54 ] unit-test
+[ 19 ] [ 3 4 test-struct-11 <struct-boa> 5 6 ffi_test_55 ] unit-test
+[ 26 ] [ 3 4 test-struct-11 <struct-boa> 5 6 7 ffi_test_56 ] unit-test
index 391102102edebc18e11981304dcf718a574f345c..90c4e9943d9966d197b2c0b932dfe72bbd260d40 100644 (file)
@@ -7,12 +7,12 @@ TYPEDEF: alien.c-types:int type-1
 TYPEDEF: alien.c-types:int type-3
 
 : callback ( -- ptr )
-    type-3 { type-1 type-1 } "cdecl" [ + >integer ] alien-callback ;
+    type-3 { type-1 type-1 } cdecl [ + >integer ] alien-callback ;
 
 TYPEDEF: alien.c-types:float type-2
 
 : indirect ( x y ptr -- z  )
-    type-3 { type-2 type-2 } "cdecl" alien-indirect ;
+    type-3 { type-2 type-2 } cdecl alien-indirect ;
 
 [ ] [
     "USING: alien.c-types alien.syntax ;
index 553b55cf6e94ed664da1b6afe73787d220d714e3..aede6d562113ce5221ef85b62a5c8deb109ccfa3 100644 (file)
@@ -8,7 +8,7 @@ IN: compression.zlib.ffi
     { [ os winnt? ] [ "zlib1.dll" ] }
     { [ os macosx? ] [ "libz.dylib" ] }
     { [ os unix? ] [ "libz.so" ] }
-} cond "cdecl" add-library >>
+} cond cdecl add-library >>
 
 LIBRARY: zlib
 
index 14d701ba177e7ac0d7bda8bab0e93f24bb1a0029..793efefbe869b81e663fa2514d737af9a039ed30 100644 (file)
@@ -120,7 +120,7 @@ PRIVATE>
     [ fds>> [ enable-all-callbacks ] each ] bi ;
 
 : timer-callback ( -- callback )
-    void { CFRunLoopTimerRef void* } "cdecl"
+    void { CFRunLoopTimerRef void* } cdecl
     [ 2drop reset-run-loop yield ] alien-callback ;
 
 : init-thread-timer ( -- )
index b617746a06f81db50e7ddf101845c6efcb4fa36f..9a50b0a2e26fdb551250daf7066a22bae62b72bb 100644 (file)
@@ -484,15 +484,15 @@ HOOK: %loop-entry cpu ( -- )
 GENERIC: return-reg ( reg-class -- reg )
 
 ! Sequence of registers used for parameter passing in class
-GENERIC: param-regs ( reg-class -- regs )
+GENERIC# param-regs 1 ( reg-class abi -- regs )
 
-M: stack-params param-regs drop f ;
+M: stack-params param-regs 2drop f ;
 
-GENERIC: param-reg ( n reg-class -- reg )
+GENERIC# param-reg 1 ( n reg-class abi -- reg )
 
 M: reg-class param-reg param-regs nth ;
 
-M: stack-params param-reg drop ;
+M: stack-params param-reg 2drop ;
 
 ! Is this integer small enough to be an immediate operand for
 ! %add-imm, %sub-imm, and %mul-imm?
index 5cfa1391c47dc98f8907d66c68efe2404e636c03..0a1e8477e81c74b55bcb029ad57a0e06dba6b824 100644 (file)
@@ -13,7 +13,7 @@ M: linux reserved-area-size 2 cells ;
 
 M: linux lr-save 1 cells ;
 
-M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 } ;
+M: float-regs param-regs 2drop { 1 2 3 4 5 6 7 8 } ;
 
 M: ppc value-struct? drop f ;
 
index 152a3aa7209e81f1c2f982802c27b5a4fb66ca48..49e9768cf67c76d57224b534592bba7501334d6f 100644 (file)
@@ -8,7 +8,7 @@ M: macosx reserved-area-size 6 cells ;
 
 M: macosx lr-save 2 cells ;
 
-M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ;
+M: float-regs param-regs 2drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ;
 
 M: ppc value-struct? drop t ;
 
index dbc313052f6e9c1d8127a79f9785fa0a7671c191..f81d8705bf649207829c16cf5c95b25e5eba4cc5 100644 (file)
@@ -237,7 +237,7 @@ M: spill-slot float-function-param* [ 1 ] dip n>> spill@ LFD ;
 M: integer float-function-param* FMR ;
 
 : float-function-param ( i src -- )
-    [ float-regs param-regs nth ] dip float-function-param* ;
+    [ float-regs cdecl param-regs nth ] dip float-function-param* ;
 
 : float-function-return ( reg -- )
     float-regs return-reg double-rep %copy ;
@@ -587,7 +587,7 @@ M: ppc %reload ( dst rep src -- )
 M: ppc %loop-entry ;
 
 M: int-regs return-reg drop 3 ;
-M: int-regs param-regs drop { 3 4 5 6 7 8 9 10 } ;
+M: int-regs param-regs 2drop { 3 4 5 6 7 8 9 10 } ;
 M: float-regs return-reg drop 1 ;
 
 M:: ppc %save-param-reg ( stack reg rep -- )
@@ -647,7 +647,7 @@ M:: ppc %box ( n rep func -- )
     ! If the source is a stack location, load it into freg #0.
     ! If the source is f, then we assume the value is already in
     ! freg #0.
-    n [ 0 rep reg-class-of param-reg rep %load-param-reg ] when*
+    n [ 0 rep reg-class-of cdecl param-reg rep %load-param-reg ] when*
     rep double-rep? 5 4 ? %load-vm-addr
     func f %alien-invoke ;
 
index bc07e3a25bfa4e9f2132db3fcb5baf477b63504c..375374806fbe72ce01b19f3a8aa0a15944616262 100644 (file)
@@ -2,6 +2,6 @@ IN: cpu.x86.32.tests
 USING: alien alien.c-types tools.test cpu.x86.assembler
 cpu.x86.assembler.operands ;
 
-: assembly-test-1 ( -- x ) int { } "cdecl" [ EAX 3 MOV ] alien-assembly ;
+: assembly-test-1 ( -- x ) int { } cdecl [ EAX 3 MOV ] alien-assembly ;
 
 [ 3 ] [ assembly-test-1 ] unit-test
index 09f1ecb32b6763c1b965212ad22d1538f10598f5..c707294e42f85334135d5fa8b374ab8a437b8450 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: locals alien.c-types alien.libraries alien.syntax arrays
-kernel fry math namespaces sequences system layouts io
+USING: locals alien alien.c-types alien.libraries alien.syntax
+arrays kernel fry math namespaces sequences system layouts io
 vocabs.loader accessors init combinators command-line make
 compiler compiler.units compiler.constants compiler.alien
 compiler.codegen compiler.codegen.fixup
@@ -83,10 +83,17 @@ M: x86.32 return-struct-in-registers? ( c-type -- ? )
 : struct-return@ ( n -- operand )
     [ next-stack@ ] [ stack-frame get params>> local@ ] if* ;
 
-! On x86, parameters are never passed in registers.
+! On x86, parameters are usually never passed in registers, except with Microsoft's
+! "thiscall" and "fastcall" abis
 M: int-regs return-reg drop EAX ;
-M: int-regs param-regs drop { } ;
-M: float-regs param-regs drop { } ;
+M: float-regs param-regs 2drop { } ;
+
+M: int-regs param-regs
+    nip {
+        { thiscall [ { ECX     } ] }
+        { fastcall [ { ECX EDX } ] }
+        [ drop { } ]
+    } case ;
 
 GENERIC: load-return-reg ( src rep -- )
 GENERIC: store-return-reg ( dst rep -- )
@@ -291,23 +298,23 @@ M:: x86.32 %binary-float-function ( dst src1 src2 func -- )
     func "libm" load-library %alien-invoke
     dst float-function-return ;
 
-: stdcall? ( params -- ? )
-    abi>> "stdcall" = ;
-
 : funny-large-struct-return? ( params -- ? )
     #! MINGW ABI incompatibility disaster
     [ return>> large-struct? ]
-    [ abi>> "mingw" = os windows? not or ]
+    [ abi>> mingw = os windows? not or ]
     bi and ;
 
+: callee-cleanup? ( abi -- ? )
+    { stdcall fastcall thiscall } member? ;
+
 M: x86.32 %cleanup ( params -- )
-    #! a) If we just called an stdcall function in Windows, it
+    #! a) If we just called a stdcall function in Windows, it
     #! cleaned up the stack frame for us. But we don't want that
     #! so we 'undo' the cleanup since we do that in %epilogue.
     #! b) If we just called a function returning a struct, we
     #! have to fix ESP.
     {
-        { [ dup stdcall? ] [ drop ESP stack-frame get params>> SUB ] }
+        { [ dup abi>> callee-cleanup? ] [ drop ESP stack-frame get params>> SUB ] }
         { [ dup funny-large-struct-return? ] [ drop EAX PUSH ] }
         [ drop ]
     } cond ;
index 6d171af7eaf6a58b4f9bb0dc2beb8679e2ebb4b2..2d2c89441c019b22f1abd681d5cf8180938a086a 100644 (file)
@@ -2,12 +2,12 @@ USING: alien alien.c-types cpu.architecture cpu.x86.64
 cpu.x86.assembler cpu.x86.assembler.operands tools.test ;
 IN: cpu.x86.64.tests
 
-: assembly-test-1 ( -- x ) int { } "cdecl" [ RAX 3 MOV ] alien-assembly ;
+: assembly-test-1 ( -- x ) int { } cdecl [ RAX 3 MOV ] alien-assembly ;
 
 [ 3 ] [ assembly-test-1 ] unit-test
 
 : assembly-test-2 ( a b -- x )
-    int { int int } "cdecl" [
+    int { int int } cdecl [
         param-reg-0 param-reg-1 ADD
         int-regs return-reg param-reg-0 MOV
     ] alien-assembly ;
index 04f64f96b6d3808b13e764ab3acc7aac1dab7aba..6e33219a66e08d24201dc41701c2c77d1771ef8a 100644 (file)
@@ -11,10 +11,10 @@ cpu.architecture vm ;
 FROM: layouts => cell cells ;
 IN: cpu.x86.64
 
-: param-reg-0 ( -- reg ) 0 int-regs param-reg ; inline
-: param-reg-1 ( -- reg ) 1 int-regs param-reg ; inline
-: param-reg-2 ( -- reg ) 2 int-regs param-reg ; inline
-: param-reg-3 ( -- reg ) 3 int-regs param-reg ; inline
+: param-reg-0 ( -- reg ) 0 int-regs cdecl param-reg ; inline
+: param-reg-1 ( -- reg ) 1 int-regs cdecl param-reg ; inline
+: param-reg-2 ( -- reg ) 2 int-regs cdecl param-reg ; inline
+: param-reg-3 ( -- reg ) 3 int-regs cdecl param-reg ; inline
 
 M: x86.64 pic-tail-reg RBX ;
 
@@ -154,7 +154,7 @@ M:: x86.64 %unbox-large-struct ( n c-type -- )
     "to_value_struct" f %alien-invoke ;
 
 : load-return-value ( rep -- )
-    [ [ 0 ] dip reg-class-of param-reg ]
+    [ [ 0 ] dip reg-class-of cdecl param-reg ]
     [ reg-class-of return-reg ]
     [ ]
     tri %copy ;
@@ -162,7 +162,7 @@ M:: x86.64 %unbox-large-struct ( n c-type -- )
 M:: x86.64 %box ( n rep func -- )
     n [
         n
-        0 rep reg-class-of param-reg
+        0 rep reg-class-of cdecl param-reg
         rep %load-param-reg
     ] [
         rep load-return-value
@@ -249,7 +249,7 @@ M: x86.64 %end-callback-value ( ctype -- )
     unbox-return ;
 
 : float-function-param ( i src -- )
-    [ float-regs param-regs nth ] dip double-rep %copy ;
+    [ float-regs cdecl param-regs nth ] dip double-rep %copy ;
 
 : float-function-return ( reg -- )
     float-regs return-reg double-rep %copy ;
index 2fb32ce733cfa8086d46bd77f37afe018dffabdc..01e02d274d37cb454e7c0450d2c960d9a9e548cb 100644 (file)
@@ -7,10 +7,10 @@ compiler.cfg.registers ;
 IN: cpu.x86.64.unix
 
 M: int-regs param-regs
-    drop { RDI RSI RDX RCX R8 R9 } ;
+    2drop { RDI RSI RDX RCX R8 R9 } ;
 
 M: float-regs param-regs
-    drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ;
+    2drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ;
 
 M: x86.64 reserved-stack-space 0 ;
 
index c75bb5a1b93ba9e80a4499bda6d90bcf3c86af73..5d8ecc5cfbb469aca2e088586d5775f3776d287e 100644 (file)
@@ -5,9 +5,9 @@ compiler.cfg.registers cpu.architecture cpu.x86.assembler cpu.x86
 cpu.x86.assembler.operands ;
 IN: cpu.x86.64.winnt
 
-M: int-regs param-regs drop { RCX RDX R8 R9 } ;
+M: int-regs param-regs 2drop { RCX RDX R8 R9 } ;
 
-M: float-regs param-regs drop { XMM0 XMM1 XMM2 XMM3 } ;
+M: float-regs param-regs 2drop { XMM0 XMM1 XMM2 XMM3 } ;
 
 M: x86.64 reserved-stack-space 4 cells ;
 
index 30b2ce3b57accf63cd05a6aaa80bbcd16f89e275..7913489178493267c5628a09419c077e5958cfcb 100644 (file)
@@ -9,7 +9,7 @@ IN: cpu.x86.features
 <PRIVATE
 
 : (sse-version) ( -- n )
-    int { } "cdecl" [
+    int { } cdecl [
         "sse-42" define-label
         "sse-41" define-label
         "ssse-3" define-label
@@ -97,12 +97,12 @@ MEMO: sse-version ( -- n )
 HOOK: instruction-count cpu ( -- n )
 
 M: x86.32 instruction-count
-    longlong { } "cdecl" [
+    longlong { } cdecl [
         RDTSC
     ] alien-assembly ;
 
 M: x86.64 instruction-count
-    longlong { } "cdecl" [
+    longlong { } cdecl [
         RAX 0 MOV
         RDTSC
         RDX 32 SHL
index 812507a20f64efc6d425e3d68666c7d6787aed98..99078ca85d0b87aeea9c2e65d449060f11a506b1 100644 (file)
@@ -9,7 +9,7 @@ IN: db.postgresql.ffi
     { [ os winnt? ]  [ "libpq.dll" ] }
     { [ os macosx? ] [ "libpq.dylib" ] }
     { [ os unix?  ]  [ "libpq.so" ] }
-} cond "cdecl" add-library >>
+} cond cdecl add-library >>
 
 ! ConnSatusType
 CONSTANT: CONNECTION_OK                     HEX: 0
index f93b9617994950861ce3613e366cd3e1419e929a..d9da317c89b3b47c09062302e81a9c64f6c51b75 100644 (file)
@@ -10,7 +10,7 @@ IN: db.sqlite.ffi
         { [ os winnt? ]  [ "sqlite3.dll" ] }
         { [ os macosx? ] [ "/usr/lib/libsqlite3.dylib" ] }
         { [ os unix? ]  [ "libsqlite3.so" ] }
-    } cond "cdecl" add-library >>
+    } cond cdecl add-library >>
 
 ! Return values from sqlite functions
 CONSTANT: SQLITE_OK           0 ! Successful result
index 157a426e19e783769ba82c6fd44910ca2ae8def2..7447f24151e2d26bad9afe23970e202781d08820 100644 (file)
@@ -8,14 +8,14 @@ IN: glib
 <<
 
 {
-    { [ os winnt? ] [ "glib" "libglib-2.0-0.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "glib" "/opt/local/lib/libglib-2.0.0.dylib" "cdecl" add-library ] }
+    { [ os winnt? ] [ "glib" "libglib-2.0-0.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "glib" "/opt/local/lib/libglib-2.0.0.dylib" cdecl add-library ] }
     { [ os unix? ] [ ] }
 } cond
 
 {
-    { [ os winnt? ] [ "gobject" "libgobject-2.0-0.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "gobject" "/opt/local/lib/libgobject-2.0.0.dylib" "cdecl" add-library ] }
+    { [ os winnt? ] [ "gobject" "libgobject-2.0-0.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "gobject" "/opt/local/lib/libgobject-2.0.0.dylib" cdecl add-library ] }
     { [ os unix? ] [ ] }
 } cond
 
index 05328b48dc9e34f438ee3af44460638e73c7f486..ea31292c065027af73c3573a77599fa877c669c0 100644 (file)
@@ -11,7 +11,7 @@ TUPLE: run-loop-mx kqueue-mx ;
 
 : file-descriptor-callback ( -- callback )
     void { CFFileDescriptorRef CFOptionFlags void* }
-    "cdecl" [
+    cdecl [
         3drop
         0 mx get kqueue-mx>> wait-for-events
         reset-run-loop
index b3cf28a497909e1b22c91992d15e82157f3e10df..ca7ba0cd497671f4e234ffc5ecb173e0e28addb4 100644 (file)
@@ -31,7 +31,7 @@ TUPLE: openssl-context < secure-context aliens sessions ;
     ] [ drop ] if ;
 
 : password-callback ( -- alien )
-    int { void* int bool void* } "cdecl"
+    int { void* int bool void* } cdecl
     [| buf size rwflag password! |
         password [ B{ 0 } password! ] unless
 
index 8eb2df5b4624f3725f89e608c9c198350f5c1883..7a961518a0463506366880ac4db4c912b1ef582d 100644 (file)
@@ -57,7 +57,7 @@ TUPLE: ConnectEx-args port
     } cleave
     int
     { SOCKET void* int PVOID DWORD LPDWORD void* }
-    "stdcall" alien-indirect drop
+    stdcall alien-indirect drop
     winsock-error-string [ throw ] when* ; inline
 
 M: object establish-connection ( client-out remote -- )
index ea3bee424f7763ccc7867da201db82eef40286f1..7d45f01337e79b03a21974f48d836f82e48f073d 100644 (file)
@@ -3,26 +3,26 @@ cpu.x86.assembler.operands math.floats.env.x86 system ;
 IN: math.floats.env.x86.32
 
 M: x86.32 get-sse-env
-    void { void* } "cdecl" [
+    void { void* } cdecl [
         EAX ESP [] MOV
         EAX [] STMXCSR
     ] alien-assembly ;
 
 M: x86.32 set-sse-env
-    void { void* } "cdecl" [
+    void { void* } cdecl [
         EAX ESP [] MOV
         EAX [] LDMXCSR
     ] alien-assembly ;
 
 M: x86.32 get-x87-env
-    void { void* } "cdecl" [
+    void { void* } cdecl [
         EAX ESP [] MOV
         EAX [] FNSTSW
         EAX 2 [+] FNSTCW
     ] alien-assembly ;
 
 M: x86.32 set-x87-env
-    void { void* } "cdecl" [
+    void { void* } cdecl [
         EAX ESP [] MOV
         FNCLEX
         EAX 2 [+] FLDCW
index b6f8ee151f71229bda479d6798ac27db7a22b1ad..93cb11104f9af8945f0e4cc654a008fa26969603 100644 (file)
@@ -3,23 +3,23 @@ cpu.x86.assembler.operands math.floats.env.x86 sequences system ;
 IN: math.floats.env.x86.64
 
 M: x86.64 get-sse-env
-    void { void* } "cdecl" [
-        int-regs param-regs first [] STMXCSR
+    void { void* } cdecl [
+        int-regs cdecl param-regs first [] STMXCSR
     ] alien-assembly ;
 
 M: x86.64 set-sse-env
-    void { void* } "cdecl" [
-        int-regs param-regs first [] LDMXCSR
+    void { void* } cdecl [
+        int-regs cdecl param-regs first [] LDMXCSR
     ] alien-assembly ;
 
 M: x86.64 get-x87-env
-    void { void* } "cdecl" [
-        int-regs param-regs first [] FNSTSW
-        int-regs param-regs first 2 [+] FNSTCW
+    void { void* } cdecl [
+        int-regs cdecl param-regs first [] FNSTSW
+        int-regs cdecl param-regs first 2 [+] FNSTCW
     ] alien-assembly ;
 
 M: x86.64 set-x87-env
-    void { void* } "cdecl" [
+    void { void* } cdecl [
         FNCLEX
-        int-regs param-regs first 2 [+] FLDCW
+        int-regs cdecl param-regs first 2 [+] FLDCW
     ] alien-assembly ;
index 9e095a62e6b205314023943dfde6fca03fc893e7..aeaa5da4eb759dfdb75e84b038abad88ca6bd104 100644 (file)
@@ -3,4 +3,4 @@ IN: opengl.gl.macosx
 
 : gl-function-context ( -- context ) 0 ; inline
 : gl-function-address ( name -- address ) f dlsym ; inline
-: gl-function-calling-convention ( -- str ) "cdecl" ; inline
+: gl-function-calling-convention ( -- str ) cdecl ; inline
index 3352b18350264dbc39055abfa731a89e969beb3b..a9d3b42b53fcbf40eed58aec3469e06428d33039 100644 (file)
@@ -3,4 +3,4 @@ IN: opengl.gl.unix
 
 : gl-function-context ( -- context ) glXGetCurrentContext ; inline
 : gl-function-address ( name -- address ) glXGetProcAddressARB ; inline
-: gl-function-calling-convention ( -- str ) "cdecl" ; inline
+: gl-function-calling-convention ( -- str ) cdecl ; inline
index 8bceb865e2aff33c2d6b5f5cb7896ac5b6af59ab..2ac9894b9a28dd4bf48353d1cebc9597e3a79a94 100644 (file)
@@ -8,4 +8,4 @@ FUNCTION: void* wglGetProcAddress ( c-string name ) ;
 
 : gl-function-context ( -- context ) wglGetCurrentContext ; inline
 : gl-function-address ( name -- address ) wglGetProcAddress ; inline
-: gl-function-calling-convention ( -- str ) "stdcall" ; inline
+: gl-function-calling-convention ( -- str ) stdcall ; inline
index f9983d7813522c6caa730fadcd92d7b7f9b28cee..fb39a8e51bef955c6c4fa5666914ac3bea53f078 100644 (file)
@@ -14,9 +14,9 @@ IN: openssl.libcrypto
 {
     { [ os openbsd? ] [ ] } ! VM is linked with it
     { [ os netbsd? ] [ ] }
-    { [ os winnt? ] [ "libcrypto" "libeay32.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "libcrypto" "libcrypto.dylib" "cdecl" add-library ] }
-    { [ os unix? ] [ "libcrypto" "libcrypto.so" "cdecl" add-library ] }
+    { [ os winnt? ] [ "libcrypto" "libeay32.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "libcrypto" "libcrypto.dylib" cdecl add-library ] }
+    { [ os unix? ] [ "libcrypto" "libcrypto.so" cdecl add-library ] }
 } cond
 >>
 
index 96d235d271fc5c98f8842f900b72a98067747e45..272b1bb17ebaef2819a6f255c8d03a5aecc9d174 100644 (file)
@@ -10,9 +10,9 @@ IN: openssl.libssl
 << {
     { [ os openbsd? ] [ ] } ! VM is linked with it
     { [ os netbsd? ] [ ] }
-    { [ os winnt? ] [ "libssl" "ssleay32.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "libssl" "libssl.dylib" "cdecl" add-library ] }
-    { [ os unix? ] [ "libssl" "libssl.so" "cdecl" add-library ] }
+    { [ os winnt? ] [ "libssl" "ssleay32.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "libssl" "libssl.dylib" cdecl add-library ] }
+    { [ os unix? ] [ "libssl" "libssl.so" cdecl add-library ] }
 } cond >>
 
 CONSTANT: X509_FILETYPE_PEM       1
index d6baaffe2e77da6557751c3b40d320e5ff6819e1..85d4cef4241ac77d9f9dff47c339e41fee374f2f 100644 (file)
@@ -12,8 +12,8 @@ classes.struct cairo cairo.ffi ;
 IN: pango.cairo
 
 << {
-    { [ os winnt? ] [ "pangocairo" "libpangocairo-1.0-0.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "pangocairo" "/opt/local/lib/libpangocairo-1.0.0.dylib" "cdecl" add-library ] }
+    { [ os winnt? ] [ "pangocairo" "libpangocairo-1.0-0.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "pangocairo" "/opt/local/lib/libpangocairo-1.0.0.dylib" cdecl add-library ] }
     { [ os unix? ] [ ] }
 } cond >>
 
index 6dc48e39fe261e4c682ac6fcf5de1998393a7e68..3a249c664c6a99be83cfe5f6d45e227bf997ac70 100644 (file)
@@ -11,8 +11,8 @@ IN: pango
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 << {
-    { [ os winnt? ] [ "pango" "libpango-1.0-0.dll" "cdecl" add-library ] }
-    { [ os macosx? ] [ "pango" "/opt/local/lib/libpango-1.0.0.dylib" "cdecl" add-library ] }
+    { [ os winnt? ] [ "pango" "libpango-1.0-0.dll" cdecl add-library ] }
+    { [ os macosx? ] [ "pango" "/opt/local/lib/libpango-1.0.0.dylib" cdecl add-library ] }
     { [ os unix? ] [ ] }
 } cond >>
 
index 642ee48e6769a8b6f3a58e8154d5f198ff6ad6bc..73dade6657f409d6a9eeb747acccc1688f0e47ac 100644 (file)
@@ -2,9 +2,9 @@ USING: alien alien.c-types kernel math ;
 IN: tools.deploy.test.9
 
 : callback-test ( -- callback )
-    int { int } "cdecl" [ 1 + ] alien-callback ;
+    int { int } cdecl [ 1 + ] alien-callback ;
 
 : indirect-test ( -- )
-    10 callback-test int { int } "cdecl" alien-indirect 11 assert= ;
+    10 callback-test int { int } cdecl alien-indirect 11 assert= ;
 
 MAIN: indirect-test
index 5e46a3468230922928e0ca8cbd3f2f9d2a32e384..e998a5cfdb2af984fa3a327533b70e5e63ff9134 100644 (file)
@@ -12,7 +12,7 @@ IN: tools.disassembler.udis
     { [ os macosx? ] [ "libudis86.0.dylib" ] }
     { [ os unix? ] [ "libudis86.so.0" ] }
     { [ os winnt? ] [ "libudis86.dll" ] }
-} cond "cdecl" add-library
+} cond cdecl add-library
 >>
 
 LIBRARY: libudis86
index 5c31cdaeb481b664ca6359db8db32939178e0bba..b02b800463f2b94a5044dc6d0e83a1834793e32e 100644 (file)
@@ -21,9 +21,9 @@ IN: tools.profiler.tests
 
 [ ] [ \ + usage-profile. ] unit-test
 
-: callback-test ( -- callback ) void { } "cdecl" [ ] alien-callback ;
+: callback-test ( -- callback ) void { } cdecl [ ] alien-callback ;
 
-: indirect-test ( callback -- ) void { } "cdecl" alien-indirect ;
+: indirect-test ( callback -- ) void { } cdecl alien-indirect ;
 
 : foobar ( -- ) ;
 
index c0829e5c8dada706571cf4c3e319899aedfcc526..e0be2e7c9971ccc2f7f836a3a1fe17ea6608ebe8 100644 (file)
@@ -609,7 +609,7 @@ SYMBOL: trace-messages?
 
 ! return 0 if you handle the message, else just let DefWindowProc return its val
 : ui-wndproc ( -- object )
-    uint { void* uint long long } "stdcall" [
+    uint { void* uint long long } stdcall [
         pick
         trace-messages? get-global [ dup windows-message-name name>> print flush ] when
         wm-handlers get-global at* [ call ] [ drop DefWindowProc ] if
index 555bab32e4a7659b652ca849bcd195dc868674ad..1809ee4b687bc09b7b51ab1326f22d4af2e67e8b 100644 (file)
@@ -156,4 +156,4 @@ FUNCTION: int unlink ( c-string path ) ;
 FUNCTION: int utimes ( c-string path, timeval[2] times ) ;
 FUNCTION: ssize_t write ( int fd, void* buf, size_t nbytes ) ;
 
-"librt" "librt.so" "cdecl" add-library
+"librt" "librt.so" cdecl add-library
index ff6a9ad4fcb4eeaeca9c7a429f230227bd07b961..614a535ea0ce747eea02c17fd2e9b4414e74c659 100644 (file)
@@ -1,14 +1,14 @@
 USING: alien sequences alien.libraries ;
 {
-    { "advapi32" "\\windows\\coredll.dll" "stdcall" }
-    { "gdi32"    "\\windows\\coredll.dll" "stdcall" }
-    { "user32"   "\\windows\\coredll.dll" "stdcall" }
-    { "kernel32" "\\windows\\coredll.dll" "stdcall" }
-    { "winsock"  "\\windows\\ws2.dll" "stdcall" }
-    { "mswsock"  "\\windows\\ws2.dll" "stdcall" }
-    { "libc"     "\\windows\\coredll.dll" "stdcall"   }
-    { "libm"     "\\windows\\coredll.dll" "stdcall"   }
-    ! { "gl"       "libGLES_CM.dll"         "stdcall" }
-    ! { "glu"      "libGLES_CM.dll"         "stdcall" }
-    { "ole32"    "ole32.dll"    "stdcall" }
+    { "advapi32" "\\windows\\coredll.dll" stdcall }
+    { "gdi32"    "\\windows\\coredll.dll" stdcall }
+    { "user32"   "\\windows\\coredll.dll" stdcall }
+    { "kernel32" "\\windows\\coredll.dll" stdcall }
+    { "winsock"  "\\windows\\ws2.dll" stdcall }
+    { "mswsock"  "\\windows\\ws2.dll" stdcall }
+    { "libc"     "\\windows\\coredll.dll" stdcall   }
+    { "libm"     "\\windows\\coredll.dll" stdcall   }
+    ! { "gl"       "libGLES_CM.dll"         stdcall }
+    ! { "glu"      "libGLES_CM.dll"         stdcall }
+    { "ole32"    "ole32.dll"    stdcall }
 } [ first3 add-library ] each
index 78a3c0e6d2c5280c2a7f577c48bb3c29c5c0328e..9d74ac49f894cb7cad0d1dae932e82e4db71be83 100644 (file)
@@ -12,7 +12,7 @@ MACRO: com-invoke ( n return parameters -- )
     [ 2nip length ] 3keep
     '[
         _ npick *void* _ cell * alien-cell _ _
-        "stdcall" alien-indirect
+        stdcall alien-indirect
     ] ;
 
 TUPLE: com-interface-definition word parent iid functions ;
index 25861659dc6d80f2661e736c1c30eeac45445367..6f92c8b860cfd8f97f0481b4f7f6e7feef210110 100644 (file)
@@ -114,7 +114,7 @@ unless
         ] [
             first2 (finish-thunk)
         ] bi*
-        "stdcall" swap compile-alien-callback
+        stdcall swap compile-alien-callback
     ] 2map ;
 
 : (make-callbacks) ( implementations -- sequence )
index 9c8a55ee7c04f4241900b2e0ac50415fd0dc16af..25c2642e345a2913026739c0bb03c75be6bcbf54 100644 (file)
@@ -4,7 +4,7 @@ USING: alien.c-types alien.libraries alien.syntax classes.struct
 kernel math windows.types windows.ole32 ;
 IN: windows.ddk.hid
 
-<< "hid" "hid.dll" "stdcall" add-library >>
+<< "hid" "hid.dll" stdcall add-library >>
 LIBRARY: hid
 
 TYPEDEF: LONG   NTSTATUS
index 06d32725f79428a99aa02cb03c5520174435a5e8..45ecebee74f333f328846c9d60bd8fb48c560468 100644 (file)
@@ -4,7 +4,7 @@ USING: literals windows.kernel32 math alien.syntax windows.types classes.struct
 alien.c-types windows.errors windows.ole32 windows.advapi32 alien.libraries ;
 IN: windows.ddk.setupapi
 
-<< "setupapi" "setupapi.dll" "stdcall" add-library >>
+<< "setupapi" "setupapi.dll" stdcall add-library >>
 LIBRARY: setupapi
 
 TYPEDEF: DWORDLONG SP_LOG_TOKEN
index 3b98e7e8cac04a2750c8f8a1c35468358642d664..12ce13790160b7c33ee5d25ba2ef079d495d69f0 100644 (file)
@@ -4,7 +4,7 @@ USING: alien.c-types alien.syntax classes.struct windows.kernel32
 windows.types alien.libraries ;
 IN: windows.ddk.winusb
 
-<< "winusb" "winusb.dll" "stdcall" add-library >>
+<< "winusb" "winusb.dll" stdcall add-library >>
 LIBRARY: winusb
 
 TYPEDEF: PVOID WINUSB_INTERFACE_HANDLE
index 998846ebc2bbe272ab9a9abb8cc029ad1b87ee88..8f68643e0a5da839241055a5f4b740c192e85cee 100644 (file)
@@ -21,7 +21,7 @@ STRUCT: DWM_BLURBEHIND
 : full-window-margins ( -- MARGINS )
     -1 -1 -1 -1 <MARGINS> ; inline
 
-<< "dwmapi" "dwmapi.dll" "stdcall" add-library >>
+<< "dwmapi" "dwmapi.dll" stdcall add-library >>
 
 LIBRARY: dwmapi
 
index 8e831e153e0cf7f9399fb829efc4081e0f2cda39..4b119ba5faced6e1fbd3b6a678bd43d71345c9ca 100644 (file)
@@ -1,35 +1,35 @@
 USING: alien sequences alien.libraries ;
 {
-    { "advapi32"    "advapi32.dll"       "stdcall" }
-    { "dinput"      "dinput8.dll"        "stdcall" }
-    { "gdi32"       "gdi32.dll"          "stdcall" }
-    { "user32"      "user32.dll"         "stdcall" }
-    { "kernel32"    "kernel32.dll"       "stdcall" }
-    { "winsock"     "ws2_32.dll"         "stdcall" }
-    { "mswsock"     "mswsock.dll"        "stdcall" }
-    { "shell32"     "shell32.dll"        "stdcall" }
-    { "libc"        "msvcrt.dll"         "cdecl"   }
-    { "libm"        "msvcrt.dll"         "cdecl"   }
-    { "gl"          "opengl32.dll"       "stdcall" }
-    { "glu"         "glu32.dll"          "stdcall" }
-    { "ole32"       "ole32.dll"          "stdcall" }
-    { "usp10"       "usp10.dll"          "stdcall" }
-    { "psapi"       "psapi.dll"          "stdcall" }
-    { "xinput"      "xinput1_3.dll"      "stdcall" }
-    { "dxgi"        "dxgi.dll"           "stdcall" }
-    { "d2d1"        "d2d1.dll"           "stdcall" }
-    { "d3d9"        "d3d9.dll"           "stdcall" }
-    { "d3d10"       "d3d10.dll"          "stdcall" }
-    { "d3d10_1"     "d3d10_1.dll"        "stdcall" }
-    { "d3d11"       "d3d11.dll"          "stdcall" }
-    { "d3dcompiler" "d3dcompiler_42.dll" "stdcall" } 
-    { "d3dcsx"      "d3dcsx_42.dll"      "stdcall" }
-    { "d3dx9"       "d3dx9_42.dll"       "stdcall" }
-    { "d3dx10"      "d3dx10_42.dll"      "stdcall" }
-    { "d3dx11"      "d3dx11_42.dll"      "stdcall" }
-    { "dwrite"      "dwrite.dll"         "stdcall" }
-    { "x3daudio"    "x3daudio1_6.dll"    "stdcall" }
-    { "xactengine"  "xactengine3_5.dll"  "stdcall" }
-    { "xapofx"      "xapofx1_3.dll"      "stdcall" }
-    { "xaudio2"     "xaudio2_5.dll"      "stdcall" }
+    { "advapi32"    "advapi32.dll"       stdcall }
+    { "dinput"      "dinput8.dll"        stdcall }
+    { "gdi32"       "gdi32.dll"          stdcall }
+    { "user32"      "user32.dll"         stdcall }
+    { "kernel32"    "kernel32.dll"       stdcall }
+    { "winsock"     "ws2_32.dll"         stdcall }
+    { "mswsock"     "mswsock.dll"        stdcall }
+    { "shell32"     "shell32.dll"        stdcall }
+    { "libc"        "msvcrt.dll"         cdecl   }
+    { "libm"        "msvcrt.dll"         cdecl   }
+    { "gl"          "opengl32.dll"       stdcall }
+    { "glu"         "glu32.dll"          stdcall }
+    { "ole32"       "ole32.dll"          stdcall }
+    { "usp10"       "usp10.dll"          stdcall }
+    { "psapi"       "psapi.dll"          stdcall }
+    { "xinput"      "xinput1_3.dll"      stdcall }
+    { "dxgi"        "dxgi.dll"           stdcall }
+    { "d2d1"        "d2d1.dll"           stdcall }
+    { "d3d9"        "d3d9.dll"           stdcall }
+    { "d3d10"       "d3d10.dll"          stdcall }
+    { "d3d10_1"     "d3d10_1.dll"        stdcall }
+    { "d3d11"       "d3d11.dll"          stdcall }
+    { "d3dcompiler" "d3dcompiler_42.dll" stdcall } 
+    { "d3dcsx"      "d3dcsx_42.dll"      stdcall }
+    { "d3dx9"       "d3dx9_42.dll"       stdcall }
+    { "d3dx10"      "d3dx10_42.dll"      stdcall }
+    { "d3dx11"      "d3dx11_42.dll"      stdcall }
+    { "dwrite"      "dwrite.dll"         stdcall }
+    { "x3daudio"    "x3daudio1_6.dll"    stdcall }
+    { "xactengine"  "xactengine3_5.dll"  stdcall }
+    { "xapofx"      "xapofx1_3.dll"      stdcall }
+    { "xaudio2"     "xaudio2_5.dll"      stdcall }
 } [ first3 add-library ] each
index a44d703fbc316b083097f2163617b7daf0652f7f..4dab6f84523411b5adf9fdf828b470789802d17b 100644 (file)
@@ -5,6 +5,10 @@ kernel.private byte-arrays byte-vectors arrays init
 continuations.private ;
 IN: alien
 
+SINGLETONS: stdcall thiscall fastcall cdecl mingw ;
+
+UNION: abi stdcall thiscall fastcall cdecl mingw ;
+
 PREDICATE: pinned-alien < alien underlying>> not ;
 
 UNION: pinned-c-ptr pinned-alien POSTPONE: f ;
index 561110d941d0624760c000a1a22e4f9cd8695008..1ae1c6a34da1d625c8ef3316d00c2df9a6ac0a2e 100644 (file)
@@ -2,12 +2,12 @@ USING: math kernel alien alien.c-types ;
 IN: benchmark.fib6\r
 \r
 : fib ( x -- y )\r
-    int { int } "cdecl" [\r
+    int { int } cdecl [\r
         dup 1 <= [ drop 1 ] [\r
             1 - dup fib swap 1 - fib +\r
         ] if\r
     ] alien-callback\r
-    int { int } "cdecl" alien-indirect ;\r
+    int { int } cdecl alien-indirect ;\r
 \r
 : fib-main ( -- ) 32 fib drop ;\r
 \r
index 0142b57a7727a87190cedf48b8da46fa4f699d44..b00f64339f918ce6aabcdbe6327aa3d539532d74 100644 (file)
@@ -11,7 +11,7 @@ IN: chipmunk.ffi
     { [ os windows? ] [ "chipmunk.dll" ] }
     { [ os macosx? ] [ "libchipmunk.dylib"  ] }
     { [ os unix?  ] [ "libchipmunk.so" ] }
-} cond "cdecl" add-library
+} cond cdecl add-library
 
 "chipmunk" deploy-library
 >>
index 222885b72c7e6c85bd6829ff01b813c2b52e63bc..2b52d0ec566d3a84b5afd096f489ce447bf0e679 100644 (file)
@@ -8,7 +8,7 @@ IN: curses.ffi
     { [ os winnt? ]  [ "libcurses.dll" ] }
     { [ os macosx? ] [ "libcurses.dylib" ] }
     { [ os unix?  ]  [ "libcurses.so" ] }
-} cond "cdecl" add-library >>
+} cond cdecl add-library >>
 
 C-TYPE: WINDOW
 C-TYPE: SCREEN
index d71999ab871c1d6c36f63891c6be0e763be72a53..770fd01ffd1ac371f77ed950b86e5520f3c81b34 100644 (file)
@@ -1,5 +1,5 @@
 ! (c)2010 Joe Groff bsd license
-USING: accessors cursors make math sequences sorting tools.test ;
+USING: accessors cursors kernel make math sequences sorting tools.test ;
 FROM: cursors => each map assoc-each assoc>map ;
 IN: cursors.tests
 
@@ -12,6 +12,10 @@ IN: cursors.tests
     T{ linear-cursor f 1 1 } T{ linear-cursor f 5 1 } [ value>> 3 mod zero? ] -find
 ] unit-test
 
+[ T{ linear-cursor f 5 1 } ] [
+    T{ linear-cursor f 1 1 } T{ linear-cursor f 5 1 } [ value>> 6 = ] -find
+] unit-test
+
 [ { 1 3 } ] [
     [ T{ linear-cursor f 1 2 } T{ linear-cursor f 5 2 } [ value>> , ] -each ]
     { } make
index d131d2eb3579ccaa738823196c3e2b2f63396cb7..cd215ea463a13a796aa495922f484ba0bedee00d 100644 (file)
@@ -5,8 +5,8 @@ alien.libraries classes.struct ;
 IN: freetype
 
 << "freetype" {
-    { [ os macosx? ] [ "/usr/X11R6/lib/libfreetype.6.dylib" "cdecl" add-library ] }
-    { [ os windows? ] [ "freetype6.dll" "cdecl" add-library ] }
+    { [ os macosx? ] [ "/usr/X11R6/lib/libfreetype.6.dylib" cdecl add-library ] }
+    { [ os windows? ] [ "freetype6.dll" cdecl add-library ] }
     { [ t ] [ drop ] }
 } cond >>
 
index d521015d6f6c60ad411f2fb83c88ad42b48ba9c9..5cae45ff95efac858b35d0f0d3e411c18179a6e7 100644 (file)
@@ -11,7 +11,7 @@ IN: libusb
         { [ os windows? ] [ "libusb-1.0.dll" ] }
         { [ os macosx? ] [ "libusb-1.0.dylib"  ] }
         { [ os unix?  ] [ "libusb-1.0.so" ] }
-    } cond "cdecl" add-library >>
+    } cond cdecl add-library >>
 LIBRARY: libusb
 
 : libusb_cpu_to_le16 ( x -- y )
index f0a3cafe33fcd3962e7537a59c1dc98efac62011..f3bf1cbaf0ae8fa10d38565f72fb3491e84624b4 100644 (file)
@@ -12,7 +12,7 @@ IN: llvm.core
         { [ os macosx? ] [ "/usr/local/lib/lib" ".dylib" surround ] }
         { [ os windows? ] [ ".dll" append ] }
         { [ os unix? ] [ "lib" ".so" surround ] }
-    } cond "cdecl" add-library ;
+    } cond cdecl add-library ;
 
 "LLVMSystem" add-llvm-library
 "LLVMSupport" add-llvm-library
index 87f39944d934b1fbc050d3ed600cfe1f77961478..cc3480fe49c586b5268eb4ea64a955cce39d2485 100644 (file)
@@ -41,7 +41,7 @@ TUPLE: function name alien return params ;
         dup name>> function-pointer ,
         dup return>> c-type ,
         dup params>> [ second c-type ] map ,
-        "cdecl" , \ alien-indirect ,
+        cdecl , \ alien-indirect ,
     ] [ ] make swap function-effect [ define-declared ] with-compilation-unit ;
 
 : install-module ( name -- )
index d7abece8bc4b50da2ee1ea422458ae3b484ef6bd..51e462147618b2d415dca1f0bb1b418e246a8284 100644 (file)
@@ -18,7 +18,7 @@ IN: ogg
     { [ os winnt? ]  [ "ogg.dll" ] }
     { [ os macosx? ] [ "libogg.0.dylib" ] }
     { [ os unix? ]   [ "libogg.so" ] }
-} cond "cdecl" add-library
+} cond cdecl add-library
 
 "ogg" deploy-library
 >>
index eb79613496a0490080d0471a9d188e1c16908387..82f4a7db5166e12b49b2991d8d7ebfbe333d2ee5 100644 (file)
@@ -19,13 +19,13 @@ IN: ogg.theora
     { [ os winnt? ]  [ "theoradec.dll" ] }
     { [ os macosx? ] [ "libtheoradec.0.dylib" ] }
     { [ os unix? ]   [ "libtheoradec.so" ] }
-} cond "cdecl" add-library
+} cond cdecl add-library
 
 "theoraenc" {
     { [ os winnt? ]  [ "theoraenc.dll" ] }
     { [ os macosx? ] [ "libtheoraenc.0.dylib" ] }
     { [ os unix? ]   [ "libtheoraenc.so" ] }
-} cond "cdecl" add-library
+} cond cdecl add-library
 >>
 
 CONSTANT: TH-EFAULT      -1
index ad43750e2741ff0a3fc98ce0ea92854987bf2257..3cefbeebec517a7f7e4b25b607ae1822620b5c5c 100644 (file)
@@ -19,7 +19,7 @@ IN: ogg.vorbis
     { [ os winnt? ]  [ "vorbis.dll" ] }
     { [ os macosx? ] [ "libvorbis.0.dylib" ] }
     { [ os unix? ]   [ "libvorbis.so" ] }
-} cond "cdecl" add-library 
+} cond cdecl add-library 
 
 "vorbis" deploy-library
 >>
index 0bf851164709589cff6ea148c847cfb45b4dc0bb..07b2e4c2b610bf09585040a4801706354628c269 100755 (executable)
@@ -14,7 +14,7 @@ IN: openal.alut
             "/System/Library/Frameworks/OpenAL.framework/OpenAL"
         ] }
         { [ os unix?  ]  [ "libalut.so" ] }
-    } cond "cdecl" add-library >>
+    } cond cdecl add-library >>
 
 << os macosx? [ "alut" deploy-library ] unless >>
 
index bbe61f9dc377f750b26db9dc0c60c365671c6966..853b33b38627b2a1d31034000be6006d2acd6c72 100755 (executable)
@@ -14,7 +14,7 @@ IN: openal
             "/System/Library/Frameworks/OpenAL.framework/OpenAL"
         ] }
         { [ os unix?  ]  [ "libopenal.so" ] }
-    } cond "cdecl" add-library >>
+    } cond cdecl add-library >>
 
 << os macosx? [ "openal" deploy-library ] unless >>
 
index 8f0400dd20f23370446744858f7ddfb9e93e7868..9ee2135cb63e9de97f086a2a2e981c98e07b3284 100644 (file)
@@ -8,7 +8,7 @@ IN: opencl.ffi
         { [ os windows? ] [ "OpenCL.dll" ] }
         { [ os macosx? ] [ "/System/Library/Frameworks/OpenCL.framework/OpenCL" ] }
         { [ os unix? ] [ "libOpenCL.so" ] }
-    } cond "stdcall" add-library >>
+    } cond stdcall add-library >>
 LIBRARY: opencl
 
 ! cl_platform.h
index 86936fdd65654210e3f2b58a7d6f9984b261bbfc..856740d22956cad3d5c2ce5c49d53c37c236a466 100644 (file)
@@ -9,7 +9,7 @@ IN: opengl.glu
 os {
     { [ dup macosx? ] [ drop ] }
     { [ dup windows? ] [ drop ] }
-    { [ dup unix? ] [ drop "glu" "libGLU.so.1" "cdecl" add-library ] }
+    { [ dup unix? ] [ drop "glu" "libGLU.so.1" cdecl add-library ] }
 } cond
 
 >>
index da4a75044462f7967f5ffbeb225421c7ab0fcd40..07c5eabeea0989c48b6c115243423b148bbc7475 100644 (file)
@@ -9,7 +9,7 @@ IN: tokyo.alien.tcrdb
     { [ os macosx? ] [ "/opt/local/lib/libtokyotyrant.dylib" ] }
     { [ os unix? ] [ "libtokyotyrant.so" ] }
     { [ os windows? ] [ "tokyotyrant.dll" ] }
-} cond "cdecl" add-library >>
+} cond cdecl add-library >>
 
 LIBRARY: tokyotyrant
 
index afb78dba228ec02a1b44713ecb267adbde91d30b..ee92348bb445eccf097880ba3e97aa73e7304357 100644 (file)
@@ -8,7 +8,7 @@ IN: tokyo.alien.tcutil
     { [ os macosx? ] [ "/opt/local/lib/libtokyocabinet.dylib" ] }
     { [ os unix? ] [ "libtokyocabinet.so" ] }
     { [ os windows? ] [ "tokyocabinet.dll" ] }
-} cond "cdecl" add-library >>
+} cond cdecl add-library >>
 
 LIBRARY: tokyocabinet
 
index ee69d954eafe13c785eb949914ce1887440cf762..6428bead751fdc9383f89409b9d041d95ceb2374 100644 (file)
@@ -76,7 +76,7 @@ PRIVATE>
 
 : compile-c-library ( -- )
     compile-library? [ compile-library ] when
-    c-library get dup library-path "cdecl" add-library ;
+    c-library get dup library-path cdecl add-library ;
 
 : define-c-function ( function types effect body -- )
     [
index 38e6817f6c6862be1fb200c3893c3a5b5ca036f1..8895d0b3a61cddf7d6dc501a6253d87b2ac61d2f 100644 (file)
@@ -13,9 +13,9 @@ USING: alien kernel system combinators alien.syntax ;
 IN: cryptlib.libcl
 
 << "libcl" {
-        { [ win32? ] [ "cl32.dll" "stdcall" ] }
-        { [ macosx? ] [ "libcl.dylib" "cdecl" ] }
-        { [ unix? ] [ "libcl.so" "cdecl" ] }
+        { [ win32? ] [ "cl32.dll" stdcall ] }
+        { [ macosx? ] [ "libcl.dylib" cdecl ] }
+        { [ unix? ] [ "libcl.so" cdecl ] }
     } cond add-library >>
 
 ! ===============================================
index c047393c99978165815f361667639f7a55c89ba8..98fd0b38cb403674a2fa63f68f251cb72f70504f 100644 (file)
@@ -6,9 +6,9 @@ USING: alien alien.syntax combinators kernel system ;
 IN: db.mysql.ffi
 
 << "mysql" {
-    { [ os winnt? ] [ "libmySQL.dll" "stdcall" ] }
-    { [ os macosx? ] [ "libmysqlclient.14.dylib" "cdecl" ] }
-    { [ os unix? ] [ "libmysqlclient.so.14" "cdecl" ] }
+    { [ os winnt? ] [ "libmySQL.dll" stdcall ] }
+    { [ os macosx? ] [ "libmysqlclient.14.dylib" cdecl ] }
+    { [ os unix? ] [ "libmysqlclient.so.14" cdecl ] }
 } cond add-library >>
 
 LIBRARY: mysql
index 49bc57b108033f0d8e0cfc6485b011e41cc00850..d809d899de82e7d58dd0f8d6b853747089ca8a5a 100644 (file)
@@ -296,61 +296,61 @@ FUNCTION: jint JNI_CreateJavaVM ( void** pvm, void** penv, void* args ) ;
   ] when ;
 
 : (destroy-java-vm) 
-  "int" { "void*" } "cdecl" alien-indirect ;
+  "int" { "void*" } cdecl alien-indirect ;
 
 : (attach-current-thread) 
-  "int" { "void*" "void*" "void*" } "cdecl" alien-indirect ;
+  "int" { "void*" "void*" "void*" } cdecl alien-indirect ;
 
 : (detach-current-thread) 
-  "int" { "void*" } "cdecl" alien-indirect ;
+  "int" { "void*" } cdecl alien-indirect ;
 
 : (get-env) 
-  "int" { "void*" "void*" "int" } "cdecl" alien-indirect ;
+  "int" { "void*" "void*" "int" } cdecl alien-indirect ;
 
 : (attach-current-thread-as-daemon) 
-  "int" { "void*" "void*" "void*" } "cdecl" alien-indirect ;
+  "int" { "void*" "void*" "void*" } cdecl alien-indirect ;
 
 : destroy-java-vm ( javavm -- int )
   dup JavaVM-functions JNIInvokeInterface-DestroyJavaVM (destroy-java-vm) ;
 
 : (get-version) 
-  "jint" { "JNIEnv*" } "cdecl" alien-indirect ;
+  "jint" { "JNIEnv*" } cdecl alien-indirect ;
 
 : get-version ( jnienv -- int )
   dup JNIEnv-functions JNINativeInterface-GetVersion (get-version) ;
   
 : (find-class) 
-  "void*" { "JNINativeInterface*" "char*" } "cdecl" alien-indirect ;
+  "void*" { "JNINativeInterface*" "char*" } cdecl alien-indirect ;
 
 : find-class ( name jnienv -- int )
   dup swapd JNIEnv-functions JNINativeInterface-FindClass (find-class) ;
 
 : (get-static-field-id) 
-  "void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ;
+  "void*" { "JNINativeInterface*" "void*" "char*" "char*" } cdecl alien-indirect ;
 
 : get-static-field-id ( class name sig jnienv -- int )
   dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetStaticFieldID (get-static-field-id) ;
 
 : (get-static-object-field) 
-  "void*" { "JNINativeInterface*" "void*" "void*" } "cdecl" alien-indirect ;
+  "void*" { "JNINativeInterface*" "void*" "void*" } cdecl alien-indirect ;
 
 : get-static-object-field ( class id jnienv -- int )
   dup >r >r 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-GetStaticObjectField (get-static-object-field) ;
 
 : (get-method-id) 
-  "void*" { "JNINativeInterface*" "void*" "char*" "char*" } "cdecl" alien-indirect ;
+  "void*" { "JNINativeInterface*" "void*" "char*" "char*" } cdecl alien-indirect ;
 
 : get-method-id ( class name sig jnienv -- int )
   dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-GetMethodID (get-method-id) ;
 
 : (new-string) 
-  "void*" { "JNINativeInterface*" "char*" "int" } "cdecl" alien-indirect ;
+  "void*" { "JNINativeInterface*" "char*" "int" } cdecl alien-indirect ;
 
 : new-string ( str jnienv -- str )
   dup >r >r dup length 2array r> swap first2 r> JNIEnv-functions JNINativeInterface-NewString (new-string) ;
 
 : (call1) 
-  "void" { "JNINativeInterface*" "void*" "void*" "int" } "cdecl" alien-indirect ;
+  "void" { "JNINativeInterface*" "void*" "void*" "int" } cdecl alien-indirect ;
 
 : call1 ( obj method-id jstr jnienv -- )
   dup >r >r 3array r> swap first3 r> JNIEnv-functions JNINativeInterface-CallObjectMethod (call1) ;
index 6db68840712a579f7a7f5d94978f7410288e44c6..9b7dd36a699345b7f53e49c115bbfe9e534e8d5b 100644 (file)
@@ -10,9 +10,9 @@ USING: alien alien.syntax combinators kernel system ;
 IN: ldap.libldap
 
 << "libldap" {
-    { [ win32? ]  [ "libldap.dll" "stdcall" ] }
-    { [ macosx? ] [ "libldap.dylib" "cdecl" ] }
-    { [ unix? ]   [ "libldap.so" "cdecl" ] }
+    { [ win32? ]  [ "libldap.dll" stdcall ] }
+    { [ macosx? ] [ "libldap.dylib" cdecl ] }
+    { [ unix? ]   [ "libldap.so" cdecl ] }
 } cond add-library >>
  
 : LDAP_VERSION1     1 ; inline
index 9877c700626d53e4945da172855eb3bebf0a28b7..093a110fba130a27d654ffb3e63583bae6c7edf8 100644 (file)
@@ -52,7 +52,7 @@ SYMBOL: def-hash-keys
         [ t ] [ f ]
         [ { } ]
         [ drop f ]
-        [ "cdecl" ]
+        [ cdecl ]
         [ first ] [ second ] [ third ] [ fourth ]
         [ ">" write ] [ "/>" write ]
     } ;
index 06d47b8937542bf6c4da3facc7e3081b355b2ce7..6dcddb5bd53f426c7c351ed37b8934c4c23e1ed4 100644 (file)
@@ -5,7 +5,7 @@ combinators alien.c-types strings sequences namespaces make
 words math threads io.encodings.ascii ;
 IN: odbc
 
-<< "odbc" "odbc32.dll" "stdcall" add-library >>
+<< "odbc" "odbc32.dll" stdcall add-library >>
 
 LIBRARY: odbc
 
index aa04aef39fb894848b9b32f951c1be8a95bf1275..4e8ebfc860b88548e6b4210dcf11f8cb786dfddf 100644 (file)
@@ -12,9 +12,9 @@ USING: alien alien.syntax combinators kernel system ;
 IN: oracle.liboci
 
 "oci" {
-    { [ os winnt? ] [ "oci.dll" "stdcall" ] }
-    { [ os macosx? ] [ "$DYLD_LIBRARY_PATH/libclntsh.dylib" "cdecl" ] }
-    { [ os unix? ] [ "$DYLD_LIBRARY_PATH/libclntsh.so.10.1" "cdecl" ] }
+    { [ os winnt? ] [ "oci.dll" stdcall ] }
+    { [ os macosx? ] [ "$DYLD_LIBRARY_PATH/libclntsh.dylib" cdecl ] }
+    { [ os unix? ] [ "$DYLD_LIBRARY_PATH/libclntsh.so.10.1" cdecl ] }
 } cond add-library
 
 ! ===============================================
index a40b7cddeed165c3c81d51c7bb0f44a3fd5be0b8..c365f6944f370f5595b5b924dc85c878ff4a041a 100644 (file)
@@ -10,9 +10,9 @@ USING: alien alien.syntax combinators system ;
 IN: pdf.libhpdf
 
 << "libhpdf" {
-    { [ win32? ] [ "libhpdf.dll" "stdcall" ] }
-    { [ macosx? ] [ "libhpdf.dylib" "cdecl" ] }
-    { [ unix? ] [ "$LD_LIBRARY_PATH/libhpdf.so" "cdecl" ] }
+    { [ win32? ] [ "libhpdf.dll" stdcall ] }
+    { [ macosx? ] [ "libhpdf.dylib" cdecl ] }
+    { [ unix? ] [ "$LD_LIBRARY_PATH/libhpdf.so" cdecl ] }
 } cond add-library >>
 
 ! compression mode
index 11f7498f307445737de372a1c8cb7a45d1a69692..d45a08cf8b30752bc005ae065320bede5018044e 100755 (executable)
@@ -329,3 +329,27 @@ short ffi_test_48(struct bool_field_test x)
 }
 
 #endif
+
+FACTOR_FASTCALL(int) ffi_test_49(int x) { return x + 1; }
+FACTOR_FASTCALL(int) ffi_test_50(int x, int y) { return x + y + 1; }
+FACTOR_FASTCALL(int) ffi_test_51(int x, int y, int z) { return x + y + z + 1; }
+FACTOR_FASTCALL(int) ffi_test_52(int x, float y, int z) { return x + y + z + 1; }
+FACTOR_FASTCALL(int) ffi_test_53(int x, float y, int z, int w)
+{
+       return x + y + z + w + 1;
+}
+
+FACTOR_FASTCALL(int) ffi_test_54(struct test_struct_11 x, int y)
+{
+       return x.x + x.y + y + 1;
+}
+
+FACTOR_FASTCALL(int) ffi_test_55(struct test_struct_11 x, int y, int z)
+{
+       return x.x + x.y + y + z + 1;
+}
+
+FACTOR_FASTCALL(int) ffi_test_56(struct test_struct_11 x, int y, int z, int w)
+{
+       return x.x + x.y + y + z + w + 1;
+}
index c61c95d6df835517b1202fdce9e5290851f0e0a8..6fe35fdb42edce3d7092c6776bbbc47236067fbe 100755 (executable)
@@ -1,9 +1,12 @@
 #if defined(_MSC_VER)
        #define FACTOR_STDCALL(return_type) return_type __stdcall
+       #define FACTOR_FASTCALL(return_type) return_type __fastcall
 #elif defined(i386) || defined(__i386) || defined(__i386__)
        #define FACTOR_STDCALL(return_type) __attribute__((stdcall)) return_type
+       #define FACTOR_FASTCALL(return_type) __attribute__((fastcall)) return_type
 #else
        #define FACTOR_STDCALL(return_type) return_type
+       #define FACTOR_FASTCALL(return_type) return_type
 #endif
 
 #if defined(__APPLE__)
@@ -119,3 +122,12 @@ struct bool_field_test {
 FACTOR_EXPORT short ffi_test_48(struct bool_field_test x);
 
 #endif
+
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_49(int x);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_50(int x, int y);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_51(int x, int y, int z);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_52(int x, float y, int z);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_53(int x, float y, int z, int w);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_54(struct test_struct_11 x, int y);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_55(struct test_struct_11 x, int y, int z);
+FACTOR_EXPORT FACTOR_FASTCALL(int) ffi_test_56(struct test_struct_11 x, int y, int z, int w);