Lisandro Dalcin, 17.02.2011 17:24:
On 17 February 2011 12:16, Stefan Behnel wrote:
Lisandro Dalcin, 17.02.2011 15:32:

Stefan, what do you think about the patch below? This hunk is part of
a series of fixes required to get numpy-dev working under Python 3.2.
The root of the issue is that __cythonbufferdefaults__ keys&values
end-up being "bytes" (this coercion is triggered in Interpreter.py).


diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 5b339da..b72deef 100755
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -12,6 +12,7 @@ cython.declare(error=object, warning=object,
warn_once=object,
                 Builtin=object, Symtab=object, Utils=object,
find_coercion_error
                 debug_disposal_code=object, debug_temp_alloc=object,
debug_coerc

+import sys
  import operator

  from Errors import error, warning, warn_once, InternalError, CompileError
@@ -1136,6 +1137,8 @@ class StringNode(PyConstNode):
          return self.result_code

      def compile_time_value(self, env):
+        if sys.version_info[0]>= 3 and self.unicode_value:

You must use "self.unicode_value is not None" here, it may be the empty
string.

+            return self.unicode_value
          return self.value

Ok, that's a tricky one. Just because the compilation is running in Py3
doesn't mean that the correct compile time value is a Unicode string - we
don't know what it'll be used for.

OK, I've found an alternative workaround. What do you think?

diff --git a/Cython/Compiler/Interpreter.py b/Cython/Compiler/Interpreter.py
index 83cb184..9fb5fe5 100644
--- a/Cython/Compiler/Interpreter.py
+++ b/Cython/Compiler/Interpreter.py
@@ -6,6 +6,7 @@ For now this only covers parse tree to value conversion of
  compile-time values.
  """

+import sys
  from Nodes import *
  from ExprNodes import *
  from Errors import CompileError
@@ -44,6 +45,10 @@ def interpret_compiletime_options(optlist, optdict,
type_env=None, type_args=())
              else:
                  raise CompileError(node.pos, "Type not allowed here.")
          else:
+            if (sys.version_info[0]>=3 and
+                isinstance(node, StringNode) and
+                node.unicode_value is not None):
+                return (node.unicode_value, node.pos)
              return (node.compile_time_value(empty_scope), node.pos)

      if optlist:
@@ -52,6 +57,7 @@ def interpret_compiletime_options(optlist, optdict,
type_env=None, type_args=())
          assert isinstance(optdict, DictNode)
          new_optdict = {}
          for item in optdict.key_value_pairs:
-            new_optdict[item.key.value] = interpret(item.value, item.key.value)
+            new_key, dummy = interpret(item.key, None)
+            new_optdict[new_key] = interpret(item.value, item.key.value)
          optdict = new_optdict
      return (optlist, new_optdict)

This still isn't something that looks right. It just does the same thing at a different place. Actually, I'm not sure there is a way to "get it right".


Doing the above will do the wrong thing
e.g. in this case:

    DEF const_x = "abc"
    cdef str x = const_x

The problem is: it is broken already, returning self.value is wrong because
it drops available type information by returning plain bytes instead of str.
And simply returning self.unicode_value in Py3 doesn't fix that.

I see... So the correct compile time value for StringNode should
depend on options.language_level, right?

Hmmm. I'm not sure that would solve it. Py2 str has the property of changing type depending on the runtime environment. So this is actually independent of the language_level (-3 has easy semantics here).

I mean, it won't even solve the problem at hand, because the code could still be Py2 but require a unicode string value because it gets *compiled* under Python 3. It shouldn't depend on the compile time environment at all, but the NumPy problem shows that it has to sometimes.

I think we have to find a way to keep the double bytes/unicode string identity alive during runtime processing, up to the point where we can (or have to) decide what to make of it.

Stefan
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to