def infer_call_result(self, caller=None, context=None):
if self.is_generator():<EOL><INDENT>if isinstance(self, AsyncFunctionDef):<EOL><INDENT>generator_cls = bases.AsyncGenerator<EOL><DEDENT>else:<EOL><INDENT>generator_cls = bases.Generator<EOL><DEDENT>result = generator_cls(self)<EOL>yield result<EOL>return<EOL><DEDENT>if (<EOL>self.name == "<STR_LIT>"<EOL>and len(self.args.args) == <NUM_LIT:1><EOL>and self.args.vararg is not None<EOL>):<EOL><INDENT>metaclass = next(caller.args[<NUM_LIT:0>].infer(context))<EOL>if isinstance(metaclass, ClassDef):<EOL><INDENT>class_bases = [next(arg.infer(context)) for arg in caller.args[<NUM_LIT:1>:]]<EOL>new_class = ClassDef(name="<STR_LIT>")<EOL>new_class.hide = True<EOL>new_class.parent = self<EOL>new_class.postinit(<EOL>bases=[base for base in class_bases if base != util.Uninferable],<EOL>body=[],<EOL>decorators=[],<EOL>metaclass=metaclass,<EOL>)<EOL>yield new_class<EOL>return<EOL><DEDENT><DEDENT>returns = self._get_return_nodes_skip_functions()<EOL>first_return = next(returns, None)<EOL>if not first_return:<EOL><INDENT>raise exceptions.InferenceError("<STR_LIT>")<EOL><DEDENT>for returnnode in itertools.chain((first_return,), returns):<EOL><INDENT>if returnnode.value is None:<EOL><INDENT>yield node_classes.Const(None)<EOL><DEDENT>else:<EOL><INDENT>try:<EOL><INDENT>yield from returnnode.value.infer(context)<EOL><DEDENT>except exceptions.InferenceError:<EOL><INDENT>yield util.Uninferable<EOL><DEDENT><DEDENT><DEDENT>
Infer what the function returns when called.

        :returns: What the function returns.
        :rtype: iterable(NodeNG or Uninferable) or None