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: This method should be called from the interpreter to start processing
  subroutine queue.
docstr_tok: ["This","method","should","be","called","from","the","interpreter","to","start","processing","subroutine","queue","."]
code: def process_subroutine_queue(self, top_code_generator):
      """
      This method should be called from the interpreter to start processing
      subroutine queue.
      """
      self._subroutine_idx = 0
  
      while len(self.subroutine_expr_queue):
          self._reset_reused_expr_cache()
          subroutine = self.subroutine_expr_queue.pop(0)
          subroutine_code = self._process_subroutine(subroutine)
          top_code_generator.add_code_lines(subroutine_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 2 for calling the SubroutinesMixin obj's underlying member method code with example usage: obj.process_subroutine_queue(top_code_generator) without return types