Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
Pyston
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
Pyston
Commits
6f24ad0f
Commit
6f24ad0f
authored
Jun 30, 2015
by
Kevin Modzelewski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Try to use the fast _Check calls
parent
352fdb6c
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
60 additions
and
62 deletions
+60
-62
src/runtime/objmodel.cpp
src/runtime/objmodel.cpp
+0
-2
src/runtime/str.cpp
src/runtime/str.cpp
+60
-60
No files found.
src/runtime/objmodel.cpp
View file @
6f24ad0f
...
@@ -231,9 +231,7 @@ extern "C" void my_assert(bool b) {
...
@@ -231,9 +231,7 @@ extern "C" void my_assert(bool b) {
}
}
extern
"C"
bool
isSubclass
(
BoxedClass
*
child
,
BoxedClass
*
parent
)
{
extern
"C"
bool
isSubclass
(
BoxedClass
*
child
,
BoxedClass
*
parent
)
{
#if EXPENSIVE_STAT_TIMERS
STAT_TIMER
(
t0
,
"us_timer_isSubclass"
,
10
);
STAT_TIMER
(
t0
,
"us_timer_isSubclass"
,
10
);
#endif
return
PyType_IsSubtype
(
child
,
parent
);
return
PyType_IsSubtype
(
child
,
parent
);
}
}
...
...
src/runtime/str.cpp
View file @
6f24ad0f
...
@@ -329,7 +329,7 @@ extern "C" PyObject* PyString_FromFormat(const char* format, ...) noexcept {
...
@@ -329,7 +329,7 @@ extern "C" PyObject* PyString_FromFormat(const char* format, ...) noexcept {
}
}
extern
"C"
Box
*
strAdd
(
BoxedString
*
lhs
,
Box
*
_rhs
)
{
extern
"C"
Box
*
strAdd
(
BoxedString
*
lhs
,
Box
*
_rhs
)
{
assert
(
isSubclass
(
lhs
->
cls
,
str_cl
s
));
assert
(
PyString_Check
(
lh
s
));
if
(
isSubclass
(
_rhs
->
cls
,
unicode_cls
))
{
if
(
isSubclass
(
_rhs
->
cls
,
unicode_cls
))
{
Box
*
rtn
=
PyUnicode_Concat
(
lhs
,
_rhs
);
Box
*
rtn
=
PyUnicode_Concat
(
lhs
,
_rhs
);
...
@@ -337,7 +337,7 @@ extern "C" Box* strAdd(BoxedString* lhs, Box* _rhs) {
...
@@ -337,7 +337,7 @@ extern "C" Box* strAdd(BoxedString* lhs, Box* _rhs) {
return
rtn
;
return
rtn
;
}
}
if
(
!
isSubclass
(
_rhs
->
cls
,
str_cl
s
))
{
if
(
!
PyString_Check
(
_rh
s
))
{
// Note: this is deliberately not returning NotImplemented, even though
// Note: this is deliberately not returning NotImplemented, even though
// that would be more usual. I assume this behavior of CPython's is
// that would be more usual. I assume this behavior of CPython's is
// for backwards compatibility.
// for backwards compatibility.
...
@@ -1140,7 +1140,7 @@ extern "C" Box* strMod(BoxedString* lhs, Box* rhs) {
...
@@ -1140,7 +1140,7 @@ extern "C" Box* strMod(BoxedString* lhs, Box* rhs) {
}
}
extern
"C"
Box
*
strMul
(
BoxedString
*
lhs
,
Box
*
rhs
)
{
extern
"C"
Box
*
strMul
(
BoxedString
*
lhs
,
Box
*
rhs
)
{
assert
(
isSubclass
(
lhs
->
cls
,
str_cl
s
));
assert
(
PyString_Check
(
lh
s
));
int
n
;
int
n
;
if
(
isSubclass
(
rhs
->
cls
,
int_cls
))
if
(
isSubclass
(
rhs
->
cls
,
int_cls
))
...
@@ -1160,7 +1160,7 @@ extern "C" Box* strMul(BoxedString* lhs, Box* rhs) {
...
@@ -1160,7 +1160,7 @@ extern "C" Box* strMul(BoxedString* lhs, Box* rhs) {
}
}
Box
*
str_richcompare
(
Box
*
lhs
,
Box
*
rhs
,
int
op
)
{
Box
*
str_richcompare
(
Box
*
lhs
,
Box
*
rhs
,
int
op
)
{
assert
(
isSubclass
(
lhs
->
cls
,
str_cl
s
));
assert
(
PyString_Check
(
lh
s
));
// Note: it is somehow about 50% faster to do this check inside the switch
// Note: it is somehow about 50% faster to do this check inside the switch
// statement, rather than out here. It's functionally equivalent but the
// statement, rather than out here. It's functionally equivalent but the
...
@@ -1206,7 +1206,7 @@ Box* str_richcompare(Box* lhs, Box* rhs, int op) {
...
@@ -1206,7 +1206,7 @@ Box* str_richcompare(Box* lhs, Box* rhs, int op) {
#define JUST_CENTER 2
#define JUST_CENTER 2
static
Box
*
pad
(
BoxedString
*
self
,
Box
*
width
,
Box
*
fillchar
,
int
justType
)
{
static
Box
*
pad
(
BoxedString
*
self
,
Box
*
width
,
Box
*
fillchar
,
int
justType
)
{
assert
(
width
->
cls
==
int_cls
);
assert
(
width
->
cls
==
int_cls
);
assert
(
isSubclass
(
fillchar
->
cls
,
str_cls
));
assert
(
PyString_Check
(
fillchar
));
assert
(
static_cast
<
BoxedString
*>
(
fillchar
)
->
size
()
==
1
);
assert
(
static_cast
<
BoxedString
*>
(
fillchar
)
->
size
()
==
1
);
int64_t
curWidth
=
self
->
size
();
int64_t
curWidth
=
self
->
size
();
int64_t
targetWidth
=
static_cast
<
BoxedInt
*>
(
width
)
->
n
;
int64_t
targetWidth
=
static_cast
<
BoxedInt
*>
(
width
)
->
n
;
...
@@ -1255,13 +1255,13 @@ extern "C" Box* strCenter(BoxedString* lhs, Box* width, Box* fillchar) {
...
@@ -1255,13 +1255,13 @@ extern "C" Box* strCenter(BoxedString* lhs, Box* width, Box* fillchar) {
}
}
extern
"C"
Box
*
strLen
(
BoxedString
*
self
)
{
extern
"C"
Box
*
strLen
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
return
boxInt
(
self
->
size
());
return
boxInt
(
self
->
size
());
}
}
extern
"C"
Box
*
strStr
(
BoxedString
*
self
)
{
extern
"C"
Box
*
strStr
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
if
(
self
->
cls
==
str_cls
)
if
(
self
->
cls
==
str_cls
)
return
self
;
return
self
;
...
@@ -1290,7 +1290,7 @@ static char _hex[17] = "0123456789abcdef"; // really only needs to be 16 but cla
...
@@ -1290,7 +1290,7 @@ static char _hex[17] = "0123456789abcdef"; // really only needs to be 16 but cla
extern
"C"
PyObject
*
PyString_Repr
(
PyObject
*
obj
,
int
smartquotes
)
noexcept
{
extern
"C"
PyObject
*
PyString_Repr
(
PyObject
*
obj
,
int
smartquotes
)
noexcept
{
BoxedString
*
self
=
(
BoxedString
*
)
obj
;
BoxedString
*
self
=
(
BoxedString
*
)
obj
;
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
std
::
ostringstream
os
(
""
);
std
::
ostringstream
os
(
""
);
...
@@ -1534,14 +1534,14 @@ extern "C" size_t unicodeHashUnboxed(PyUnicodeObject* self) {
...
@@ -1534,14 +1534,14 @@ extern "C" size_t unicodeHashUnboxed(PyUnicodeObject* self) {
}
}
extern
"C"
Box
*
strHash
(
BoxedString
*
self
)
{
extern
"C"
Box
*
strHash
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
StringHash
<
char
>
H
;
StringHash
<
char
>
H
;
return
boxInt
(
H
(
self
->
data
(),
self
->
size
()));
return
boxInt
(
H
(
self
->
data
(),
self
->
size
()));
}
}
extern
"C"
Box
*
strNonzero
(
BoxedString
*
self
)
{
extern
"C"
Box
*
strNonzero
(
BoxedString
*
self
)
{
ASSERT
(
isSubclass
(
self
->
cls
,
str_cls
),
"%s"
,
self
->
cls
->
tp_name
);
ASSERT
(
PyString_Check
(
self
),
"%s"
,
self
->
cls
->
tp_name
);
return
boxBool
(
self
->
size
()
!=
0
);
return
boxBool
(
self
->
size
()
!=
0
);
}
}
...
@@ -1550,7 +1550,7 @@ extern "C" Box* strNew(BoxedClass* cls, Box* obj) {
...
@@ -1550,7 +1550,7 @@ extern "C" Box* strNew(BoxedClass* cls, Box* obj) {
assert
(
isSubclass
(
cls
,
str_cls
));
assert
(
isSubclass
(
cls
,
str_cls
));
Box
*
rtn
=
str
(
obj
);
Box
*
rtn
=
str
(
obj
);
assert
(
isSubclass
(
rtn
->
cls
,
str_cls
));
assert
(
PyString_Check
(
rtn
));
if
(
cls
==
str_cls
)
if
(
cls
==
str_cls
)
return
rtn
;
return
rtn
;
...
@@ -1565,7 +1565,7 @@ extern "C" Box* basestringNew(BoxedClass* cls, Box* args, Box* kwargs) {
...
@@ -1565,7 +1565,7 @@ extern "C" Box* basestringNew(BoxedClass* cls, Box* args, Box* kwargs) {
}
}
Box
*
_strSlice
(
BoxedString
*
self
,
i64
start
,
i64
stop
,
i64
step
,
i64
length
)
{
Box
*
_strSlice
(
BoxedString
*
self
,
i64
start
,
i64
stop
,
i64
step
,
i64
length
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
s
=
self
->
s
();
llvm
::
StringRef
s
=
self
->
s
();
...
@@ -1587,7 +1587,7 @@ Box* _strSlice(BoxedString* self, i64 start, i64 stop, i64 step, i64 length) {
...
@@ -1587,7 +1587,7 @@ Box* _strSlice(BoxedString* self, i64 start, i64 stop, i64 step, i64 length) {
}
}
Box
*
strIsAlpha
(
BoxedString
*
self
)
{
Box
*
strIsAlpha
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
if
(
str
.
empty
())
if
(
str
.
empty
())
...
@@ -1602,7 +1602,7 @@ Box* strIsAlpha(BoxedString* self) {
...
@@ -1602,7 +1602,7 @@ Box* strIsAlpha(BoxedString* self) {
}
}
Box
*
strIsDigit
(
BoxedString
*
self
)
{
Box
*
strIsDigit
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
if
(
str
.
empty
())
if
(
str
.
empty
())
...
@@ -1617,7 +1617,7 @@ Box* strIsDigit(BoxedString* self) {
...
@@ -1617,7 +1617,7 @@ Box* strIsDigit(BoxedString* self) {
}
}
Box
*
strIsAlnum
(
BoxedString
*
self
)
{
Box
*
strIsAlnum
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
if
(
str
.
empty
())
if
(
str
.
empty
())
...
@@ -1632,7 +1632,7 @@ Box* strIsAlnum(BoxedString* self) {
...
@@ -1632,7 +1632,7 @@ Box* strIsAlnum(BoxedString* self) {
}
}
Box
*
strIsLower
(
BoxedString
*
self
)
{
Box
*
strIsLower
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
bool
lowered
=
false
;
bool
lowered
=
false
;
...
@@ -1654,7 +1654,7 @@ Box* strIsLower(BoxedString* self) {
...
@@ -1654,7 +1654,7 @@ Box* strIsLower(BoxedString* self) {
}
}
Box
*
strIsUpper
(
BoxedString
*
self
)
{
Box
*
strIsUpper
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
...
@@ -1673,7 +1673,7 @@ Box* strIsUpper(BoxedString* self) {
...
@@ -1673,7 +1673,7 @@ Box* strIsUpper(BoxedString* self) {
}
}
Box
*
strIsSpace
(
BoxedString
*
self
)
{
Box
*
strIsSpace
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
if
(
str
.
empty
())
if
(
str
.
empty
())
...
@@ -1688,7 +1688,7 @@ Box* strIsSpace(BoxedString* self) {
...
@@ -1688,7 +1688,7 @@ Box* strIsSpace(BoxedString* self) {
}
}
Box
*
strIsTitle
(
BoxedString
*
self
)
{
Box
*
strIsTitle
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
llvm
::
StringRef
str
(
self
->
s
());
llvm
::
StringRef
str
(
self
->
s
());
...
@@ -1723,12 +1723,12 @@ Box* strIsTitle(BoxedString* self) {
...
@@ -1723,12 +1723,12 @@ Box* strIsTitle(BoxedString* self) {
}
}
extern
"C"
PyObject
*
_PyString_Join
(
PyObject
*
sep
,
PyObject
*
x
)
noexcept
{
extern
"C"
PyObject
*
_PyString_Join
(
PyObject
*
sep
,
PyObject
*
x
)
noexcept
{
RELEASE_ASSERT
(
isSubclass
(
sep
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
sep
),
""
);
return
string_join
((
PyStringObject
*
)
sep
,
x
);
return
string_join
((
PyStringObject
*
)
sep
,
x
);
}
}
Box
*
strReplace
(
Box
*
_self
,
Box
*
_old
,
Box
*
_new
,
Box
**
_args
)
{
Box
*
strReplace
(
Box
*
_self
,
Box
*
_old
,
Box
*
_new
,
Box
**
_args
)
{
if
(
!
isSubclass
(
_self
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
_self
))
raiseExcHelper
(
TypeError
,
"descriptor 'replace' requires a 'str' object but received a '%s'"
,
raiseExcHelper
(
TypeError
,
"descriptor 'replace' requires a 'str' object but received a '%s'"
,
getTypeName
(
_self
));
getTypeName
(
_self
));
BoxedString
*
self
=
static_cast
<
BoxedString
*>
(
_self
);
BoxedString
*
self
=
static_cast
<
BoxedString
*>
(
_self
);
...
@@ -1738,11 +1738,11 @@ Box* strReplace(Box* _self, Box* _old, Box* _new, Box** _args) {
...
@@ -1738,11 +1738,11 @@ Box* strReplace(Box* _self, Box* _old, Box* _new, Box** _args) {
return
PyUnicode_Replace
((
PyObject
*
)
self
,
_old
,
_new
,
-
1
/*count*/
);
return
PyUnicode_Replace
((
PyObject
*
)
self
,
_old
,
_new
,
-
1
/*count*/
);
#endif
#endif
if
(
!
isSubclass
(
_old
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
_old
))
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
BoxedString
*
old
=
static_cast
<
BoxedString
*>
(
_old
);
BoxedString
*
old
=
static_cast
<
BoxedString
*>
(
_old
);
if
(
!
isSubclass
(
_new
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
_new
))
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
BoxedString
*
new_
=
static_cast
<
BoxedString
*>
(
_new
);
BoxedString
*
new_
=
static_cast
<
BoxedString
*>
(
_new
);
...
@@ -1764,8 +1764,8 @@ Box* strReplace(Box* _self, Box* _old, Box* _new, Box** _args) {
...
@@ -1764,8 +1764,8 @@ Box* strReplace(Box* _self, Box* _old, Box* _new, Box** _args) {
}
}
Box
*
strPartition
(
BoxedString
*
self
,
BoxedString
*
sep
)
{
Box
*
strPartition
(
BoxedString
*
self
,
BoxedString
*
sep
)
{
RELEASE_ASSERT
(
isSubclass
(
self
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
self
),
""
);
RELEASE_ASSERT
(
isSubclass
(
sep
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
sep
),
""
);
size_t
found_idx
=
self
->
s
().
find
(
sep
->
s
());
size_t
found_idx
=
self
->
s
().
find
(
sep
->
s
());
if
(
found_idx
==
std
::
string
::
npos
)
if
(
found_idx
==
std
::
string
::
npos
)
...
@@ -1779,8 +1779,8 @@ Box* strPartition(BoxedString* self, BoxedString* sep) {
...
@@ -1779,8 +1779,8 @@ Box* strPartition(BoxedString* self, BoxedString* sep) {
}
}
Box
*
strRpartition
(
BoxedString
*
self
,
BoxedString
*
sep
)
{
Box
*
strRpartition
(
BoxedString
*
self
,
BoxedString
*
sep
)
{
RELEASE_ASSERT
(
isSubclass
(
self
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
self
),
""
);
RELEASE_ASSERT
(
isSubclass
(
sep
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
sep
),
""
);
size_t
found_idx
=
self
->
s
().
rfind
(
sep
->
s
());
size_t
found_idx
=
self
->
s
().
rfind
(
sep
->
s
());
if
(
found_idx
==
std
::
string
::
npos
)
if
(
found_idx
==
std
::
string
::
npos
)
...
@@ -1805,10 +1805,10 @@ Box* strFormat(BoxedString* self, BoxedTuple* args, BoxedDict* kwargs) {
...
@@ -1805,10 +1805,10 @@ Box* strFormat(BoxedString* self, BoxedTuple* args, BoxedDict* kwargs) {
}
}
Box
*
strStrip
(
BoxedString
*
self
,
Box
*
chars
)
{
Box
*
strStrip
(
BoxedString
*
self
,
Box
*
chars
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
auto
str
=
self
->
s
();
auto
str
=
self
->
s
();
if
(
isSubclass
(
chars
->
cls
,
str_cl
s
))
{
if
(
PyString_Check
(
char
s
))
{
auto
chars_str
=
static_cast
<
BoxedString
*>
(
chars
)
->
s
();
auto
chars_str
=
static_cast
<
BoxedString
*>
(
chars
)
->
s
();
return
boxString
(
str
.
trim
(
chars_str
));
return
boxString
(
str
.
trim
(
chars_str
));
}
else
if
(
chars
->
cls
==
none_cls
)
{
}
else
if
(
chars
->
cls
==
none_cls
)
{
...
@@ -1829,10 +1829,10 @@ Box* strStrip(BoxedString* self, Box* chars) {
...
@@ -1829,10 +1829,10 @@ Box* strStrip(BoxedString* self, Box* chars) {
}
}
Box
*
strLStrip
(
BoxedString
*
self
,
Box
*
chars
)
{
Box
*
strLStrip
(
BoxedString
*
self
,
Box
*
chars
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
auto
str
=
self
->
s
();
auto
str
=
self
->
s
();
if
(
isSubclass
(
chars
->
cls
,
str_cl
s
))
{
if
(
PyString_Check
(
char
s
))
{
auto
chars_str
=
static_cast
<
BoxedString
*>
(
chars
)
->
s
();
auto
chars_str
=
static_cast
<
BoxedString
*>
(
chars
)
->
s
();
return
boxString
(
str
.
ltrim
(
chars_str
));
return
boxString
(
str
.
ltrim
(
chars_str
));
}
else
if
(
chars
->
cls
==
none_cls
)
{
}
else
if
(
chars
->
cls
==
none_cls
)
{
...
@@ -1853,10 +1853,10 @@ Box* strLStrip(BoxedString* self, Box* chars) {
...
@@ -1853,10 +1853,10 @@ Box* strLStrip(BoxedString* self, Box* chars) {
}
}
Box
*
strRStrip
(
BoxedString
*
self
,
Box
*
chars
)
{
Box
*
strRStrip
(
BoxedString
*
self
,
Box
*
chars
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
auto
str
=
self
->
s
();
auto
str
=
self
->
s
();
if
(
isSubclass
(
chars
->
cls
,
str_cl
s
))
{
if
(
PyString_Check
(
char
s
))
{
auto
chars_str
=
static_cast
<
BoxedString
*>
(
chars
)
->
s
();
auto
chars_str
=
static_cast
<
BoxedString
*>
(
chars
)
->
s
();
return
boxString
(
str
.
rtrim
(
chars_str
));
return
boxString
(
str
.
rtrim
(
chars_str
));
}
else
if
(
chars
->
cls
==
none_cls
)
{
}
else
if
(
chars
->
cls
==
none_cls
)
{
...
@@ -1877,7 +1877,7 @@ Box* strRStrip(BoxedString* self, Box* chars) {
...
@@ -1877,7 +1877,7 @@ Box* strRStrip(BoxedString* self, Box* chars) {
}
}
Box
*
strCapitalize
(
BoxedString
*
self
)
{
Box
*
strCapitalize
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
std
::
string
s
(
self
->
s
());
std
::
string
s
(
self
->
s
());
...
@@ -1893,7 +1893,7 @@ Box* strCapitalize(BoxedString* self) {
...
@@ -1893,7 +1893,7 @@ Box* strCapitalize(BoxedString* self) {
}
}
Box
*
strTitle
(
BoxedString
*
self
)
{
Box
*
strTitle
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
std
::
string
s
(
self
->
s
());
std
::
string
s
(
self
->
s
());
bool
start_of_word
=
false
;
bool
start_of_word
=
false
;
...
@@ -1917,20 +1917,20 @@ Box* strTitle(BoxedString* self) {
...
@@ -1917,20 +1917,20 @@ Box* strTitle(BoxedString* self) {
}
}
Box
*
strTranslate
(
BoxedString
*
self
,
BoxedString
*
table
,
BoxedString
*
delete_chars
)
{
Box
*
strTranslate
(
BoxedString
*
self
,
BoxedString
*
table
,
BoxedString
*
delete_chars
)
{
if
(
!
isSubclass
(
self
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
self
))
raiseExcHelper
(
TypeError
,
"descriptor 'translate' requires a 'str' object but received a '%s'"
,
raiseExcHelper
(
TypeError
,
"descriptor 'translate' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
getTypeName
(
self
));
std
::
unordered_set
<
char
>
delete_set
;
std
::
unordered_set
<
char
>
delete_set
;
if
(
delete_chars
)
{
if
(
delete_chars
)
{
if
(
!
isSubclass
(
delete_chars
->
cls
,
str_cl
s
))
if
(
!
PyString_Check
(
delete_char
s
))
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
delete_set
.
insert
(
delete_chars
->
s
().
begin
(),
delete_chars
->
s
().
end
());
delete_set
.
insert
(
delete_chars
->
s
().
begin
(),
delete_chars
->
s
().
end
());
}
}
bool
have_table
=
table
!=
None
;
bool
have_table
=
table
!=
None
;
if
(
have_table
)
{
if
(
have_table
)
{
if
(
!
isSubclass
(
table
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
table
))
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
if
(
table
->
size
()
!=
256
)
if
(
table
->
size
()
!=
256
)
raiseExcHelper
(
ValueError
,
"translation table must be 256 characters long"
);
raiseExcHelper
(
ValueError
,
"translation table must be 256 characters long"
);
...
@@ -1945,7 +1945,7 @@ Box* strTranslate(BoxedString* self, BoxedString* table, BoxedString* delete_cha
...
@@ -1945,7 +1945,7 @@ Box* strTranslate(BoxedString* self, BoxedString* table, BoxedString* delete_cha
}
}
Box
*
strLower
(
BoxedString
*
self
)
{
Box
*
strLower
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
BoxedString
*
rtn
=
new
(
self
->
size
())
BoxedString
(
self
->
s
());
BoxedString
*
rtn
=
new
(
self
->
size
())
BoxedString
(
self
->
s
());
for
(
int
i
=
0
;
i
<
rtn
->
size
();
i
++
)
for
(
int
i
=
0
;
i
<
rtn
->
size
();
i
++
)
...
@@ -1954,7 +1954,7 @@ Box* strLower(BoxedString* self) {
...
@@ -1954,7 +1954,7 @@ Box* strLower(BoxedString* self) {
}
}
Box
*
strUpper
(
BoxedString
*
self
)
{
Box
*
strUpper
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
BoxedString
*
rtn
=
new
(
self
->
size
())
BoxedString
(
self
->
s
());
BoxedString
*
rtn
=
new
(
self
->
size
())
BoxedString
(
self
->
s
());
for
(
int
i
=
0
;
i
<
rtn
->
size
();
i
++
)
for
(
int
i
=
0
;
i
<
rtn
->
size
();
i
++
)
rtn
->
data
()[
i
]
=
std
::
toupper
(
rtn
->
data
()[
i
]);
rtn
->
data
()[
i
]
=
std
::
toupper
(
rtn
->
data
()[
i
]);
...
@@ -1962,7 +1962,7 @@ Box* strUpper(BoxedString* self) {
...
@@ -1962,7 +1962,7 @@ Box* strUpper(BoxedString* self) {
}
}
Box
*
strSwapcase
(
BoxedString
*
self
)
{
Box
*
strSwapcase
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
BoxedString
*
rtn
=
new
(
self
->
size
())
BoxedString
(
self
->
s
());
BoxedString
*
rtn
=
new
(
self
->
size
())
BoxedString
(
self
->
s
());
for
(
int
i
=
0
;
i
<
rtn
->
size
();
i
++
)
{
for
(
int
i
=
0
;
i
<
rtn
->
size
();
i
++
)
{
char
c
=
rtn
->
data
()[
i
];
char
c
=
rtn
->
data
()[
i
];
...
@@ -1975,7 +1975,7 @@ Box* strSwapcase(BoxedString* self) {
...
@@ -1975,7 +1975,7 @@ Box* strSwapcase(BoxedString* self) {
}
}
Box
*
strContains
(
BoxedString
*
self
,
Box
*
elt
)
{
Box
*
strContains
(
BoxedString
*
self
,
Box
*
elt
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
if
(
PyUnicode_Check
(
elt
))
{
if
(
PyUnicode_Check
(
elt
))
{
int
r
=
PyUnicode_Contains
(
self
,
elt
);
int
r
=
PyUnicode_Contains
(
self
,
elt
);
...
@@ -1984,7 +1984,7 @@ Box* strContains(BoxedString* self, Box* elt) {
...
@@ -1984,7 +1984,7 @@ Box* strContains(BoxedString* self, Box* elt) {
return
boxBool
(
r
);
return
boxBool
(
r
);
}
}
if
(
!
isSubclass
(
elt
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
elt
))
raiseExcHelper
(
TypeError
,
"'in <string>' requires string as left operand, not %s"
,
getTypeName
(
elt
));
raiseExcHelper
(
TypeError
,
"'in <string>' requires string as left operand, not %s"
,
getTypeName
(
elt
));
BoxedString
*
sub
=
static_cast
<
BoxedString
*>
(
elt
);
BoxedString
*
sub
=
static_cast
<
BoxedString
*>
(
elt
);
...
@@ -2016,7 +2016,7 @@ extern "C" int _PyString_Eq(PyObject* o1, PyObject* o2) noexcept {
...
@@ -2016,7 +2016,7 @@ extern "C" int _PyString_Eq(PyObject* o1, PyObject* o2) noexcept {
Box
*
strStartswith
(
BoxedString
*
self
,
Box
*
elt
,
Box
*
start
,
Box
**
_args
)
{
Box
*
strStartswith
(
BoxedString
*
self
,
Box
*
elt
,
Box
*
start
,
Box
**
_args
)
{
Box
*
end
=
_args
[
0
];
Box
*
end
=
_args
[
0
];
if
(
!
isSubclass
(
self
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
self
))
raiseExcHelper
(
TypeError
,
"descriptor 'startswith' requires a 'str' object but received a '%s'"
,
raiseExcHelper
(
TypeError
,
"descriptor 'startswith' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
getTypeName
(
self
));
...
@@ -2051,7 +2051,7 @@ Box* strStartswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
...
@@ -2051,7 +2051,7 @@ Box* strStartswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
return
boxBool
(
r
);
return
boxBool
(
r
);
}
}
if
(
!
isSubclass
(
elt
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
elt
))
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
BoxedString
*
sub
=
static_cast
<
BoxedString
*>
(
elt
);
BoxedString
*
sub
=
static_cast
<
BoxedString
*>
(
elt
);
...
@@ -2079,7 +2079,7 @@ Box* strStartswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
...
@@ -2079,7 +2079,7 @@ Box* strStartswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
Box
*
strEndswith
(
BoxedString
*
self
,
Box
*
elt
,
Box
*
start
,
Box
**
_args
)
{
Box
*
strEndswith
(
BoxedString
*
self
,
Box
*
elt
,
Box
*
start
,
Box
**
_args
)
{
Box
*
end
=
_args
[
0
];
Box
*
end
=
_args
[
0
];
if
(
!
isSubclass
(
self
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
self
))
raiseExcHelper
(
TypeError
,
"descriptor 'endswith' requires a 'str' object but received a '%s'"
,
raiseExcHelper
(
TypeError
,
"descriptor 'endswith' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
getTypeName
(
self
));
...
@@ -2114,7 +2114,7 @@ Box* strEndswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
...
@@ -2114,7 +2114,7 @@ Box* strEndswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
return
False
;
return
False
;
}
}
if
(
!
isSubclass
(
elt
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
elt
))
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
raiseExcHelper
(
TypeError
,
"expected a character buffer object"
);
BoxedString
*
sub
=
static_cast
<
BoxedString
*>
(
elt
);
BoxedString
*
sub
=
static_cast
<
BoxedString
*>
(
elt
);
...
@@ -2142,7 +2142,7 @@ Box* strEndswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
...
@@ -2142,7 +2142,7 @@ Box* strEndswith(BoxedString* self, Box* elt, Box* start, Box** _args) {
}
}
Box
*
strDecode
(
BoxedString
*
self
,
Box
*
encoding
,
Box
*
error
)
{
Box
*
strDecode
(
BoxedString
*
self
,
Box
*
encoding
,
Box
*
error
)
{
if
(
!
isSubclass
(
self
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
self
))
raiseExcHelper
(
TypeError
,
"descriptor 'decode' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
raiseExcHelper
(
TypeError
,
"descriptor 'decode' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
BoxedString
*
encoding_str
=
(
BoxedString
*
)
encoding
;
BoxedString
*
encoding_str
=
(
BoxedString
*
)
encoding
;
...
@@ -2151,13 +2151,13 @@ Box* strDecode(BoxedString* self, Box* encoding, Box* error) {
...
@@ -2151,13 +2151,13 @@ Box* strDecode(BoxedString* self, Box* encoding, Box* error) {
if
(
encoding_str
&&
encoding_str
->
cls
==
unicode_cls
)
if
(
encoding_str
&&
encoding_str
->
cls
==
unicode_cls
)
encoding_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
encoding_str
,
NULL
);
encoding_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
encoding_str
,
NULL
);
if
(
encoding_str
&&
!
isSubclass
(
encoding_str
->
cls
,
str_cls
))
if
(
encoding_str
&&
!
PyString_Check
(
encoding_str
))
raiseExcHelper
(
TypeError
,
"decode() argument 1 must be string, not '%s'"
,
getTypeName
(
encoding_str
));
raiseExcHelper
(
TypeError
,
"decode() argument 1 must be string, not '%s'"
,
getTypeName
(
encoding_str
));
if
(
error_str
&&
error_str
->
cls
==
unicode_cls
)
if
(
error_str
&&
error_str
->
cls
==
unicode_cls
)
error_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
error_str
,
NULL
);
error_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
error_str
,
NULL
);
if
(
error_str
&&
!
isSubclass
(
error_str
->
cls
,
str_cls
))
if
(
error_str
&&
!
PyString_Check
(
error_str
))
raiseExcHelper
(
TypeError
,
"decode() argument 2 must be string, not '%s'"
,
getTypeName
(
error_str
));
raiseExcHelper
(
TypeError
,
"decode() argument 2 must be string, not '%s'"
,
getTypeName
(
error_str
));
Box
*
result
=
PyString_AsDecodedObject
(
self
,
encoding_str
?
encoding_str
->
data
()
:
NULL
,
Box
*
result
=
PyString_AsDecodedObject
(
self
,
encoding_str
?
encoding_str
->
data
()
:
NULL
,
...
@@ -2167,7 +2167,7 @@ Box* strDecode(BoxedString* self, Box* encoding, Box* error) {
...
@@ -2167,7 +2167,7 @@ Box* strDecode(BoxedString* self, Box* encoding, Box* error) {
}
}
Box
*
strEncode
(
BoxedString
*
self
,
Box
*
encoding
,
Box
*
error
)
{
Box
*
strEncode
(
BoxedString
*
self
,
Box
*
encoding
,
Box
*
error
)
{
if
(
!
isSubclass
(
self
->
cls
,
str_cls
))
if
(
!
PyString_Check
(
self
))
raiseExcHelper
(
TypeError
,
"descriptor 'encode' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
raiseExcHelper
(
TypeError
,
"descriptor 'encode' requires a 'str' object but received a '%s'"
,
getTypeName
(
self
));
BoxedString
*
encoding_str
=
(
BoxedString
*
)
encoding
;
BoxedString
*
encoding_str
=
(
BoxedString
*
)
encoding
;
...
@@ -2176,13 +2176,13 @@ Box* strEncode(BoxedString* self, Box* encoding, Box* error) {
...
@@ -2176,13 +2176,13 @@ Box* strEncode(BoxedString* self, Box* encoding, Box* error) {
if
(
encoding_str
&&
encoding_str
->
cls
==
unicode_cls
)
if
(
encoding_str
&&
encoding_str
->
cls
==
unicode_cls
)
encoding_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
encoding_str
,
NULL
);
encoding_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
encoding_str
,
NULL
);
if
(
encoding_str
&&
!
isSubclass
(
encoding_str
->
cls
,
str_cls
))
if
(
encoding_str
&&
!
PyString_Check
(
encoding_str
))
raiseExcHelper
(
TypeError
,
"encode() argument 1 must be string, not '%s'"
,
getTypeName
(
encoding_str
));
raiseExcHelper
(
TypeError
,
"encode() argument 1 must be string, not '%s'"
,
getTypeName
(
encoding_str
));
if
(
error_str
&&
error_str
->
cls
==
unicode_cls
)
if
(
error_str
&&
error_str
->
cls
==
unicode_cls
)
error_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
error_str
,
NULL
);
error_str
=
(
BoxedString
*
)
_PyUnicode_AsDefaultEncodedString
(
error_str
,
NULL
);
if
(
error_str
&&
!
isSubclass
(
error_str
->
cls
,
str_cls
))
if
(
error_str
&&
!
PyString_Check
(
error_str
))
raiseExcHelper
(
TypeError
,
"encode() argument 2 must be string, not '%s'"
,
getTypeName
(
error_str
));
raiseExcHelper
(
TypeError
,
"encode() argument 2 must be string, not '%s'"
,
getTypeName
(
error_str
));
Box
*
result
=
PyString_AsEncodedObject
(
self
,
encoding_str
?
encoding_str
->
data
()
:
PyUnicode_GetDefaultEncoding
(),
Box
*
result
=
PyString_AsEncodedObject
(
self
,
encoding_str
?
encoding_str
->
data
()
:
PyUnicode_GetDefaultEncoding
(),
...
@@ -2192,7 +2192,7 @@ Box* strEncode(BoxedString* self, Box* encoding, Box* error) {
...
@@ -2192,7 +2192,7 @@ Box* strEncode(BoxedString* self, Box* encoding, Box* error) {
}
}
extern
"C"
Box
*
strGetitem
(
BoxedString
*
self
,
Box
*
slice
)
{
extern
"C"
Box
*
strGetitem
(
BoxedString
*
self
,
Box
*
slice
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
if
(
PyIndex_Check
(
slice
))
{
if
(
PyIndex_Check
(
slice
))
{
Py_ssize_t
n
=
PyNumber_AsSsize_t
(
slice
,
PyExc_IndexError
);
Py_ssize_t
n
=
PyNumber_AsSsize_t
(
slice
,
PyExc_IndexError
);
...
@@ -2267,7 +2267,7 @@ extern "C" void strIteratorGCHandler(GCVisitor* v, Box* b) {
...
@@ -2267,7 +2267,7 @@ extern "C" void strIteratorGCHandler(GCVisitor* v, Box* b) {
}
}
Box
*
strIter
(
BoxedString
*
self
)
{
Box
*
strIter
(
BoxedString
*
self
)
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
return
new
BoxedStringIterator
(
self
);
return
new
BoxedStringIterator
(
self
);
}
}
...
@@ -2338,7 +2338,7 @@ extern "C" char* PyString_AsString(PyObject* o) noexcept {
...
@@ -2338,7 +2338,7 @@ extern "C" char* PyString_AsString(PyObject* o) noexcept {
}
}
extern
"C"
Py_ssize_t
PyString_Size
(
PyObject
*
op
)
noexcept
{
extern
"C"
Py_ssize_t
PyString_Size
(
PyObject
*
op
)
noexcept
{
if
(
isSubclass
(
op
->
cls
,
str_cls
))
if
(
PyString_Check
(
op
))
return
static_cast
<
BoxedString
*>
(
op
)
->
size
();
return
static_cast
<
BoxedString
*>
(
op
)
->
size
();
char
*
_s
;
char
*
_s
;
...
@@ -2362,7 +2362,7 @@ extern "C" int _PyString_Resize(PyObject** pv, Py_ssize_t newsize) noexcept {
...
@@ -2362,7 +2362,7 @@ extern "C" int _PyString_Resize(PyObject** pv, Py_ssize_t newsize) noexcept {
// This is only allowed to be called when there is only one user of the string (ie a refcount of 1 in CPython)
// This is only allowed to be called when there is only one user of the string (ie a refcount of 1 in CPython)
assert
(
pv
);
assert
(
pv
);
assert
(
isSubclass
((
*
pv
)
->
cls
,
str_cls
));
assert
(
PyString_Check
(
*
pv
));
BoxedString
*
s
=
static_cast
<
BoxedString
*>
(
*
pv
);
BoxedString
*
s
=
static_cast
<
BoxedString
*>
(
*
pv
);
if
(
newsize
==
s
->
size
())
if
(
newsize
==
s
->
size
())
...
@@ -2609,7 +2609,7 @@ static Py_ssize_t string_buffer_getreadbuf(PyObject* self, Py_ssize_t index, con
...
@@ -2609,7 +2609,7 @@ static Py_ssize_t string_buffer_getreadbuf(PyObject* self, Py_ssize_t index, con
RELEASE_ASSERT
(
index
==
0
,
""
);
RELEASE_ASSERT
(
index
==
0
,
""
);
// I think maybe this can just be a non-release assert? shouldn't be able to call this with
// I think maybe this can just be a non-release assert? shouldn't be able to call this with
// the wrong type
// the wrong type
RELEASE_ASSERT
(
isSubclass
(
self
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
self
),
""
);
auto
s
=
static_cast
<
BoxedString
*>
(
self
);
auto
s
=
static_cast
<
BoxedString
*>
(
self
);
*
ptr
=
s
->
data
();
*
ptr
=
s
->
data
();
...
@@ -2618,7 +2618,7 @@ static Py_ssize_t string_buffer_getreadbuf(PyObject* self, Py_ssize_t index, con
...
@@ -2618,7 +2618,7 @@ static Py_ssize_t string_buffer_getreadbuf(PyObject* self, Py_ssize_t index, con
static
Py_ssize_t
string_buffer_getsegcount
(
PyObject
*
o
,
Py_ssize_t
*
lenp
)
noexcept
{
static
Py_ssize_t
string_buffer_getsegcount
(
PyObject
*
o
,
Py_ssize_t
*
lenp
)
noexcept
{
RELEASE_ASSERT
(
lenp
==
NULL
,
""
);
RELEASE_ASSERT
(
lenp
==
NULL
,
""
);
RELEASE_ASSERT
(
isSubclass
(
o
->
cls
,
str_cls
),
""
);
RELEASE_ASSERT
(
PyString_Check
(
o
),
""
);
return
1
;
return
1
;
}
}
...
@@ -2632,7 +2632,7 @@ static Py_ssize_t string_buffer_getcharbuf(PyStringObject* self, Py_ssize_t inde
...
@@ -2632,7 +2632,7 @@ static Py_ssize_t string_buffer_getcharbuf(PyStringObject* self, Py_ssize_t inde
}
}
static
int
string_buffer_getbuffer
(
BoxedString
*
self
,
Py_buffer
*
view
,
int
flags
)
noexcept
{
static
int
string_buffer_getbuffer
(
BoxedString
*
self
,
Py_buffer
*
view
,
int
flags
)
noexcept
{
assert
(
isSubclass
(
self
->
cls
,
str_cls
));
assert
(
PyString_Check
(
self
));
return
PyBuffer_FillInfo
(
view
,
(
PyObject
*
)
self
,
self
->
data
(),
self
->
size
(),
1
,
flags
);
return
PyBuffer_FillInfo
(
view
,
(
PyObject
*
)
self
,
self
->
data
(),
self
->
size
(),
1
,
flags
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment