[pypy-svn] r75553 - in pypy/branch/sys-prefix/lib_pypy: . pypy_test
antocuni at codespeak.net
antocuni at codespeak.net
Thu Jun 24 11:57:36 CEST 2010
Author: antocuni
Date: Thu Jun 24 11:57:34 2010
New Revision: 75553
Modified:
pypy/branch/sys-prefix/lib_pypy/dbm.py (contents, props changed)
pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py
Log:
merge from trunk
r75210 | afa | 2010-06-08 18:51:44 +0200 (Tue, 08 Jun 2010) | 3 lines
Changed paths:
M /pypy/trunk/pypy/lib/dbm.py
A /pypy/trunk/pypy/lib/test2/test_dbm_extra.py
issue467 resolved: add checks to the dbm module,
avoids some segfaults
Modified: pypy/branch/sys-prefix/lib_pypy/dbm.py
==============================================================================
--- pypy/branch/sys-prefix/lib_pypy/dbm.py (original)
+++ pypy/branch/sys-prefix/lib_pypy/dbm.py Thu Jun 24 11:57:34 2010
@@ -1,4 +1,4 @@
-from ctypes import *
+from ctypes import Structure, c_char_p, c_int, c_void_p, CDLL
import ctypes.util
import os, sys
@@ -15,6 +15,11 @@
('dsize', c_int),
]
+ def __init__(self, text):
+ if not isinstance(text, str):
+ raise TypeError("datum: expected string, not %s" % type(text))
+ Structure.__init__(self, text, len(text))
+
class dbm(object):
def __init__(self, dbmobj):
self._aobj = dbmobj
@@ -42,9 +47,7 @@
def get(self, key, default=None):
if not self._aobj:
raise error('DBM object has already been closed')
- dat = datum()
- dat.dptr = c_char_p(key)
- dat.dsize = c_int(len(key))
+ dat = datum(key)
k = getattr(lib, funcs['fetch'])(self._aobj, dat)
if k.dptr:
return k.dptr[:k.dsize]
@@ -65,12 +68,8 @@
def __setitem__(self, key, value):
if not self._aobj:
raise error('DBM object has already been closed')
- dat = datum()
- dat.dptr = c_char_p(key)
- dat.dsize = c_int(len(key))
- data = datum()
- data.dptr = c_char_p(value)
- data.dsize = c_int(len(value))
+ dat = datum(key)
+ data = datum(value)
status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_REPLACE)
if getattr(lib, funcs['error'])(self._aobj):
getattr(lib, funcs['clearerr'])(self._aobj)
@@ -80,15 +79,11 @@
def setdefault(self, key, default=''):
if not self._aobj:
raise error('DBM object has already been closed')
- dat = datum()
- dat.dptr = c_char_p(key)
- dat.dsize = c_int(len(key))
+ dat = datum(key)
k = getattr(lib, funcs['fetch'])(self._aobj, dat)
if k.dptr:
return k.dptr[:k.dsize]
- data = datum()
- data.dptr = c_char_p(default)
- data.dsize = c_int(len(default))
+ data = datum(default)
status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_INSERT)
if status < 0:
getattr(lib, funcs['clearerr'])(self._aobj)
@@ -98,9 +93,7 @@
def has_key(self, key):
if not self._aobj:
raise error('DBM object has already been closed')
- dat = datum()
- dat.dptr = c_char_p(key)
- dat.dsize = c_int(len(key))
+ dat = datum(key)
k = getattr(lib, funcs['fetch'])(self._aobj, dat)
if k.dptr:
return True
@@ -109,9 +102,7 @@
def __delitem__(self, key):
if not self._aobj:
raise error('DBM object has already been closed')
- dat = datum()
- dat.dptr = c_char_p(key)
- dat.dsize = c_int(len(key))
+ dat = datum(key)
status = getattr(lib, funcs['delete'])(self._aobj, dat)
if status < 0:
raise KeyError(key)
@@ -146,7 +137,7 @@
library = "GNU gdbm"
funcs = {}
-_init_func('open', [c_char_p, c_int, c_int])
+_init_func('open', (c_char_p, c_int, c_int))
_init_func('close', restype=c_void_p)
_init_func('firstkey', restype=datum)
_init_func('nextkey', restype=datum)
@@ -160,6 +151,9 @@
def open(filename, flag='r', mode=0666):
"open a DBM database"
+ if not isinstance(filename, str):
+ raise TypeError("expected string")
+
openflag = 0
try:
@@ -177,3 +171,6 @@
if a_db == 0:
raise error("Could not open file %s.db" % filename)
return dbm(a_db)
+
+__all__ = ('datum', 'dbm', 'error', 'funcs', 'open', 'library')
+
Modified: pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py
==============================================================================
--- pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py (original)
+++ pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py Thu Jun 24 11:57:34 2010
@@ -44,3 +44,7 @@
d['xyz'] = '546'
assert dict(d) == {'xyz': '546'}
assert d['xyz'] == '546'
+
+def test_extra():
+ py.test.raises(TypeError, dbm.datum, 123)
+ py.test.raises(TypeError, dbm.datum, False)
More information about the Pypy-commit
mailing list