Commit 18e95bca authored by Jérome Perrin's avatar Jérome Perrin Committed by Arnaud Fontaine

patches/Restricted: no need to patch sorted on py3

In current versions, sorted is allowed in RestrictedPython.

Also, our implementation of sorted was not correct with generators,
it consumed the generator by iterating on it a first time to check the
values.
parent 56d89108
...@@ -177,16 +177,21 @@ import past.builtins # six.PY2 ...@@ -177,16 +177,21 @@ import past.builtins # six.PY2
allow_module('past.builtins') allow_module('past.builtins')
ModuleSecurityInfo('past.builtins').declarePublic('cmp') ModuleSecurityInfo('past.builtins').declarePublic('cmp')
def guarded_sorted(seq, cmp=None, key=None, reverse=False): if six.PY2:
if cmp is not None: # six.PY2 def guarded_sorted(seq, cmp=None, key=None, reverse=False):
from functools import cmp_to_key if cmp is not None:
key = cmp_to_key(cmp) from functools import cmp_to_key
key = cmp_to_key(cmp)
if not isinstance(seq, SafeIter):
for i, x in enumerate(seq):
guard(seq, x, i)
return sorted(seq, key=key, reverse=reverse)
safe_builtins['sorted'] = guarded_sorted
if not isinstance(seq, SafeIter): def guarded_enumerate(seq, start=0):
for i, x in enumerate(seq): return NullIter(enumerate(guarded_iter(seq), start=start))
guard(seq, x, i) safe_builtins['enumerate'] = guarded_enumerate
return sorted(seq, key=key, reverse=reverse)
safe_builtins['sorted'] = guarded_sorted
def guarded_reversed(seq): def guarded_reversed(seq):
return SafeIter(reversed(seq)) return SafeIter(reversed(seq))
...@@ -195,9 +200,6 @@ ContainerAssertions[reversed] = 1 ...@@ -195,9 +200,6 @@ ContainerAssertions[reversed] = 1
# listreverseiterator is a special type, returned by list.__reversed__ # listreverseiterator is a special type, returned by list.__reversed__
ContainerAssertions[type(reversed([]))] = 1 ContainerAssertions[type(reversed([]))] = 1
def guarded_enumerate(seq, start=0):
return NullIter(enumerate(guarded_iter(seq), start=start))
safe_builtins['enumerate'] = guarded_enumerate
def get_set_pop(s, name): def get_set_pop(s, name):
def guarded_pop(): def guarded_pop():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment