Skip to content

Commit

Permalink
Merge pull request #1419 from corona10/string_opt
Browse files Browse the repository at this point in the history
Micro optimizations for string operations.
  • Loading branch information
undingen authored Jan 31, 2017
2 parents 88fd8bf + 1f53abd commit 79509a1
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/runtime/str.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1935,6 +1935,14 @@ Box* strRStrip(BoxedString* self, Box* chars) {

Box* strCapitalize(BoxedString* self) {
assert(PyString_Check(self));
int length = self->s().size();
if (length == 0)
return incref(EmptyString);

if (length == 1) {
char c = std::toupper(self->data()[0]);
return incref(characters[c & UCHAR_MAX]);
}

std::string s(self->s());

Expand Down Expand Up @@ -2003,6 +2011,14 @@ Box* strTranslate(BoxedString* self, BoxedString* table, BoxedString* delete_cha

Box* strLower(BoxedString* self) {
assert(PyString_Check(self));
int length = self->s().size();
if (length == 0)
return incref(EmptyString);

if (length == 1) {
char c = std::tolower(self->data()[0]);
return incref(characters[c & UCHAR_MAX]);
}

BoxedString* rtn = new (self->size()) BoxedString(self->s());
for (int i = 0; i < rtn->size(); i++)
Expand All @@ -2012,6 +2028,15 @@ Box* strLower(BoxedString* self) {

Box* strUpper(BoxedString* self) {
assert(PyString_Check(self));
int length = self->s().size();
if (length == 0)
return incref(EmptyString);

if (length == 1) {
char c = std::toupper(self->data()[0]);
return incref(characters[c & UCHAR_MAX]);
}

BoxedString* rtn = new (self->size()) BoxedString(self->s());
for (int i = 0; i < rtn->size(); i++)
rtn->data()[i] = std::toupper(rtn->data()[i]);
Expand All @@ -2020,6 +2045,10 @@ Box* strUpper(BoxedString* self) {

Box* strSwapcase(BoxedString* self) {
assert(PyString_Check(self));
int length = self->s().size();
if (length == 0)
return incref(EmptyString);

BoxedString* rtn = new (self->size()) BoxedString(self->s());
for (int i = 0; i < rtn->size(); i++) {
char c = rtn->data()[i];
Expand Down

0 comments on commit 79509a1

Please sign in to comment.