Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: Changeset: r64912:cc52d477c5f3 Date: 2013-06-14 18:51 +0200 http://bitbucket.org/pypy/pypy/changeset/cc52d477c5f3/
Log: don't really need to use such heavy machinery diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py --- a/rpython/rlib/rstring.py +++ b/rpython/rlib/rstring.py @@ -83,6 +83,67 @@ return res +@specialize.argtype(0) +def replace(input, sub, by, maxsplit=-1): + if isinstance(input, str): + assert isinstance(sub, str) + assert isinstance(by, str) + Builder = StringBuilder + else: + assert isinstance(sub, unicode) + assert isinstance(by, unicode) + Builder = UnicodeBuilder + if maxsplit == 0: + return input + + if not sub: + upper = len(input) + if maxsplit > 0 and maxsplit < upper + 2: + upper = maxsplit - 1 + assert upper >= 0 + + try: + result_size = ovfcheck(upper * len(by)) + result_size = ovfcheck(result_size + upper) + result_size = ovfcheck(result_size + len(by)) + remaining_size = len(input) - upper + result_size = ovfcheck(result_size + remaining_size) + except OverflowError: + raise + builder = Builder(result_size) + for i in range(upper): + builder.append(by) + builder.append(input[i]) + builder.append(by) + builder.append_slice(input, upper, len(input)) + else: + # First compute the exact result size + count = input.count(sub) + if count > maxsplit and maxsplit > 0: + count = maxsplit + diff_len = len(by) - len(sub) + try: + result_size = ovfcheck(diff_len * count) + result_size = ovfcheck(result_size + len(input)) + except OverflowError: + raise + + builder = Builder(result_size) + start = 0 + sublen = len(sub) + + while maxsplit != 0: + next = input.find(sub, start) + if next < 0: + break + builder.append_slice(input, start, next) + builder.append(by) + start = next + sublen + maxsplit -= 1 # NB. if it's already < 0, it stays < 0 + + builder.append_slice(input, start, len(input)) + + return builder.build() # -------------- public API --------------------------------- @@ -304,73 +365,3 @@ hop.exception_cannot_occur() - -def make_replace(func_name, Builder): - def replace(input, sub, by, maxsplit=-1): - if maxsplit == 0: - return input - - if not sub: - upper = len(input) - if maxsplit > 0 and maxsplit < upper + 2: - upper = maxsplit - 1 - assert upper >= 0 - - try: - result_size = ovfcheck(upper * len(by)) - result_size = ovfcheck(result_size + upper) - result_size = ovfcheck(result_size + len(by)) - remaining_size = len(input) - upper - result_size = ovfcheck(result_size + remaining_size) - except OverflowError: - raise - builder = Builder(result_size) - for i in range(upper): - builder.append(by) - builder.append(input[i]) - builder.append(by) - builder.append_slice(input, upper, len(input)) - else: - # First compute the exact result size - count = input.count(sub) - if count > maxsplit and maxsplit > 0: - count = maxsplit - diff_len = len(by) - len(sub) - try: - result_size = ovfcheck(diff_len * count) - result_size = ovfcheck(result_size + len(input)) - except OverflowError: - raise - - builder = Builder(result_size) - start = 0 - sublen = len(sub) - - while maxsplit != 0: - next = input.find(sub, start) - if next < 0: - break - builder.append_slice(input, start, next) - builder.append(by) - start = next + sublen - maxsplit -= 1 # NB. if it's already < 0, it stays < 0 - - builder.append_slice(input, start, len(input)) - - return builder.build() - replace.func_name = func_name - return replace - -_string_replace = make_replace("_string_replace", StringBuilder) -_unicode_replace = make_replace("_unicode_replace", UnicodeBuilder) - -@specialize.argtype(0) -def replace(input, sub, by, maxsplit=-1): - if isinstance(input, str): - assert isinstance(sub, str) - assert isinstance(by, str) - return _string_replace(input, sub, by, maxsplit) - else: - assert isinstance(sub, unicode) - assert isinstance(by, unicode) - return _unicode_replace(input, sub, by, maxsplit) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit