[pypy-commit] pypy win_ffi: release dll after test
mattip
noreply at buildbot.pypy.org
Fri Jun 1 15:25:35 CEST 2012
Author: Matti Picus <matti.picus at gmail.com>
Branch: win_ffi
Changeset: r55254:8d737aa82c17
Date: 2012-06-01 15:09 +0300
http://bitbucket.org/pypy/pypy/changeset/8d737aa82c17/
Log: release dll after test add WinDLL to libffi
diff --git a/pypy/rlib/libffi.py b/pypy/rlib/libffi.py
--- a/pypy/rlib/libffi.py
+++ b/pypy/rlib/libffi.py
@@ -5,11 +5,13 @@
from pypy.rlib.rarithmetic import intmask, r_uint, r_singlefloat, r_longlong
from pypy.rlib import jit
from pypy.rlib import clibffi
-from pypy.rlib.clibffi import FUNCFLAG_CDECL, AbstractFuncPtr, \
- push_arg_as_ffiptr, c_ffi_call, FFI_TYPE_STRUCT
+from pypy.rlib.clibffi import FUNCFLAG_CDECL, FUNCFLAG_STDCALL, \
+ AbstractFuncPtr, push_arg_as_ffiptr, c_ffi_call, FFI_TYPE_STRUCT
from pypy.rlib.rdynload import dlopen, dlclose, dlsym, dlsym_byordinal
from pypy.rlib.rdynload import DLLHANDLE
+import os
+
class types(object):
"""
This namespace contains the primitive types you can use to declare the
@@ -416,6 +418,11 @@
def getaddressindll(self, name):
return dlsym(self.lib, name)
+if os.name == 'nt':
+ class WinDLL(CDLL):
+ def getpointer(self, name, argtypes, restype, flags=FUNCFLAG_STDCALL):
+ return Func(name, argtypes, restype, dlsym(self.lib, name),
+ flags=flags, keepalive=self)
# ======================================================================
@jit.oopspec('libffi_struct_getfield(ffitype, addr, offset)')
diff --git a/pypy/rlib/test/test_libffi.py b/pypy/rlib/test/test_libffi.py
--- a/pypy/rlib/test/test_libffi.py
+++ b/pypy/rlib/test/test_libffi.py
@@ -176,6 +176,15 @@
#
lltype.free(p, flavor='raw')
+ def test_windll(self):
+ if os.name != 'nt':
+ skip('Run only on windows')
+ from pypy.rlib.libffi import WinDLL
+ dll = WinDLL('Kernel32.dll')
+ sleep = dll.getpointer('Sleep',[types.uint], types.void)
+ chain = ArgChain()
+ chain.arg(10)
+ sleep.call(chain, lltype.Void, is_struct=False)
class TestLibffiCall(BaseFfiTest):
"""
@@ -220,9 +229,16 @@
eci = ExternalCompilationInfo(export_symbols=exports)
cls.libfoo_name = str(platform.compile([c_file], eci, 'x',
standalone=False))
+ cls.dll = cls.CDLL(cls.libfoo_name)
+
+ def teardown_class(cls):
+ if cls.dll:
+ cls.dll.__del__()
+ # Why doesn't this call cls.dll.__del__() ?
+ #del cls.dll
def get_libfoo(self):
- return self.CDLL(self.libfoo_name)
+ return self.dll
def call(self, funcspec, args, RESULT, is_struct=False, jitif=[]):
"""
@@ -262,6 +278,7 @@
func = (libfoo, 'diff_xy', [types.sint, types.signed], types.sint)
res = self.call(func, [50, 8], lltype.Signed)
assert res == 42
+
def test_simple(self):
"""
int sum_xy(int x, double y)
More information about the pypy-commit
mailing list