diff --git a/basis/alien/libraries/libraries-tests.factor b/basis/alien/libraries/libraries-tests.factor old mode 100644 new mode 100755 index f1dc228d83..2721ce48c0 --- a/basis/alien/libraries/libraries-tests.factor +++ b/basis/alien/libraries/libraries-tests.factor @@ -1,4 +1,4 @@ -USING: alien.libraries alien.syntax tools.test kernel ; +USING: alien alien.libraries alien.syntax tools.test kernel ; IN: alien.libraries.tests [ f ] [ DLL" fadfasdfsada" dll-valid? ] unit-test @@ -8,3 +8,21 @@ IN: alien.libraries.tests [ ] [ "doesnotexist" dlopen dlclose ] unit-test [ "fdasfsf" dll-valid? drop ] must-fail + +[ t ] [ + "test-library" "blah" cdecl add-library + "test-library" "BLAH" cdecl add-library? + "blah" remove-library +] unit-test + +[ t ] [ + "test-library" "blah" cdecl add-library + "test-library" "blah" stdcall add-library? + "blah" remove-library +] unit-test + +[ f ] [ + "test-library" "blah" cdecl add-library + "test-library" "blah" cdecl add-library? + "blah" remove-library +] unit-test diff --git a/basis/alien/libraries/libraries.factor b/basis/alien/libraries/libraries.factor index a3f52df098..206db7b188 100755 --- a/basis/alien/libraries/libraries.factor +++ b/basis/alien/libraries/libraries.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.strings assocs io.backend kernel namespaces destructors sequences strings -system io.pathnames ; +system io.pathnames fry ; IN: alien.libraries : dlopen ( path -- dll ) native-string>alien (dlopen) ; @@ -32,9 +32,15 @@ M: library dispose dll>> [ dispose ] when* ; : remove-library ( name -- ) libraries get delete-at* [ dispose ] [ drop ] if ; +: add-library? ( name path abi -- ? ) + [ library ] 2dip + '[ [ path>> _ = ] [ abi>> _ = ] bi and not ] [ t ] if* ; + : add-library ( name path abi -- ) - [ 2drop remove-library ] - [ swap libraries get set-at ] 3bi ; + 3dup add-library? [ + [ 2drop remove-library ] + [ swap libraries get set-at ] 3bi + ] [ 3drop ] if ; : library-abi ( library -- abi ) library [ abi>> ] [ cdecl ] if* ;