[pypy-svn] r50954 - pypy/dist/pypy/module/struct

fijal at codespeak.net fijal at codespeak.net
Thu Jan 24 11:51:31 CET 2008


Author: fijal
Date: Thu Jan 24 11:51:30 2008
New Revision: 50954

Modified:
   pypy/dist/pypy/module/struct/nativefmttable.py
Log:
Use single buffer instead of allocating one per-cast. (I want to have
cast_int_to_float operation anyway)


Modified: pypy/dist/pypy/module/struct/nativefmttable.py
==============================================================================
--- pypy/dist/pypy/module/struct/nativefmttable.py	(original)
+++ pypy/dist/pypy/module/struct/nativefmttable.py	Thu Jan 24 11:51:30 2008
@@ -16,51 +16,38 @@
 
 # ____________________________________________________________
 
+double_buf = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw', immortal=True)
+float_buf = lltype.malloc(rffi.FLOATP.TO, 1, flavor='raw', immortal=True)
+
 def pack_double(fmtiter):
     doubleval = fmtiter.accept_float_arg()
-    buf = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw')
-    try:
-        buf[0] = doubleval
-        p = rffi.cast(rffi.CCHARP, buf)
-        for i in range(sizeof_double):
-            fmtiter.result.append(p[i])
-    finally:
-        lltype.free(buf, flavor='raw')
+    double_buf[0] = doubleval
+    p = rffi.cast(rffi.CCHARP, double_buf)
+    for i in range(sizeof_double):
+        fmtiter.result.append(p[i])
 
 def unpack_double(fmtiter):
     input = fmtiter.read(sizeof_double)
-    buf = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw')
-    try:
-        p = rffi.cast(rffi.CCHARP, buf)
-        for i in range(sizeof_double):
-            p[i] = input[i]
-        doubleval = buf[0]
-    finally:
-        lltype.free(buf, flavor='raw')
+    p = rffi.cast(rffi.CCHARP, double_buf)
+    for i in range(sizeof_double):
+        p[i] = input[i]
+    doubleval = double_buf[0]
     fmtiter.appendobj(doubleval)
 
 def pack_float(fmtiter):
     doubleval = fmtiter.accept_float_arg()
     floatval = r_singlefloat(doubleval)
-    buf = lltype.malloc(rffi.FLOATP.TO, 1, flavor='raw')
-    try:
-        buf[0] = floatval
-        p = rffi.cast(rffi.CCHARP, buf)
-        for i in range(sizeof_float):
-            fmtiter.result.append(p[i])
-    finally:
-        lltype.free(buf, flavor='raw')
+    float_buf[0] = floatval
+    p = rffi.cast(rffi.CCHARP, float_buf)
+    for i in range(sizeof_float):
+        fmtiter.result.append(p[i])
 
 def unpack_float(fmtiter):
     input = fmtiter.read(sizeof_float)
-    buf = lltype.malloc(rffi.FLOATP.TO, 1, flavor='raw')
-    try:
-        p = rffi.cast(rffi.CCHARP, buf)
-        for i in range(sizeof_float):
-            p[i] = input[i]
-        floatval = buf[0]
-    finally:
-        lltype.free(buf, flavor='raw')
+    p = rffi.cast(rffi.CCHARP, float_buf)
+    for i in range(sizeof_float):
+        p[i] = input[i]
+    floatval = float_buf[0]
     doubleval = float(floatval)
     fmtiter.appendobj(doubleval)
 



More information about the Pypy-commit mailing list