[pypy-commit] pypy default: Another fix for boolean values

amauryfa noreply at buildbot.pypy.org
Mon Jun 15 09:33:20 CEST 2015


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: 
Changeset: r78103:62653cade172
Date: 2015-06-14 23:57 +0200
http://bitbucket.org/pypy/pypy/changeset/62653cade172/

Log:	Another fix for boolean values

diff --git a/lib_pypy/_tkinter/tclobj.py b/lib_pypy/_tkinter/tclobj.py
--- a/lib_pypy/_tkinter/tclobj.py
+++ b/lib_pypy/_tkinter/tclobj.py
@@ -5,7 +5,8 @@
 
 class TypeCache(object):
     def __init__(self):
-        self.BooleanType = tklib.Tcl_GetObjType("boolean")
+        self.OldBooleanType = tklib.Tcl_GetObjType("boolean")
+        self.BooleanType = None
         self.ByteArrayType = tklib.Tcl_GetObjType("bytearray")
         self.DoubleType = tklib.Tcl_GetObjType("double")
         self.IntType = tklib.Tcl_GetObjType("int")
@@ -16,6 +17,11 @@
 
     def add_extra_types(self, app):
         # Some types are not registered in Tcl.
+        result = app.call('expr', 'true')
+        typePtr = AsObj(result).typePtr
+        if tkffi.string(typePtr.name) == "booleanString":
+            self.BooleanType = typePtr
+
         result = app.call('expr', '2**63')
         typePtr = AsObj(result).typePtr
         if tkffi.string(typePtr.name) == "bignum":
@@ -64,8 +70,12 @@
         buf = tkffi.buffer(value.bytes, value.length)
         return FromTclString(buf[:])
 
-    if value.typePtr == typeCache.BooleanType:
-        return bool(value.internalRep.longValue)
+    if value.typePtr in (typeCache.BooleanType, typeCache.OldBooleanType):
+        value_ptr = tkffi.new("int*")
+        if tklib.Tcl_GetBooleanFromObj(
+                app.interp, value, value_ptr) == tklib.TCL_ERROR:
+            app.raiseTclError()
+        return bool(value_ptr[0])
     if value.typePtr == typeCache.ByteArrayType:
         size = tkffi.new('int*')
         data = tklib.Tcl_GetByteArrayFromObj(value, size)
diff --git a/lib_pypy/_tkinter/tklib_build.py b/lib_pypy/_tkinter/tklib_build.py
--- a/lib_pypy/_tkinter/tklib_build.py
+++ b/lib_pypy/_tkinter/tklib_build.py
@@ -120,6 +120,7 @@
 int Tcl_GetBoolean(Tcl_Interp* interp, const char* src, int* boolPtr);
 int Tcl_GetInt(Tcl_Interp* interp, const char* src, int* intPtr);
 int Tcl_GetDouble(Tcl_Interp* interp, const char* src, double* doublePtr);
+int Tcl_GetBooleanFromObj(Tcl_Interp* interp, Tcl_Obj* objPtr, int* valuePtr);
 char *Tcl_GetString(Tcl_Obj* objPtr);
 char *Tcl_GetStringFromObj(Tcl_Obj* objPtr, int* lengthPtr);
 unsigned char *Tcl_GetByteArrayFromObj(Tcl_Obj* objPtr, int* lengthPtr);


More information about the pypy-commit mailing list