class_docstr: This mixin provides ability to split the code into subroutines based on
  the size of the AST.
  
  Subclasses only need to implement `create_code_generator` method.
  
  Their code generators should implement 3 methods:
       - function_definition;
       - function_invocation;
       - add_return_statement.
  
  Interpreter should prepare at least one subroutine using method
  `enqueue_subroutine` and then call method `process_subroutine_queue` with
  instance of code generator, which will be populated with the result code.
docstr: Handles single subroutine. Creates new code generator and defines a
  function for a given subroutine.
docstr_tok: ["Handles","single","subroutine",".","Creates","new","code","generator","and","defines","a","function","for","a","given","subroutine","."]
code: def _process_subroutine(self, subroutine):
      """
      Handles single subroutine. Creates new code generator and defines a
      function for a given subroutine.
      """
      is_vector_output = subroutine.expr.output_size > 1
  
      self._cg = self.create_code_generator()
  
      with self._cg.function_definition(
          name=subroutine.name,
          args=[(True, self._feature_array_name)],
          is_vector_output=is_vector_output,
      ):
          last_result = self._do_interpret(subroutine.expr)
          self._cg.add_return_statement(last_result)
  
      return self._cg.finalize_and_get_generated_code()
  
imports: import math
  import sys
  from collections import namedtuple
  from m2cgen import ast
  from m2cgen.interpreters.interpreter import BaseToCodeInterpreter
label_desc: Use image node_id 6 for calling the SubroutinesMixin obj's underlying member method code with example usage: obj._process_subroutine(subroutine) and returns: self