Author: Carl Friedrich Bolz <[email protected]>
Branch:
Changeset: r92054:5361e9bb4b15
Date: 2017-08-03 23:14 +0200
http://bitbucket.org/pypy/pypy/changeset/5361e9bb4b15/
Log: add a jit driver for array.count and array.index
diff --git a/pypy/module/array/interp_array.py
b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -118,6 +118,29 @@
return space.w_True
return space.w_False
+index_count_jd = jit.JitDriver(
+ greens = ['count', 'tp_item', 'arrclass'],
+ reds = 'auto', name = 'array.index_or_count')
+
+def index_count_array(arr, w_val, count=False):
+ space = arr.space
+ tp_item = space.type(w_val)
+ arrclass = arr.__class__
+ cnt = 0
+ for i in range(arr.len):
+ index_count_jd.jit_merge_point(
+ tp_item=tp_item, count=count,
+ arrclass=arrclass)
+ w_item = arr.w_getitem(space, i)
+ if space.eq_w(w_item, w_val):
+ if count:
+ cnt += 1
+ else:
+ return i
+ if count:
+ return cnt
+ return -1
+
UNICODE_ARRAY = lltype.Ptr(lltype.Array(lltype.UniChar,
hints={'nolength': True}))
@@ -257,17 +280,12 @@
"""
self.extend(w_x)
- def descr_count(self, space, w_val):
+ def descr_count(self, space, w_x):
""" count(x)
Return number of occurrences of x in the array.
"""
- cnt = 0
- for i in range(self.len):
- # XXX jitdriver
- w_item = self.w_getitem(space, i)
- if space.eq_w(w_item, w_val):
- cnt += 1
+ cnt = index_count_array(self, w_x, count=True)
return space.newint(cnt)
def descr_index(self, space, w_x):
@@ -275,10 +293,9 @@
Return index of first occurrence of x in the array.
"""
- for i in range(self.len):
- w_item = self.w_getitem(space, i)
- if space.eq_w(w_item, w_x):
- return space.newint(i)
+ res = index_count_array(self, w_x, count=False)
+ if res >= 0:
+ return space.newint(res)
raise oefmt(space.w_ValueError, "array.index(x): x not in list")
def descr_reverse(self, space):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit