Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
99c1309f
Commit
99c1309f
authored
May 14, 2010
by
Stefan Behnel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
infer type of loop variable when for-in-looping over pointers, C arrays, unicode strings, etc.
parent
310c7329
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
49 additions
and
1 deletion
+49
-1
Cython/Compiler/TypeInference.py
Cython/Compiler/TypeInference.py
+9
-1
tests/run/type_inference.pyx
tests/run/type_inference.pyx
+40
-0
No files found.
Cython/Compiler/TypeInference.py
View file @
99c1309f
...
@@ -70,7 +70,15 @@ class MarkAssignments(CythonTransform):
...
@@ -70,7 +70,15 @@ class MarkAssignments(CythonTransform):
sequence
.
args
[
0
],
sequence
.
args
[
0
],
sequence
.
args
[
2
]))
sequence
.
args
[
2
]))
if
not
is_special
:
if
not
is_special
:
self
.
mark_assignment
(
node
.
target
,
object_expr
)
# A for-loop basically translates to subsequent calls to
# __getitem__(), so using an IndexNode here allows us to
# naturally infer the base type of pointers, C arrays,
# Python strings, etc., while correctly falling back to an
# object type when the base type cannot be handled.
self
.
mark_assignment
(
node
.
target
,
ExprNodes
.
IndexNode
(
node
.
pos
,
base
=
sequence
,
index
=
ExprNodes
.
IntNode
(
node
.
pos
,
value
=
'0'
)))
self
.
visitchildren
(
node
)
self
.
visitchildren
(
node
)
return
node
return
node
...
...
tests/run/type_inference.pyx
View file @
99c1309f
...
@@ -187,6 +187,46 @@ def loop():
...
@@ -187,6 +187,46 @@ def loop():
pass
pass
assert
typeof
(
a
)
==
"long"
assert
typeof
(
a
)
==
"long"
def
loop_over_charptr
():
"""
>>> print( loop_over_charptr() )
char
"""
cdef
char
*
char_ptr_string
=
'abcdefg'
for
c
in
char_ptr_string
:
pass
return
typeof
(
c
)
def
loop_over_bytes
():
"""
>>> print( loop_over_bytes() )
Python object
"""
cdef
bytes
bytes_string
=
b'abcdefg'
for
c
in
bytes_string
:
pass
return
typeof
(
c
)
def
loop_over_unicode
():
"""
>>> print( loop_over_unicode() )
Py_UNICODE
"""
cdef
unicode
ustring
=
u'abcdefg'
for
uchar
in
ustring
:
pass
return
typeof
(
uchar
)
def
loop_over_int_array
():
"""
>>> print( loop_over_int_array() )
int
"""
cdef
int
[
10
]
int_array
for
i
in
int_array
:
pass
return
typeof
(
i
)
cdef
unicode
retu
():
cdef
unicode
retu
():
return
u"12345"
return
u"12345"
...
...
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