title: Applescript - stack overflow in recursive function
body: <p>I have an AppleScript script that runs a recursive function that counts instances of inserted plugins.
  After each plugin that is inserted the function checks the CPU and decides whether there's a CPU overload or not.</p>
  
  <p>If a CPU overload was found, it starts to remove plugins until it reaches a point that is satisfactory.
  Then it returns the number of instances that was loaded on the computer.</p>
  
  <p>The problem is that I get a stack overflow after a certain amount of runs. Does AppleScript has a limit of internal recursive threads?</p>
  
  <pre><code>on plugin_recurse(mode, plugin_name, component, track_count, instance_count, has_ref, min_instances, last_max)
      try
          log "mode - " &amp; mode
          if mode is "ret" then return {track_count, instance_count, last_max}
  
          if mode is "add" then
              if (instance_count - (10 * track_count) = 0) then
                  create_track(component)
                  set track_count to track_count + 1
              end if
              set instance_count to instance_count + 1
              insert_plugin(plugin_name, component, track_count, instance_count)
              if has_ref then
                  set CPUover to false
                  if min_instances = 1 then
                      set mode to "ret"
                  else
                      set min_instances to min_instances - 1
                  end if
              else
                  set {CPUover, last_max} to check_cpu(last_max)
              end if
              if CPUover then
                  set mode to "sub"
              end if
          end if
  
          if mode is "sub" then
              if instance_count &gt; 1 then
                  remove_plugin(plugin_name, component, track_count, instance_count)
                  set instance_count to instance_count - 1
                  if ((10 * track_count) - instance_count = 10) then
                      remove_track(track_count)
                      set track_count to track_count - 1
                  end if
                  set {CPUover, last_max} to check_cpu(last_max)
                  if not CPUover then
                      set mode to "ret"
                  end if
              else
                  set mode to "ret"
              end if
          end if
          plugin_recurse(mode, plugin_name, component, track_count, instance_count, has_ref, min_instances, last_max)
      on error err
          error err
      end try
  end plugin_recurse
  </code></pre>