def computeExpressionCall(self, call_node, call_args, call_kw, trace_collection): trace_collection.onExceptionRaiseExit(BaseException) # TODO: Until we have something to re-order the keyword arguments, we # need to skip this. For the immediate need, we avoid this complexity, # as a re-ordering will be needed. if call_kw is not None and ( not call_kw.isExpressionConstantRef() or call_kw.getConstant() != {} ): return call_node, None, None if call_kw is not None: return call_node, None, None if call_args is None: args_tuple = () else: assert ( call_args.isExpressionConstantRef() or call_args.isExpressionMakeTuple() ) args_tuple = call_args.getIterationValues() function_body = self.getFunctionRef().getFunctionBody() # TODO: Actually the above disables it entirely, as it is at least # the empty dictionary node in any case. We will need some enhanced # interfaces for "matchCall" to work on. call_spec = function_body.getParameters() try: args_dict = matchCall( func_name=self.getName(), args=call_spec.getArgumentNames(), star_list_arg=call_spec.getStarListArgumentName(), star_dict_arg=call_spec.getStarDictArgumentName(), num_defaults=call_spec.getDefaultCount(), num_posonly=call_spec.getPositionalOnlyCount(), positional=args_tuple, pairs=(), ) values = [args_dict[name] for name in call_spec.getParameterNames()] result = ExpressionFunctionCall( function=self, values=values, source_ref=call_node.getSourceReference() ) return ( result, "new_statements", # TODO: More appropriate tag maybe. """\ Replaced call to created function body '%s' with direct \ function call.""" % self.getName(), ) except TooManyArguments as e: result = wrapExpressionWithSideEffects( new_node=makeRaiseExceptionReplacementExpressionFromInstance( expression=call_node, exception=e.getRealException() ), old_node=call_node, side_effects=call_node.extractSideEffectsPreCall(), ) return ( result, "new_raise", # TODO: More appropriate tag maybe. """Replaced call to created function body '%s' to argument \ error""" % self.getName(), )
def computeExpressionCall(self, call_node, call_args, call_kw, trace_collection): trace_collection.onExceptionRaiseExit(BaseException) # TODO: Until we have something to re-order the keyword arguments, we # need to skip this. For the immediate need, we avoid this complexity, # as a re-ordering will be needed. if call_kw is not None and not call_kw.isExpressionConstantDictEmptyRef( ): return call_node, None, None if call_args is None: args_tuple = () else: assert (call_args.isExpressionConstantTupleRef() or call_args.isExpressionMakeTuple()) args_tuple = call_args.getIterationValues() function_body = self.subnode_function_ref.getFunctionBody() # TODO: Actually the above disables it entirely, as it is at least # the empty dictionary node in any case. We will need some enhanced # interfaces for "matchCall" to work on. call_spec = function_body.getParameters() try: args_dict = matchCall( func_name=self.getName(), args=call_spec.getArgumentNames(), kw_only_args=call_spec.getKwOnlyParameterNames(), star_list_arg=call_spec.getStarListArgumentName(), star_dict_arg=call_spec.getStarDictArgumentName(), num_defaults=call_spec.getDefaultCount(), num_posonly=call_spec.getPosOnlyParameterCount(), positional=args_tuple, pairs=(), ) values = [ args_dict[name] for name in call_spec.getParameterNames() ] # TODO: Not handling default values either yet. if None in values: return call_node, None, None # TODO: This is probably something that the matchCall ought to do # for us, but that will need cleanups. Also these functions and # nodes ought to work with # ordered dictionaries maybe. if call_spec.getStarDictArgumentName(): values[-1] = makeDictCreationOrConstant2( keys=[value[0] for value in values[-1]], values=[value[1] for value in values[-1]], source_ref=call_node.source_ref, ) result = ExpressionFunctionCall(function=self, values=values, source_ref=call_node.source_ref) return ( result, "new_statements", # TODO: More appropriate tag maybe. """\ Replaced call to created function body '%s' with direct \ function call.""" % self.getName(), ) except TooManyArguments as e: result = wrapExpressionWithSideEffects( new_node=makeRaiseExceptionReplacementExpressionFromInstance( expression=call_node, exception=e.getRealException()), old_node=call_node, side_effects=call_node.extractSideEffectsPreCall(), ) return ( result, "new_raise", # TODO: More appropriate tag maybe. """Replaced call to created function body '%s' to argument \ error""" % self.getName(), )