'Calls this function and returns a result
(converted to PyJs type so func can return python types)
this must be a PyJs object and args must be a python tuple of PyJs objects.
arguments object is passed automatically and will be equal to Js(args)
(tuple converted to arguments object).You dont need to worry about number
of arguments you provide if you supply less then missing ones will be set
to undefined (but not present in arguments object).
And if you supply too much then excess will not be passed
(but they will be present in arguments object).'

def call(self, this, args=()):

    if (not hasattr(args, '__iter__')):
        args = (args,)
    args = tuple((Js(e) for e in args))
    arguments = PyJsArguments(args, self)
    arglen = self.argcount
    if (len(args) > arglen):
        args = args[0:arglen]
    elif (len(args) < arglen):
        args += ((undefined,) * (arglen - len(args)))
    args += (this, arguments)
    try:
        return Js(self.code(*args))
    except NotImplementedError:
        raise
    except RuntimeError as e:
        raise MakeError('RangeError', (e.message if (not isinstance(e, NotImplementedError)) else 'Not    implemented!'))
