Commit d42a4d7d authored by Stefan Behnel's avatar Stefan Behnel

Merge branch 'master' of git+ssh://github.com/cython/cython

parents 192ac73e e57009a3
...@@ -472,19 +472,21 @@ class UtilityCode(UtilityCodeBase): ...@@ -472,19 +472,21 @@ class UtilityCode(UtilityCodeBase):
for dependency in self.requires: for dependency in self.requires:
output.use_utility_code(dependency) output.use_utility_code(dependency)
if self.proto: if self.proto:
output[self.proto_block].put_or_include( writer = output[self.proto_block]
self.format_code(self.proto), writer.putln("/* %s.proto */" % self.name)
'%s_proto' % self.name) writer.put_or_include(
self.format_code(self.proto), '%s_proto' % self.name)
if self.impl: if self.impl:
impl = self.format_code(self.wrap_c_strings(self.impl)) impl = self.format_code(self.wrap_c_strings(self.impl))
is_specialised1, impl = self.inject_string_constants(impl, output) is_specialised1, impl = self.inject_string_constants(impl, output)
is_specialised2, impl = self.inject_unbound_methods(impl, output) is_specialised2, impl = self.inject_unbound_methods(impl, output)
writer = output['utility_code_def']
writer.putln("/* %s */" % self.name);
if not (is_specialised1 or is_specialised2): if not (is_specialised1 or is_specialised2):
# no module specific adaptations => can be reused # no module specific adaptations => can be reused
output['utility_code_def'].put_or_include( writer.put_or_include(impl, '%s_impl' % self.name)
impl, '%s_impl' % self.name)
else: else:
output['utility_code_def'].put(impl) writer.put(impl)
if self.init: if self.init:
writer = output['init_globals'] writer = output['init_globals']
writer.putln("/* %s.init */" % self.name) writer.putln("/* %s.init */" % self.name)
...@@ -496,6 +498,7 @@ class UtilityCode(UtilityCodeBase): ...@@ -496,6 +498,7 @@ class UtilityCode(UtilityCodeBase):
writer.putln() writer.putln()
if self.cleanup and Options.generate_cleanup_code: if self.cleanup and Options.generate_cleanup_code:
writer = output['cleanup_globals'] writer = output['cleanup_globals']
writer.putln("/* %s.cleanup */" % self.name)
if isinstance(self.cleanup, basestring): if isinstance(self.cleanup, basestring):
writer.put_or_include( writer.put_or_include(
self.format_code(self.cleanup), self.format_code(self.cleanup),
......
...@@ -2051,14 +2051,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -2051,14 +2051,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
PyrexTypes.typecast(entry.type, py_object_type, "o"))) PyrexTypes.typecast(entry.type, py_object_type, "o")))
elif entry.type.create_from_py_utility_code(env): elif entry.type.create_from_py_utility_code(env):
# if available, utility code was already created in self.prepare_utility_code() # if available, utility code was already created in self.prepare_utility_code()
rhs = "%s(o)" % entry.type.from_py_function code.putln(entry.type.from_py_call_code(
if entry.type.is_enum: 'o', entry.cname, entry.pos, code))
rhs = PyrexTypes.typecast(entry.type, PyrexTypes.c_long_type, rhs)
code.putln("%s = %s; if (%s) %s;" % (
entry.cname,
rhs,
entry.type.error_condition(entry.cname),
code.error_goto(entry.pos)))
else: else:
code.putln('PyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");' % ( code.putln('PyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");' % (
name, entry.type)) name, entry.type))
......
...@@ -830,6 +830,14 @@ class MemoryViewSliceType(PyrexType): ...@@ -830,6 +830,14 @@ class MemoryViewSliceType(PyrexType):
self.from_py_function = funcname self.from_py_function = funcname
return True return True
def from_py_call_code(self, source_code, result_code, error_pos, code,
from_py_function=None, error_condition=None):
return '%s = %s(%s); %s' % (
result_code,
from_py_function or self.from_py_function,
source_code,
code.error_goto_if(error_condition or self.error_condition(result_code), error_pos))
def create_to_py_utility_code(self, env): def create_to_py_utility_code(self, env):
self._dtype_to_py_func, self._dtype_from_py_func = self.dtype_object_conversion_funcs(env) self._dtype_to_py_func, self._dtype_from_py_func = self.dtype_object_conversion_funcs(env)
return True return True
......
...@@ -159,6 +159,11 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { ...@@ -159,6 +159,11 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) {
static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj,
__Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts);
static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
__Pyx_BufFmt_StackElem* stack,
__Pyx_TypeInfo* type); // PROTO
/////////////// BufferFormatCheck /////////////// /////////////// BufferFormatCheck ///////////////
static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { static CYTHON_INLINE int __Pyx_IsLittleEndian(void) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment