def call(self, this, args=()):
if not hasattr(args, '<STR_LIT>'):  <EOL><INDENT>args = (args, )<EOL><DEDENT>args = tuple(Js(e) for e in args)  <EOL>arguments = PyJsArguments(<EOL>args, self)  <EOL>arglen = self.argcount  <EOL>if len(args) > arglen:<EOL><INDENT>args = args[<NUM_LIT:0>:arglen]<EOL><DEDENT>elif len(args) < arglen:<EOL><INDENT>args += (undefined, ) * (arglen - len(args))<EOL><DEDENT>args += this, arguments  <EOL>try:<EOL><INDENT>return Js(self.code(*args))<EOL><DEDENT>except NotImplementedError:<EOL><INDENT>raise<EOL><DEDENT>except RuntimeError as e:  <EOL><INDENT>raise MakeError(<EOL>'<STR_LIT>', e.message if<EOL>not isinstance(e, NotImplementedError) else '<STR_LIT>')<EOL><DEDENT>
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).