| Index: tools/telemetry/third_party/rope/rope/base/builtins.py
|
| diff --git a/tools/telemetry/third_party/rope/rope/base/builtins.py b/tools/telemetry/third_party/rope/rope/base/builtins.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..33729d5bd7167c76ea3e6f5c1393a54dbd35dd39
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/rope/base/builtins.py
|
| @@ -0,0 +1,804 @@
|
| +"""This module trys to support builtin types and functions."""
|
| +import inspect
|
| +try:
|
| + raw_input
|
| +except NameError:
|
| + raw_input = input
|
| +
|
| +import rope.base.evaluate
|
| +from rope.base import pynames, pyobjects, arguments, utils, ast
|
| +
|
| +
|
| +class BuiltinModule(pyobjects.AbstractModule):
|
| +
|
| + def __init__(self, name, pycore=None, initial={}):
|
| + super(BuiltinModule, self).__init__()
|
| + self.name = name
|
| + self.pycore = pycore
|
| + self.initial = initial
|
| +
|
| + parent = None
|
| +
|
| + def get_attributes(self):
|
| + return self.attributes
|
| +
|
| + def get_doc(self):
|
| + if self.module:
|
| + return self.module.__doc__
|
| +
|
| + def get_name(self):
|
| + return self.name.split('.')[-1]
|
| +
|
| + @property
|
| + @utils.saveit
|
| + def attributes(self):
|
| + result = _object_attributes(self.module, self)
|
| + result.update(self.initial)
|
| + if self.pycore is not None:
|
| + submodules = self.pycore._builtin_submodules(self.name)
|
| + for name, module in submodules.items():
|
| + result[name] = rope.base.builtins.BuiltinName(module)
|
| + return result
|
| +
|
| + @property
|
| + @utils.saveit
|
| + def module(self):
|
| + try:
|
| + result = __import__(self.name)
|
| + for token in self.name.split('.')[1:]:
|
| + result = getattr(result, token, None)
|
| + return result
|
| + except ImportError:
|
| + return
|
| +
|
| +
|
| +class _BuiltinElement(object):
|
| +
|
| + def __init__(self, builtin, parent=None):
|
| + self.builtin = builtin
|
| + self._parent = parent
|
| +
|
| + def get_doc(self):
|
| + if self.builtin:
|
| + return getattr(self.builtin, '__doc__', None)
|
| +
|
| + def get_name(self):
|
| + if self.builtin:
|
| + return getattr(self.builtin, '__name__', None)
|
| +
|
| + @property
|
| + def parent(self):
|
| + if self._parent is None:
|
| + return builtins
|
| + return self._parent
|
| +
|
| +
|
| +class BuiltinClass(_BuiltinElement, pyobjects.AbstractClass):
|
| +
|
| + def __init__(self, builtin, attributes, parent=None):
|
| + _BuiltinElement.__init__(self, builtin, parent)
|
| + pyobjects.AbstractClass.__init__(self)
|
| + self.initial = attributes
|
| +
|
| + @utils.saveit
|
| + def get_attributes(self):
|
| + result = _object_attributes(self.builtin, self)
|
| + result.update(self.initial)
|
| + return result
|
| +
|
| +
|
| +class BuiltinFunction(_BuiltinElement, pyobjects.AbstractFunction):
|
| +
|
| + def __init__(self, returned=None, function=None, builtin=None,
|
| + argnames=[], parent=None):
|
| + _BuiltinElement.__init__(self, builtin, parent)
|
| + pyobjects.AbstractFunction.__init__(self)
|
| + self.argnames = argnames
|
| + self.returned = returned
|
| + self.function = function
|
| +
|
| + def get_returned_object(self, args):
|
| + if self.function is not None:
|
| + return self.function(_CallContext(self.argnames, args))
|
| + else:
|
| + return self.returned
|
| +
|
| + def get_param_names(self, special_args=True):
|
| + return self.argnames
|
| +
|
| +
|
| +class BuiltinUnknown(_BuiltinElement, pyobjects.PyObject):
|
| +
|
| + def __init__(self, builtin):
|
| + super(BuiltinUnknown, self).__init__(pyobjects.get_unknown())
|
| + self.builtin = builtin
|
| + self.type = pyobjects.get_unknown()
|
| +
|
| + def get_name(self):
|
| + return getattr(type(self.builtin), '__name__', None)
|
| +
|
| + @utils.saveit
|
| + def get_attributes(self):
|
| + return _object_attributes(self.builtin, self)
|
| +
|
| +
|
| +def _object_attributes(obj, parent):
|
| + attributes = {}
|
| + for name in dir(obj):
|
| + if name == 'None':
|
| + continue
|
| + try:
|
| + child = getattr(obj, name)
|
| + except AttributeError:
|
| + # descriptors are allowed to raise AttributeError
|
| + # even if they are in dir()
|
| + continue
|
| + pyobject = None
|
| + if inspect.isclass(child):
|
| + pyobject = BuiltinClass(child, {}, parent=parent)
|
| + elif inspect.isroutine(child):
|
| + pyobject = BuiltinFunction(builtin=child, parent=parent)
|
| + else:
|
| + pyobject = BuiltinUnknown(builtin=child)
|
| + attributes[name] = BuiltinName(pyobject)
|
| + return attributes
|
| +
|
| +
|
| +def _create_builtin_type_getter(cls):
|
| + def _get_builtin(*args):
|
| + if not hasattr(cls, '_generated'):
|
| + cls._generated = {}
|
| + if args not in cls._generated:
|
| + cls._generated[args] = cls(*args)
|
| + return cls._generated[args]
|
| + return _get_builtin
|
| +
|
| +
|
| +def _create_builtin_getter(cls):
|
| + type_getter = _create_builtin_type_getter(cls)
|
| +
|
| + def _get_builtin(*args):
|
| + return pyobjects.PyObject(type_getter(*args))
|
| + return _get_builtin
|
| +
|
| +
|
| +class _CallContext(object):
|
| +
|
| + def __init__(self, argnames, args):
|
| + self.argnames = argnames
|
| + self.args = args
|
| +
|
| + def _get_scope_and_pyname(self, pyname):
|
| + if pyname is not None and isinstance(pyname, pynames.AssignedName):
|
| + pymodule, lineno = pyname.get_definition_location()
|
| + if pymodule is None:
|
| + return None, None
|
| + if lineno is None:
|
| + lineno = 1
|
| + scope = pymodule.get_scope().get_inner_scope_for_line(lineno)
|
| + name = None
|
| + while name is None and scope is not None:
|
| + for current in scope.get_names():
|
| + if scope[current] is pyname:
|
| + name = current
|
| + break
|
| + else:
|
| + scope = scope.parent
|
| + return scope, name
|
| + return None, None
|
| +
|
| + def get_argument(self, name):
|
| + if self.args:
|
| + args = self.args.get_arguments(self.argnames)
|
| + return args[self.argnames.index(name)]
|
| +
|
| + def get_pyname(self, name):
|
| + if self.args:
|
| + args = self.args.get_pynames(self.argnames)
|
| + if name in self.argnames:
|
| + return args[self.argnames.index(name)]
|
| +
|
| + def get_arguments(self, argnames):
|
| + if self.args:
|
| + return self.args.get_arguments(argnames)
|
| +
|
| + def get_pynames(self, argnames):
|
| + if self.args:
|
| + return self.args.get_pynames(argnames)
|
| +
|
| + def get_per_name(self):
|
| + if self.args is None:
|
| + return None
|
| + pyname = self.args.get_instance_pyname()
|
| + scope, name = self._get_scope_and_pyname(pyname)
|
| + if name is not None:
|
| + pymodule = pyname.get_definition_location()[0]
|
| + return pymodule.pycore.object_info.get_per_name(scope, name)
|
| + return None
|
| +
|
| + def save_per_name(self, value):
|
| + if self.args is None:
|
| + return None
|
| + pyname = self.args.get_instance_pyname()
|
| + scope, name = self._get_scope_and_pyname(pyname)
|
| + if name is not None:
|
| + pymodule = pyname.get_definition_location()[0]
|
| + pymodule.pycore.object_info.save_per_name(scope, name, value)
|
| +
|
| +
|
| +class _AttributeCollector(object):
|
| +
|
| + def __init__(self, type):
|
| + self.attributes = {}
|
| + self.type = type
|
| +
|
| + def __call__(self, name, returned=None, function=None,
|
| + argnames=['self'], check_existence=True):
|
| + try:
|
| + builtin = getattr(self.type, name)
|
| + except AttributeError:
|
| + if check_existence:
|
| + raise
|
| + builtin = None
|
| + self.attributes[name] = BuiltinName(
|
| + BuiltinFunction(returned=returned, function=function,
|
| + argnames=argnames, builtin=builtin))
|
| +
|
| + def __setitem__(self, name, value):
|
| + self.attributes[name] = value
|
| +
|
| +
|
| +class List(BuiltinClass):
|
| +
|
| + def __init__(self, holding=None):
|
| + self.holding = holding
|
| + collector = _AttributeCollector(list)
|
| +
|
| + collector('__iter__', function=self._iterator_get)
|
| + collector('__new__', function=self._new_list)
|
| +
|
| + # Adding methods
|
| + collector('append', function=self._list_add,
|
| + argnames=['self', 'value'])
|
| + collector('__setitem__', function=self._list_add,
|
| + argnames=['self', 'index', 'value'])
|
| + collector('insert', function=self._list_add,
|
| + argnames=['self', 'index', 'value'])
|
| + collector('extend', function=self._self_set,
|
| + argnames=['self', 'iterable'])
|
| +
|
| + # Getting methods
|
| + collector('__getitem__', function=self._list_get)
|
| + collector('pop', function=self._list_get)
|
| + try:
|
| + collector('__getslice__', function=self._self_get)
|
| + except AttributeError:
|
| + pass
|
| +
|
| + super(List, self).__init__(list, collector.attributes)
|
| +
|
| + def _new_list(self, args):
|
| + return _create_builtin(args, get_list)
|
| +
|
| + def _list_add(self, context):
|
| + if self.holding is not None:
|
| + return
|
| + holding = context.get_argument('value')
|
| + if holding is not None and holding != pyobjects.get_unknown():
|
| + context.save_per_name(holding)
|
| +
|
| + def _self_set(self, context):
|
| + if self.holding is not None:
|
| + return
|
| + iterable = context.get_pyname('iterable')
|
| + holding = _infer_sequence_for_pyname(iterable)
|
| + if holding is not None and holding != pyobjects.get_unknown():
|
| + context.save_per_name(holding)
|
| +
|
| + def _list_get(self, context):
|
| + if self.holding is not None:
|
| + return self.holding
|
| + return context.get_per_name()
|
| +
|
| + def _iterator_get(self, context):
|
| + return get_iterator(self._list_get(context))
|
| +
|
| + def _self_get(self, context):
|
| + return get_list(self._list_get(context))
|
| +
|
| +
|
| +get_list = _create_builtin_getter(List)
|
| +get_list_type = _create_builtin_type_getter(List)
|
| +
|
| +
|
| +class Dict(BuiltinClass):
|
| +
|
| + def __init__(self, keys=None, values=None):
|
| + self.keys = keys
|
| + self.values = values
|
| + collector = _AttributeCollector(dict)
|
| + collector('__new__', function=self._new_dict)
|
| + collector('__setitem__', function=self._dict_add)
|
| + collector('popitem', function=self._item_get)
|
| + collector('pop', function=self._value_get)
|
| + collector('get', function=self._key_get)
|
| + collector('keys', function=self._key_list)
|
| + collector('values', function=self._value_list)
|
| + collector('items', function=self._item_list)
|
| + collector('copy', function=self._self_get)
|
| + collector('__getitem__', function=self._value_get)
|
| + collector('__iter__', function=self._key_iter)
|
| + collector('update', function=self._self_set)
|
| + super(Dict, self).__init__(dict, collector.attributes)
|
| +
|
| + def _new_dict(self, args):
|
| + def do_create(holding=None):
|
| + if holding is None:
|
| + return get_dict()
|
| + type = holding.get_type()
|
| + if isinstance(type, Tuple) and \
|
| + len(type.get_holding_objects()) == 2:
|
| + return get_dict(*type.get_holding_objects())
|
| + return _create_builtin(args, do_create)
|
| +
|
| + def _dict_add(self, context):
|
| + if self.keys is not None:
|
| + return
|
| + key, value = context.get_arguments(['self', 'key', 'value'])[1:]
|
| + if key is not None and key != pyobjects.get_unknown():
|
| + context.save_per_name(get_tuple(key, value))
|
| +
|
| + def _item_get(self, context):
|
| + if self.keys is not None:
|
| + return get_tuple(self.keys, self.values)
|
| + item = context.get_per_name()
|
| + if item is None or not isinstance(item.get_type(), Tuple):
|
| + return get_tuple(self.keys, self.values)
|
| + return item
|
| +
|
| + def _value_get(self, context):
|
| + item = self._item_get(context).get_type()
|
| + return item.get_holding_objects()[1]
|
| +
|
| + def _key_get(self, context):
|
| + item = self._item_get(context).get_type()
|
| + return item.get_holding_objects()[0]
|
| +
|
| + def _value_list(self, context):
|
| + return get_list(self._value_get(context))
|
| +
|
| + def _key_list(self, context):
|
| + return get_list(self._key_get(context))
|
| +
|
| + def _item_list(self, context):
|
| + return get_list(self._item_get(context))
|
| +
|
| + def _value_iter(self, context):
|
| + return get_iterator(self._value_get(context))
|
| +
|
| + def _key_iter(self, context):
|
| + return get_iterator(self._key_get(context))
|
| +
|
| + def _item_iter(self, context):
|
| + return get_iterator(self._item_get(context))
|
| +
|
| + def _self_get(self, context):
|
| + item = self._item_get(context).get_type()
|
| + key, value = item.get_holding_objects()[:2]
|
| + return get_dict(key, value)
|
| +
|
| + def _self_set(self, context):
|
| + if self.keys is not None:
|
| + return
|
| + new_dict = context.get_pynames(['self', 'd'])[1]
|
| + if new_dict and isinstance(new_dict.get_object().get_type(), Dict):
|
| + args = arguments.ObjectArguments([new_dict])
|
| + items = new_dict.get_object()['popitem'].\
|
| + get_object().get_returned_object(args)
|
| + context.save_per_name(items)
|
| + else:
|
| + holding = _infer_sequence_for_pyname(new_dict)
|
| + if holding is not None and isinstance(holding.get_type(), Tuple):
|
| + context.save_per_name(holding)
|
| +
|
| +
|
| +get_dict = _create_builtin_getter(Dict)
|
| +get_dict_type = _create_builtin_type_getter(Dict)
|
| +
|
| +
|
| +class Tuple(BuiltinClass):
|
| +
|
| + def __init__(self, *objects):
|
| + self.objects = objects
|
| + first = None
|
| + if objects:
|
| + first = objects[0]
|
| + attributes = {
|
| + '__getitem__': BuiltinName(BuiltinFunction(first)),
|
| + '__getslice__':
|
| + BuiltinName(BuiltinFunction(pyobjects.PyObject(self))),
|
| + '__new__': BuiltinName(BuiltinFunction(function=self._new_tuple)),
|
| + '__iter__': BuiltinName(BuiltinFunction(get_iterator(first)))}
|
| + super(Tuple, self).__init__(tuple, attributes)
|
| +
|
| + def get_holding_objects(self):
|
| + return self.objects
|
| +
|
| + def _new_tuple(self, args):
|
| + return _create_builtin(args, get_tuple)
|
| +
|
| +
|
| +get_tuple = _create_builtin_getter(Tuple)
|
| +get_tuple_type = _create_builtin_type_getter(Tuple)
|
| +
|
| +
|
| +class Set(BuiltinClass):
|
| +
|
| + def __init__(self, holding=None):
|
| + self.holding = holding
|
| + collector = _AttributeCollector(set)
|
| + collector('__new__', function=self._new_set)
|
| +
|
| + self_methods = ['copy', 'difference', 'intersection',
|
| + 'symmetric_difference', 'union']
|
| + for method in self_methods:
|
| + collector(method, function=self._self_get)
|
| + collector('add', function=self._set_add)
|
| + collector('update', function=self._self_set)
|
| + collector('update', function=self._self_set)
|
| + collector('symmetric_difference_update', function=self._self_set)
|
| + collector('difference_update', function=self._self_set)
|
| +
|
| + collector('pop', function=self._set_get)
|
| + collector('__iter__', function=self._iterator_get)
|
| + super(Set, self).__init__(set, collector.attributes)
|
| +
|
| + def _new_set(self, args):
|
| + return _create_builtin(args, get_set)
|
| +
|
| + def _set_add(self, context):
|
| + if self.holding is not None:
|
| + return
|
| + holding = context.get_arguments(['self', 'value'])[1]
|
| + if holding is not None and holding != pyobjects.get_unknown():
|
| + context.save_per_name(holding)
|
| +
|
| + def _self_set(self, context):
|
| + if self.holding is not None:
|
| + return
|
| + iterable = context.get_pyname('iterable')
|
| + holding = _infer_sequence_for_pyname(iterable)
|
| + if holding is not None and holding != pyobjects.get_unknown():
|
| + context.save_per_name(holding)
|
| +
|
| + def _set_get(self, context):
|
| + if self.holding is not None:
|
| + return self.holding
|
| + return context.get_per_name()
|
| +
|
| + def _iterator_get(self, context):
|
| + return get_iterator(self._set_get(context))
|
| +
|
| + def _self_get(self, context):
|
| + return get_list(self._set_get(context))
|
| +
|
| +
|
| +get_set = _create_builtin_getter(Set)
|
| +get_set_type = _create_builtin_type_getter(Set)
|
| +
|
| +
|
| +class Str(BuiltinClass):
|
| +
|
| + def __init__(self):
|
| + self_object = pyobjects.PyObject(self)
|
| + collector = _AttributeCollector(str)
|
| + collector('__iter__', get_iterator(self_object), check_existence=False)
|
| +
|
| + self_methods = ['__getitem__', 'capitalize', 'center',
|
| + 'encode', 'expandtabs', 'join', 'ljust',
|
| + 'lower', 'lstrip', 'replace', 'rjust', 'rstrip',
|
| + 'strip', 'swapcase', 'title', 'translate', 'upper',
|
| + 'zfill']
|
| + for method in self_methods:
|
| + collector(method, self_object)
|
| +
|
| + py2_self_methods = ["__getslice__", "decode"]
|
| + for method in py2_self_methods:
|
| + try:
|
| + collector(method, self_object)
|
| + except AttributeError:
|
| + pass
|
| +
|
| + for method in ['rsplit', 'split', 'splitlines']:
|
| + collector(method, get_list(self_object))
|
| +
|
| + super(Str, self).__init__(str, collector.attributes)
|
| +
|
| + def get_doc(self):
|
| + return str.__doc__
|
| +
|
| +
|
| +get_str = _create_builtin_getter(Str)
|
| +get_str_type = _create_builtin_type_getter(Str)
|
| +
|
| +
|
| +class BuiltinName(pynames.PyName):
|
| +
|
| + def __init__(self, pyobject):
|
| + self.pyobject = pyobject
|
| +
|
| + def get_object(self):
|
| + return self.pyobject
|
| +
|
| + def get_definition_location(self):
|
| + return (None, None)
|
| +
|
| +
|
| +class Iterator(pyobjects.AbstractClass):
|
| +
|
| + def __init__(self, holding=None):
|
| + super(Iterator, self).__init__()
|
| + self.holding = holding
|
| + self.attributes = {
|
| + 'next': BuiltinName(BuiltinFunction(self.holding)),
|
| + '__iter__': BuiltinName(BuiltinFunction(self))}
|
| +
|
| + def get_attributes(self):
|
| + return self.attributes
|
| +
|
| + def get_returned_object(self, args):
|
| + return self.holding
|
| +
|
| +get_iterator = _create_builtin_getter(Iterator)
|
| +
|
| +
|
| +class Generator(pyobjects.AbstractClass):
|
| +
|
| + def __init__(self, holding=None):
|
| + super(Generator, self).__init__()
|
| + self.holding = holding
|
| + self.attributes = {
|
| + 'next': BuiltinName(BuiltinFunction(self.holding)),
|
| + '__iter__': BuiltinName(BuiltinFunction(
|
| + get_iterator(self.holding))),
|
| + 'close': BuiltinName(BuiltinFunction()),
|
| + 'send': BuiltinName(BuiltinFunction()),
|
| + 'throw': BuiltinName(BuiltinFunction())}
|
| +
|
| + def get_attributes(self):
|
| + return self.attributes
|
| +
|
| + def get_returned_object(self, args):
|
| + return self.holding
|
| +
|
| +get_generator = _create_builtin_getter(Generator)
|
| +
|
| +
|
| +class File(BuiltinClass):
|
| +
|
| + def __init__(self):
|
| + str_object = get_str()
|
| + str_list = get_list(get_str())
|
| + attributes = {}
|
| +
|
| + def add(name, returned=None, function=None):
|
| + builtin = getattr(open, name, None)
|
| + attributes[name] = BuiltinName(
|
| + BuiltinFunction(returned=returned, function=function,
|
| + builtin=builtin))
|
| + add('__iter__', get_iterator(str_object))
|
| + for method in ['next', 'read', 'readline', 'readlines']:
|
| + add(method, str_list)
|
| + for method in ['close', 'flush', 'lineno', 'isatty', 'seek', 'tell',
|
| + 'truncate', 'write', 'writelines']:
|
| + add(method)
|
| + super(File, self).__init__(open, attributes)
|
| +
|
| +
|
| +get_file = _create_builtin_getter(File)
|
| +get_file_type = _create_builtin_type_getter(File)
|
| +
|
| +
|
| +class Property(BuiltinClass):
|
| +
|
| + def __init__(self, fget=None, fset=None, fdel=None, fdoc=None):
|
| + self._fget = fget
|
| + self._fdoc = fdoc
|
| + attributes = {
|
| + 'fget': BuiltinName(BuiltinFunction()),
|
| + 'fset': BuiltinName(pynames.UnboundName()),
|
| + 'fdel': BuiltinName(pynames.UnboundName()),
|
| + '__new__': BuiltinName(
|
| + BuiltinFunction(function=_property_function))}
|
| + super(Property, self).__init__(property, attributes)
|
| +
|
| + def get_property_object(self, args):
|
| + if isinstance(self._fget, pyobjects.AbstractFunction):
|
| + return self._fget.get_returned_object(args)
|
| +
|
| +
|
| +def _property_function(args):
|
| + parameters = args.get_arguments(['fget', 'fset', 'fdel', 'fdoc'])
|
| + return pyobjects.PyObject(Property(parameters[0]))
|
| +
|
| +
|
| +class Lambda(pyobjects.AbstractFunction):
|
| +
|
| + def __init__(self, node, scope):
|
| + super(Lambda, self).__init__()
|
| + self.node = node
|
| + self.arguments = node.args
|
| + self.scope = scope
|
| +
|
| + def get_returned_object(self, args):
|
| + result = rope.base.evaluate.eval_node(self.scope, self.node.body)
|
| + if result is not None:
|
| + return result.get_object()
|
| + else:
|
| + return pyobjects.get_unknown()
|
| +
|
| + def get_module(self):
|
| + return self.parent.get_module()
|
| +
|
| + def get_scope(self):
|
| + return self.scope
|
| +
|
| + def get_kind(self):
|
| + return 'lambda'
|
| +
|
| + def get_ast(self):
|
| + return self.node
|
| +
|
| + def get_attributes(self):
|
| + return {}
|
| +
|
| + def get_name(self):
|
| + return 'lambda'
|
| +
|
| + def get_param_names(self, special_args=True):
|
| + result = [node.id for node in self.arguments.args
|
| + if isinstance(node, ast.Name)]
|
| + if self.arguments.vararg:
|
| + result.append('*' + self.arguments.vararg)
|
| + if self.arguments.kwarg:
|
| + result.append('**' + self.arguments.kwarg)
|
| + return result
|
| +
|
| + @property
|
| + def parent(self):
|
| + return self.scope.pyobject
|
| +
|
| +
|
| +class BuiltinObject(BuiltinClass):
|
| +
|
| + def __init__(self):
|
| + super(BuiltinObject, self).__init__(object, {})
|
| +
|
| +
|
| +class BuiltinType(BuiltinClass):
|
| +
|
| + def __init__(self):
|
| + super(BuiltinType, self).__init__(type, {})
|
| +
|
| +
|
| +def _infer_sequence_for_pyname(pyname):
|
| + if pyname is None:
|
| + return None
|
| + seq = pyname.get_object()
|
| + args = arguments.ObjectArguments([pyname])
|
| + if '__iter__' in seq:
|
| + obj = seq['__iter__'].get_object()
|
| + if not isinstance(obj, pyobjects.AbstractFunction):
|
| + return None
|
| + iter = obj.get_returned_object(args)
|
| + if iter is not None and 'next' in iter:
|
| + holding = iter['next'].get_object().\
|
| + get_returned_object(args)
|
| + return holding
|
| +
|
| +
|
| +def _create_builtin(args, creator):
|
| + passed = args.get_pynames(['sequence'])[0]
|
| + if passed is None:
|
| + holding = None
|
| + else:
|
| + holding = _infer_sequence_for_pyname(passed)
|
| + if holding is not None:
|
| + return creator(holding)
|
| + else:
|
| + return creator()
|
| +
|
| +
|
| +def _range_function(args):
|
| + return get_list()
|
| +
|
| +
|
| +def _reversed_function(args):
|
| + return _create_builtin(args, get_iterator)
|
| +
|
| +
|
| +def _sorted_function(args):
|
| + return _create_builtin(args, get_list)
|
| +
|
| +
|
| +def _super_function(args):
|
| + passed_class, passed_self = args.get_arguments(['type', 'self'])
|
| + if passed_self is None:
|
| + return passed_class
|
| + else:
|
| + #pyclass = passed_self.get_type()
|
| + pyclass = passed_class
|
| + if isinstance(pyclass, pyobjects.AbstractClass):
|
| + supers = pyclass.get_superclasses()
|
| + if supers:
|
| + return pyobjects.PyObject(supers[0])
|
| + return passed_self
|
| +
|
| +
|
| +def _zip_function(args):
|
| + args = args.get_pynames(['sequence'])
|
| + objects = []
|
| + for seq in args:
|
| + if seq is None:
|
| + holding = None
|
| + else:
|
| + holding = _infer_sequence_for_pyname(seq)
|
| + objects.append(holding)
|
| + tuple = get_tuple(*objects)
|
| + return get_list(tuple)
|
| +
|
| +
|
| +def _enumerate_function(args):
|
| + passed = args.get_pynames(['sequence'])[0]
|
| + if passed is None:
|
| + holding = None
|
| + else:
|
| + holding = _infer_sequence_for_pyname(passed)
|
| + tuple = get_tuple(None, holding)
|
| + return get_iterator(tuple)
|
| +
|
| +
|
| +def _iter_function(args):
|
| + passed = args.get_pynames(['sequence'])[0]
|
| + if passed is None:
|
| + holding = None
|
| + else:
|
| + holding = _infer_sequence_for_pyname(passed)
|
| + return get_iterator(holding)
|
| +
|
| +
|
| +def _input_function(args):
|
| + return get_str()
|
| +
|
| +
|
| +_initial_builtins = {
|
| + 'list': BuiltinName(get_list_type()),
|
| + 'dict': BuiltinName(get_dict_type()),
|
| + 'tuple': BuiltinName(get_tuple_type()),
|
| + 'set': BuiltinName(get_set_type()),
|
| + 'str': BuiltinName(get_str_type()),
|
| + 'file': BuiltinName(get_file_type()),
|
| + 'open': BuiltinName(get_file_type()),
|
| + 'unicode': BuiltinName(get_str_type()),
|
| + 'range': BuiltinName(BuiltinFunction(function=_range_function,
|
| + builtin=range)),
|
| + 'reversed': BuiltinName(BuiltinFunction(function=_reversed_function,
|
| + builtin=reversed)),
|
| + 'sorted': BuiltinName(BuiltinFunction(function=_sorted_function,
|
| + builtin=sorted)),
|
| + 'super': BuiltinName(BuiltinFunction(function=_super_function,
|
| + builtin=super)),
|
| + 'property': BuiltinName(BuiltinFunction(function=_property_function,
|
| + builtin=property)),
|
| + 'zip': BuiltinName(BuiltinFunction(function=_zip_function, builtin=zip)),
|
| + 'enumerate': BuiltinName(BuiltinFunction(function=_enumerate_function,
|
| + builtin=enumerate)),
|
| + 'object': BuiltinName(BuiltinObject()),
|
| + 'type': BuiltinName(BuiltinType()),
|
| + 'iter': BuiltinName(BuiltinFunction(function=_iter_function,
|
| + builtin=iter)),
|
| + 'raw_input': BuiltinName(BuiltinFunction(function=_input_function,
|
| + builtin=raw_input)),
|
| +}
|
| +
|
| +builtins = BuiltinModule('__builtin__', initial=_initial_builtins)
|
|
|