Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
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
Kirill Smelkov
cpython
Commits
616d2856
Commit
616d2856
authored
Aug 19, 2008
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #2394: implement more of the memoryview API.
parent
4aeec046
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
418 additions
and
25 deletions
+418
-25
Lib/test/test_codecs.py
Lib/test/test_codecs.py
+1
-1
Lib/test/test_memoryview.py
Lib/test/test_memoryview.py
+190
-2
Misc/NEWS
Misc/NEWS
+7
-0
Objects/memoryobject.c
Objects/memoryobject.c
+220
-22
No files found.
Lib/test/test_codecs.py
View file @
616d2856
...
...
@@ -621,7 +621,7 @@ class UTF8SigTest(ReadTest):
def
test_bug1601501
(
self
):
# SF bug #1601501: check that the codec works with a buffer
s
tr
(
b"
\
xef
\
xbb
\
xbf
"
,
"utf-8-sig
"
)
s
elf
.
assertEquals
(
str
(
b"
\
xef
\
xbb
\
xbf
"
,
"utf-8-sig"
),
"
"
)
def
test_bom
(
self
):
d
=
codecs
.
getincrementaldecoder
(
"utf-8-sig"
)()
...
...
Lib/test/test_memoryview.py
View file @
616d2856
...
...
@@ -5,8 +5,166 @@ XXX We need more tests! Some tests are in test_bytes
import
unittest
import
test.support
import
sys
class
MemoryviewTest
(
unittest
.
TestCase
):
class
CommonMemoryTests
:
#
# Tests common to direct memoryviews and sliced memoryviews
#
base_object
=
b"abcdef"
def
check_getitem_with_type
(
self
,
tp
):
b
=
tp
(
self
.
base_object
)
oldrefcount
=
sys
.
getrefcount
(
b
)
m
=
self
.
_view
(
b
)
self
.
assertEquals
(
m
[
0
],
b"a"
)
self
.
assert_
(
isinstance
(
m
[
0
],
bytes
),
type
(
m
[
0
]))
self
.
assertEquals
(
m
[
5
],
b"f"
)
self
.
assertEquals
(
m
[
-
1
],
b"f"
)
self
.
assertEquals
(
m
[
-
6
],
b"a"
)
# Bounds checking
self
.
assertRaises
(
IndexError
,
lambda
:
m
[
6
])
self
.
assertRaises
(
IndexError
,
lambda
:
m
[
-
7
])
self
.
assertRaises
(
IndexError
,
lambda
:
m
[
sys
.
maxsize
])
self
.
assertRaises
(
IndexError
,
lambda
:
m
[
-
sys
.
maxsize
])
# Type checking
self
.
assertRaises
(
TypeError
,
lambda
:
m
[
None
])
self
.
assertRaises
(
TypeError
,
lambda
:
m
[
0.0
])
self
.
assertRaises
(
TypeError
,
lambda
:
m
[
"a"
])
m
=
None
self
.
assertEquals
(
sys
.
getrefcount
(
b
),
oldrefcount
)
def
test_getitem_readonly
(
self
):
self
.
check_getitem_with_type
(
bytes
)
def
test_getitem_writable
(
self
):
self
.
check_getitem_with_type
(
bytearray
)
def
test_setitem_readonly
(
self
):
b
=
self
.
base_object
oldrefcount
=
sys
.
getrefcount
(
b
)
m
=
self
.
_view
(
b
)
def
setitem
(
value
):
m
[
0
]
=
value
self
.
assertRaises
(
TypeError
,
setitem
,
b"a"
)
self
.
assertRaises
(
TypeError
,
setitem
,
65
)
self
.
assertRaises
(
TypeError
,
setitem
,
memoryview
(
b"a"
))
m
=
None
self
.
assertEquals
(
sys
.
getrefcount
(
b
),
oldrefcount
)
def
test_setitem_writable
(
self
):
b
=
bytearray
(
self
.
base_object
)
oldrefcount
=
sys
.
getrefcount
(
b
)
m
=
self
.
_view
(
b
)
m
[
0
]
=
b"0"
self
.
_check_contents
(
b
,
b"0bcdef"
)
m
[
1
:
3
]
=
b"12"
self
.
_check_contents
(
b
,
b"012def"
)
m
[
1
:
1
]
=
b""
self
.
_check_contents
(
b
,
b"012def"
)
m
[:]
=
b"abcdef"
self
.
_check_contents
(
b
,
b"abcdef"
)
# Overlapping copies of a view into itself
m
[
0
:
3
]
=
m
[
2
:
5
]
self
.
_check_contents
(
b
,
b"cdedef"
)
m
[:]
=
b"abcdef"
m
[
2
:
5
]
=
m
[
0
:
3
]
self
.
_check_contents
(
b
,
b"ababcf"
)
def
setitem
(
key
,
value
):
m
[
key
]
=
value
# Bounds checking
self
.
assertRaises
(
IndexError
,
setitem
,
6
,
b"a"
)
self
.
assertRaises
(
IndexError
,
setitem
,
-
7
,
b"a"
)
self
.
assertRaises
(
IndexError
,
setitem
,
sys
.
maxsize
,
b"a"
)
self
.
assertRaises
(
IndexError
,
setitem
,
-
sys
.
maxsize
,
b"a"
)
# Wrong index/slice types
self
.
assertRaises
(
TypeError
,
setitem
,
0.0
,
b"a"
)
self
.
assertRaises
(
TypeError
,
setitem
,
(
0
,),
b"a"
)
self
.
assertRaises
(
TypeError
,
setitem
,
"a"
,
b"a"
)
# Trying to resize the memory object
self
.
assertRaises
(
ValueError
,
setitem
,
0
,
b""
)
self
.
assertRaises
(
ValueError
,
setitem
,
0
,
b"ab"
)
self
.
assertRaises
(
ValueError
,
setitem
,
slice
(
1
,
1
),
b"a"
)
self
.
assertRaises
(
ValueError
,
setitem
,
slice
(
0
,
2
),
b"a"
)
m
=
None
self
.
assertEquals
(
sys
.
getrefcount
(
b
),
oldrefcount
)
def
test_len
(
self
):
self
.
assertEquals
(
len
(
self
.
_view
(
self
.
base_object
)),
6
)
def
test_tobytes
(
self
):
m
=
self
.
_view
(
self
.
base_object
)
b
=
m
.
tobytes
()
self
.
assertEquals
(
b
,
b"abcdef"
)
self
.
assert_
(
isinstance
(
b
,
bytes
),
type
(
b
))
def
test_tolist
(
self
):
m
=
self
.
_view
(
self
.
base_object
)
l
=
m
.
tolist
()
self
.
assertEquals
(
l
,
list
(
b"abcdef"
))
def
test_compare
(
self
):
# memoryviews can compare for equality with other objects
# having the buffer interface.
m
=
self
.
_view
(
self
.
base_object
)
for
tp
in
(
bytes
,
bytearray
):
self
.
assertTrue
(
m
==
tp
(
b"abcdef"
))
self
.
assertFalse
(
m
!=
tp
(
b"abcdef"
))
self
.
assertFalse
(
m
==
tp
(
b"abcde"
))
self
.
assertTrue
(
m
!=
tp
(
b"abcde"
))
self
.
assertFalse
(
m
==
tp
(
b"abcde1"
))
self
.
assertTrue
(
m
!=
tp
(
b"abcde1"
))
self
.
assertTrue
(
m
==
m
)
self
.
assertTrue
(
m
==
m
[:])
self
.
assertTrue
(
m
[
0
:
6
]
==
m
[:])
self
.
assertFalse
(
m
[
0
:
5
]
==
m
)
# Comparison with objects which don't support the buffer API
self
.
assertFalse
(
m
==
"abc"
)
self
.
assertTrue
(
m
!=
"abc"
)
self
.
assertFalse
(
"abc"
==
m
)
self
.
assertTrue
(
"abc"
!=
m
)
# Unordered comparisons
for
c
in
(
m
,
b"abcdef"
):
self
.
assertRaises
(
TypeError
,
lambda
:
m
<
c
)
self
.
assertRaises
(
TypeError
,
lambda
:
c
<=
m
)
self
.
assertRaises
(
TypeError
,
lambda
:
m
>=
c
)
self
.
assertRaises
(
TypeError
,
lambda
:
c
>
m
)
def
check_attributes_with_type
(
self
,
tp
):
b
=
tp
(
self
.
base_object
)
m
=
self
.
_view
(
b
)
self
.
assertEquals
(
m
.
format
,
'B'
)
self
.
assertEquals
(
m
.
itemsize
,
1
)
self
.
assertEquals
(
m
.
ndim
,
1
)
self
.
assertEquals
(
m
.
shape
,
(
6
,))
self
.
assertEquals
(
m
.
size
,
6
)
self
.
assertEquals
(
m
.
strides
,
(
1
,))
self
.
assertEquals
(
m
.
suboffsets
,
None
)
return
m
def
test_attributes_readonly
(
self
):
m
=
self
.
check_attributes_with_type
(
bytes
)
self
.
assertEquals
(
m
.
readonly
,
True
)
def
test_attributes_writable
(
self
):
m
=
self
.
check_attributes_with_type
(
bytearray
)
self
.
assertEquals
(
m
.
readonly
,
False
)
class
MemoryviewTest
(
unittest
.
TestCase
,
CommonMemoryTests
):
def
_view
(
self
,
obj
):
return
memoryview
(
obj
)
def
_check_contents
(
self
,
obj
,
contents
):
self
.
assertEquals
(
obj
,
contents
)
def
test_constructor
(
self
):
ob
=
b'test'
...
...
@@ -17,8 +175,38 @@ class MemoryviewTest(unittest.TestCase):
self
.
assertRaises
(
TypeError
,
memoryview
,
argument
=
ob
)
self
.
assertRaises
(
TypeError
,
memoryview
,
ob
,
argument
=
True
)
class
MemorySliceTest
(
unittest
.
TestCase
,
CommonMemoryTests
):
base_object
=
b"XabcdefY"
def
_view
(
self
,
obj
):
m
=
memoryview
(
obj
)
return
m
[
1
:
7
]
def
_check_contents
(
self
,
obj
,
contents
):
self
.
assertEquals
(
obj
[
1
:
7
],
contents
)
def
test_refs
(
self
):
m
=
memoryview
(
b"ab"
)
oldrefcount
=
sys
.
getrefcount
(
m
)
m
[
1
:
2
]
self
.
assertEquals
(
sys
.
getrefcount
(
m
),
oldrefcount
)
class
MemorySliceSliceTest
(
unittest
.
TestCase
,
CommonMemoryTests
):
base_object
=
b"XabcdefY"
def
_view
(
self
,
obj
):
m
=
memoryview
(
obj
)
return
m
[:
7
][
1
:]
def
_check_contents
(
self
,
obj
,
contents
):
self
.
assertEquals
(
obj
[
1
:
7
],
contents
)
def
test_main
():
test
.
support
.
run_unittest
(
MemoryviewTest
)
test
.
support
.
run_unittest
(
MemoryviewTest
,
MemorySliceTest
,
MemorySliceSliceTest
)
if
__name__
==
"__main__"
:
...
...
Misc/NEWS
View file @
616d2856
...
...
@@ -12,6 +12,13 @@ What's new in Python 3.0b3?
Core and Builtins
-----------------
- Issue #2394: implement more of the memoryview API, with the caveat that
only one-dimensional contiguous buffers are supported and exercised right
now. Slicing, slice assignment and comparison (equality and inequality)
have been added. Also, the tolist() method has been implemented, but only
for byte buffers. Endly, the API has been updated to return bytes objects
wherever it used to return bytearrays.
- Issue #3560: clean up the new C PyMemoryView API so that naming is
internally consistent; add macros PyMemoryView_GET_BASE() and
PyMemoryView_GET_BUFFER() to access useful properties of a memory views
...
...
Objects/memoryobject.c
View file @
616d2856
This diff is collapsed.
Click to expand it.
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