Commit 7ab00c38 authored by Robert Bradshaw's avatar Robert Bradshaw

char* slices

parent 6be28864
...@@ -1977,7 +1977,9 @@ class SliceIndexNode(ExprNode): ...@@ -1977,7 +1977,9 @@ class SliceIndexNode(ExprNode):
self.start.analyse_types(env) self.start.analyse_types(env)
if self.stop: if self.stop:
self.stop.analyse_types(env) 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 # we need a ptr type here instead of an array type, as
# array types can result in invalid type casts in the C # array types can result in invalid type casts in the C
# code # code
...@@ -2000,13 +2002,31 @@ class SliceIndexNode(ExprNode): ...@@ -2000,13 +2002,31 @@ class SliceIndexNode(ExprNode):
error(self.pos, error(self.pos,
"Slicing is not currently supported for '%s'." % self.type) "Slicing is not currently supported for '%s'." % self.type)
return return
code.putln( if self.base.type.is_string:
"%s = PySequence_GetSlice(%s, %s, %s); %s" % ( if self.stop is None:
self.result(), code.putln(
self.base.py_result(), "%s = __Pyx_PyBytes_FromString(%s + %s); %s" % (
self.start_code(), self.result(),
self.stop_code(), self.base.result(),
code.error_goto_if_null(self.result(), self.pos))) 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()) code.put_gotref(self.py_result())
def generate_assignment_code(self, rhs, code): def generate_assignment_code(self, rhs, code):
...@@ -2042,7 +2062,7 @@ class SliceIndexNode(ExprNode): ...@@ -2042,7 +2062,7 @@ class SliceIndexNode(ExprNode):
rhs.free_temps(code) rhs.free_temps(code)
def generate_deletion_code(self, code): def generate_deletion_code(self, code):
if not self.type.is_pyobject: if not self.base.type.is_pyobject:
error(self.pos, error(self.pos,
"Deleting slices is only supported for Python types, not '%s'." % self.type) "Deleting slices is only supported for Python types, not '%s'." % self.type)
return return
......
...@@ -1365,11 +1365,13 @@ type_conversion_predeclarations = """ ...@@ -1365,11 +1365,13 @@ type_conversion_predeclarations = """
/* Type Conversion Predeclarations */ /* Type Conversion Predeclarations */
#if PY_MAJOR_VERSION < 3 #if PY_MAJOR_VERSION < 3
#define __Pyx_PyBytes_FromString PyString_FromString #define __Pyx_PyBytes_FromString PyString_FromString
#define __Pyx_PyBytes_AsString PyString_AsString #define __Pyx_PyBytes_FromStringAndSize PyString_FromStringAndSize
#define __Pyx_PyBytes_AsString PyString_AsString
#else #else
#define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromString PyBytes_FromString
#define __Pyx_PyBytes_AsString PyBytes_AsString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
#define __Pyx_PyBytes_AsString PyBytes_AsString
#endif #endif
#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
......
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