self.type = py_object_type
self.is_py_attr = 1
if not obj_type.is_pyobject and not obj_type.is_error:
- if obj_type.create_to_py_utility_code(env):
+ if obj_type.can_coerce_to_pyobject(env):
self.obj = self.obj.coerce_to_pyobject(env)
else:
error(self.pos,
if from_py and not to_py and self.operand.is_ephemeral() and not self.type.is_numeric:
error(self.pos, "Casting temporary Python object to non-numeric non-Python type")
if to_py and not from_py:
- if self.operand.type.create_to_py_utility_code(env):
+ if self.operand.type.can_coerce_to_pyobject(env):
self.result_ctype = py_object_type
self.operand = self.operand.coerce_to_pyobject(env)
else:
#
# Base class for all Pyrex types including pseudo-types.
+ def can_coerce_to_pyobject(self, env):
+ return False
+
def cast_code(self, expr_code):
return "((%s)%s)" % (self.declaration_code(""), expr_code)
def __repr__(self):
return "<PyObjectType>"
-
+
+ def can_coerce_to_pyobject(self, env):
+ return True
+
def assignable_from(self, src_type):
# except for pointers, conversion will be attempted
return not src_type.is_ptr or src_type.is_string
def create_from_py_utility_code(self, env):
return self.from_py_function is not None
-
+
+ def can_coerce_to_pyobject(self, env):
+ return self.create_to_py_utility_code(env)
+
def error_condition(self, result_code):
conds = []
if self.is_string: