From 7ab00c38d3577eb283da1c01c418d76ac776b302 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Thu, 15 Jan 2009 01:46:39 -0800 Subject: [PATCH] char* slices --- Cython/Compiler/ExprNodes.py | 38 ++++++++++++++++++++++++++--------- Cython/Compiler/PyrexTypes.py | 10 +++++---- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index b6e76d31..58a76246 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -1977,7 +1977,9 @@ class SliceIndexNode(ExprNode): self.start.analyse_types(env) if self.stop: self.stop.analyse_types(env) - if self.base.type.is_array or self.base.type.is_ptr: + if self.base.type.is_string: + self.type = py_object_type + elif self.base.type.is_array or self.base.type.is_ptr: # we need a ptr type here instead of an array type, as # array types can result in invalid type casts in the C # code @@ -2000,13 +2002,31 @@ class SliceIndexNode(ExprNode): error(self.pos, "Slicing is not currently supported for '%s'." % self.type) return - code.putln( - "%s = PySequence_GetSlice(%s, %s, %s); %s" % ( - self.result(), - self.base.py_result(), - self.start_code(), - self.stop_code(), - code.error_goto_if_null(self.result(), self.pos))) + if self.base.type.is_string: + if self.stop is None: + code.putln( + "%s = __Pyx_PyBytes_FromString(%s + %s); %s" % ( + self.result(), + self.base.result(), + self.start_code(), + code.error_goto_if_null(self.result(), self.pos))) + else: + code.putln( + "%s = __Pyx_PyBytes_FromStringAndSize(%s + %s, %s - %s); %s" % ( + self.result(), + self.base.result(), + self.start_code(), + self.stop_code(), + self.start_code(), + code.error_goto_if_null(self.result(), self.pos))) + else: + code.putln( + "%s = PySequence_GetSlice(%s, %s, %s); %s" % ( + self.result(), + self.base.py_result(), + self.start_code(), + self.stop_code(), + code.error_goto_if_null(self.result(), self.pos))) code.put_gotref(self.py_result()) def generate_assignment_code(self, rhs, code): @@ -2042,7 +2062,7 @@ class SliceIndexNode(ExprNode): rhs.free_temps(code) def generate_deletion_code(self, code): - if not self.type.is_pyobject: + if not self.base.type.is_pyobject: error(self.pos, "Deleting slices is only supported for Python types, not '%s'." % self.type) return diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index 47ab9c3d..3c3dce07 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -1365,11 +1365,13 @@ type_conversion_predeclarations = """ /* Type Conversion Predeclarations */ #if PY_MAJOR_VERSION < 3 -#define __Pyx_PyBytes_FromString PyString_FromString -#define __Pyx_PyBytes_AsString PyString_AsString +#define __Pyx_PyBytes_FromString PyString_FromString +#define __Pyx_PyBytes_FromStringAndSize PyString_FromStringAndSize +#define __Pyx_PyBytes_AsString PyString_AsString #else -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_AsString PyBytes_AsString +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +#define __Pyx_PyBytes_AsString PyBytes_AsString #endif #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) -- 2.26.2