#==============================================================================
# ■ EvalStackFix
#------------------------------------------------------------------------------
#   修正eval中抛出的异常的backtrace不正确,进而导致脚本编辑器跳转不正确的问题
# 使用方法:
#   直接插入脚本编辑器
#   放置位置应尽量靠近Main
# 注意事项:
#   本代码仅适用于RPG Maker Ace。相同的机制可应用于其他版本
#==============================================================================

module EvalStackFix
  module_function
  #--------------------------------------------------------------------------
  # ● 包装eval内容,截取正确的backtrace
  #--------------------------------------------------------------------------
  def wrap(script)
    "begin
#{script}
  # 上面一行没有缩进是因为script可能包含=begin关键字,而=begin前面不能有空格
rescue Exception=>e
  true_backtrace = Marshal.load(Marshal.dump(e.backtrace)) # deep clone
  e.define_singleton_method(:correct_backtrace) do
    e.backtrace.replace(true_backtrace)
  end
  raise e
end"
  end
end

alias rgss_main_no_eval_stack_fix rgss_main
def rgss_main(&proc)
  begin
    rgss_main_no_eval_stack_fix(&proc)
  rescue Exception=>e
    p e
    e.correct_backtrace if e.respond_to?(:correct_backtrace)
    p e.backtrace
    raise e
  end
end

alias eval_no_stack_fix eval
def eval(script, *args)
  eval_no_stack_fix(EvalStackFix.wrap(script), *args)
end