[pypy-svn] r78225 - in pypy/trunk/pypy: module/_winreg rpython/lltypesystem
afa at codespeak.net
afa at codespeak.net
Fri Oct 22 20:14:22 CEST 2010
Author: afa
Date: Fri Oct 22 20:14:21 2010
New Revision: 78225
Modified:
pypy/trunk/pypy/module/_winreg/interp_winreg.py
pypy/trunk/pypy/rpython/lltypesystem/rffi.py
Log:
Start using the "with" statement to manage temporary allocations.
Only the _winreg module for now... it's now 60 lines shorter!
Modified: pypy/trunk/pypy/module/_winreg/interp_winreg.py
==============================================================================
--- pypy/trunk/pypy/module/_winreg/interp_winreg.py (original)
+++ pypy/trunk/pypy/module/_winreg/interp_winreg.py Fri Oct 22 20:14:21 2010
@@ -212,13 +212,10 @@
subkey = None
else:
subkey = space.str_w(w_subkey)
- dataptr = rffi.str2charp(value)
- try:
+ with rffi.scoped_str2charp(value) as dataptr:
ret = rwinreg.RegSetValue(hkey, subkey, rwinreg.REG_SZ, dataptr, len(value))
- finally:
- rffi.free_charp(dataptr)
- if ret != 0:
- raiseWindowsError(space, ret, 'RegSetValue')
+ if ret != 0:
+ raiseWindowsError(space, ret, 'RegSetValue')
SetValue.unwrap_spec = [ObjSpace, W_Root, W_Root, int, str]
def QueryValue(space, w_hkey, w_subkey):
@@ -237,23 +234,15 @@
subkey = None
else:
subkey = space.str_w(w_subkey)
- bufsize_p = lltype.malloc(rwin32.PLONG.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwin32.PLONG.TO, 1) as bufsize_p:
ret = rwinreg.RegQueryValue(hkey, subkey, None, bufsize_p)
if ret != 0:
raiseWindowsError(space, ret, 'RegQueryValue')
- buf = lltype.malloc(rffi.CCHARP.TO, bufsize_p[0], flavor='raw')
- try:
+ with lltype.scoped_alloc(rffi.CCHARP.TO, bufsize_p[0]) as buf:
ret = rwinreg.RegQueryValue(hkey, subkey, buf, bufsize_p)
if ret != 0:
raiseWindowsError(space, ret, 'RegQueryValue')
return space.wrap(rffi.charp2strn(buf, bufsize_p[0] - 1))
- finally:
- lltype.free(buf, flavor='raw')
- finally:
- lltype.free(bufsize_p, flavor='raw')
- if ret != 0:
- raiseWindowsError(space, ret, 'RegQueryValue')
QueryValue.unwrap_spec = [ObjSpace, W_Root, W_Root]
def convert_to_regdata(space, w_value, typ):
@@ -412,16 +401,14 @@
value_name is a string indicating the value to query"""
hkey = hkey_w(w_hkey, space)
null_dword = lltype.nullptr(rwin32.LPDWORD.TO)
- retDataSize = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as retDataSize:
ret = rwinreg.RegQueryValueEx(hkey, subkey, null_dword, null_dword,
None, retDataSize)
if ret != 0:
raiseWindowsError(space, ret, 'RegQueryValueEx')
- databuf = lltype.malloc(rffi.CCHARP.TO, retDataSize[0], flavor='raw')
- try:
- retType = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
+
+ with lltype.scoped_alloc(rffi.CCHARP.TO, retDataSize[0]) as databuf:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as retType:
ret = rwinreg.RegQueryValueEx(hkey, subkey, null_dword,
retType, databuf, retDataSize)
@@ -432,12 +419,6 @@
retDataSize[0], retType[0]),
space.wrap(retType[0]),
])
- finally:
- lltype.free(retType, flavor='raw')
- finally:
- lltype.free(databuf, flavor='raw')
- finally:
- lltype.free(retDataSize, flavor='raw')
QueryValueEx.unwrap_spec = [ObjSpace, W_Root, str]
@@ -454,14 +435,11 @@
The return value is the handle of the opened key.
If the function fails, an exception is raised."""
hkey = hkey_w(w_hkey, space)
- rethkey = lltype.malloc(rwinreg.PHKEY.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwinreg.PHKEY.TO, 1) as rethkey:
ret = rwinreg.RegCreateKey(hkey, subkey, rethkey)
if ret != 0:
raiseWindowsError(space, ret, 'CreateKey')
return space.wrap(W_HKEY(rethkey[0]))
- finally:
- lltype.free(rethkey, flavor='raw')
CreateKey.unwrap_spec = [ObjSpace, W_Root, str]
def DeleteKey(space, w_hkey, subkey):
@@ -504,14 +482,11 @@
The result is a new handle to the specified key
If the function fails, an EnvironmentError exception is raised."""
hkey = hkey_w(w_hkey, space)
- rethkey = lltype.malloc(rwinreg.PHKEY.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwinreg.PHKEY.TO, 1) as rethkey:
ret = rwinreg.RegOpenKeyEx(hkey, subkey, res, sam, rethkey)
if ret != 0:
raiseWindowsError(space, ret, 'RegOpenKeyEx')
return space.wrap(W_HKEY(rethkey[0]))
- finally:
- lltype.free(rethkey, flavor='raw')
OpenKey.unwrap_spec = [ObjSpace, W_Root, str, int, rffi.r_uint]
def EnumValue(space, w_hkey, index):
@@ -531,10 +506,8 @@
hkey = hkey_w(w_hkey, space)
null_dword = lltype.nullptr(rwin32.LPDWORD.TO)
- retValueSize = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
- retDataSize = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as retValueSize:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as retDataSize:
ret = rwinreg.RegQueryInfoKey(
hkey, None, null_dword, null_dword,
null_dword, null_dword, null_dword,
@@ -546,14 +519,9 @@
retValueSize[0] += 1
retDataSize[0] += 1
- valuebuf = lltype.malloc(rffi.CCHARP.TO, retValueSize[0],
- flavor='raw')
- try:
- databuf = lltype.malloc(rffi.CCHARP.TO, retDataSize[0],
- flavor='raw')
- try:
- retType = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rffi.CCHARP.TO, retValueSize[0]) as valuebuf:
+ with lltype.scoped_alloc(rffi.CCHARP.TO, retDataSize[0]) as databuf:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as retType:
ret = rwinreg.RegEnumValue(
hkey, index, valuebuf, retValueSize,
null_dword, retType, databuf, retDataSize)
@@ -566,16 +534,6 @@
retDataSize[0], retType[0]),
space.wrap(retType[0]),
])
- finally:
- lltype.free(retType, flavor='raw')
- finally:
- lltype.free(databuf, flavor='raw')
- finally:
- lltype.free(valuebuf, flavor='raw')
- finally:
- lltype.free(retDataSize, flavor='raw')
- finally:
- lltype.free(retValueSize, flavor='raw')
EnumValue.unwrap_spec = [ObjSpace, W_Root, int]
@@ -592,10 +550,8 @@
null_dword = lltype.nullptr(rwin32.LPDWORD.TO)
# max key name length is 255
- buf = lltype.malloc(rffi.CCHARP.TO, 256, flavor='raw')
- try:
- retValueSize = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rffi.CCHARP.TO, 256) as buf:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as retValueSize:
retValueSize[0] = 256 # includes NULL terminator
ret = rwinreg.RegEnumKeyEx(hkey, index, buf, retValueSize,
null_dword, None, null_dword,
@@ -603,10 +559,6 @@
if ret != 0:
raiseWindowsError(space, ret, 'RegEnumKeyEx')
return space.wrap(rffi.charp2str(buf))
- finally:
- lltype.free(retValueSize, flavor='raw')
- finally:
- lltype.free(buf, flavor='raw')
EnumKey.unwrap_spec = [ObjSpace, W_Root, int]
@@ -621,12 +573,9 @@
A long integer that identifies when the key was last modified (if available)
as 100's of nanoseconds since Jan 1, 1600."""
hkey = hkey_w(w_hkey, space)
- nSubKeys = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
- nValues = lltype.malloc(rwin32.LPDWORD.TO, 1, flavor='raw')
- try:
- ft = lltype.malloc(rwin32.PFILETIME.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as nSubKeys:
+ with lltype.scoped_alloc(rwin32.LPDWORD.TO, 1) as nValues:
+ with lltype.scoped_alloc(rwin32.PFILETIME.TO, 1) as ft:
null_dword = lltype.nullptr(rwin32.LPDWORD.TO)
ret = rwinreg.RegQueryInfoKey(
hkey, None, null_dword, null_dword,
@@ -640,12 +589,6 @@
return space.newtuple([space.wrap(nSubKeys[0]),
space.wrap(nValues[0]),
space.wrap(l)])
- finally:
- lltype.free(ft, flavor='raw')
- finally:
- lltype.free(nValues, flavor='raw')
- finally:
- lltype.free(nSubKeys, flavor='raw')
QueryInfoKey.unwrap_spec = [ObjSpace, W_Root]
def str_or_None_w(space, w_obj):
@@ -666,12 +609,9 @@
If the function fails, an EnvironmentError exception is raised."""
machine = str_or_None_w(space, w_machine)
hkey = hkey_w(w_hkey, space)
- rethkey = lltype.malloc(rwinreg.PHKEY.TO, 1, flavor='raw')
- try:
+ with lltype.scoped_alloc(rwinreg.PHKEY.TO, 1) as rethkey:
ret = rwinreg.RegConnectRegistry(machine, hkey, rethkey)
if ret != 0:
raiseWindowsError(space, ret, 'RegConnectRegistry')
return space.wrap(W_HKEY(rethkey[0]))
- finally:
- lltype.free(rethkey, flavor='raw')
ConnectRegistry.unwrap_spec = [ObjSpace, W_Root, W_Root]
Modified: pypy/trunk/pypy/rpython/lltypesystem/rffi.py
==============================================================================
--- pypy/trunk/pypy/rpython/lltypesystem/rffi.py (original)
+++ pypy/trunk/pypy/rpython/lltypesystem/rffi.py Fri Oct 22 20:14:21 2010
@@ -933,3 +933,11 @@
"""
return cast(lltype.Signed, getattr(pdst, fieldname))
getintfield._annspecialcase_ = 'specialize:ll_and_arg(1)'
+
+class scoped_str2charp:
+ def __init__(self, value):
+ self.buf = str2charp(value)
+ def __enter__(self):
+ return self.buf
+ def __exit__(self, *args):
+ free_charp(self.buf)
More information about the Pypy-commit
mailing list