/tools/Ruby/lib/ruby/1.8/irb/workspace.rb

http://github.com/agross/netopenspace · Ruby · 107 lines · 87 code · 6 blank · 14 comment · 6 complexity · f659b441b85043833485abc425a8727c MD5 · raw file

  1. #
  2. # irb/workspace-binding.rb -
  3. # $Release Version: 0.9.5$
  4. # $Revision: 11708 $
  5. # $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
  6. # by Keiju ISHITSUKA(keiju@ruby-lang.org)
  7. #
  8. # --
  9. #
  10. #
  11. #
  12. module IRB
  13. class WorkSpace
  14. # create new workspace. set self to main if specified, otherwise
  15. # inherit main from TOPLEVEL_BINDING.
  16. def initialize(*main)
  17. if main[0].kind_of?(Binding)
  18. @binding = main.shift
  19. elsif IRB.conf[:SINGLE_IRB]
  20. @binding = TOPLEVEL_BINDING
  21. else
  22. case IRB.conf[:CONTEXT_MODE]
  23. when 0 # binding in proc on TOPLEVEL_BINDING
  24. @binding = eval("proc{binding}.call",
  25. TOPLEVEL_BINDING,
  26. __FILE__,
  27. __LINE__)
  28. when 1 # binding in loaded file
  29. require "tempfile"
  30. f = Tempfile.open("irb-binding")
  31. f.print <<EOF
  32. $binding = binding
  33. EOF
  34. f.close
  35. load f.path
  36. @binding = $binding
  37. when 2 # binding in loaded file(thread use)
  38. unless defined? BINDING_QUEUE
  39. require "thread"
  40. IRB.const_set("BINDING_QUEUE", SizedQueue.new(1))
  41. Thread.abort_on_exception = true
  42. Thread.start do
  43. eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
  44. end
  45. Thread.pass
  46. end
  47. @binding = BINDING_QUEUE.pop
  48. when 3 # binging in function on TOPLEVEL_BINDING(default)
  49. @binding = eval("def irb_binding; binding; end; irb_binding",
  50. TOPLEVEL_BINDING,
  51. __FILE__,
  52. __LINE__ - 3)
  53. end
  54. end
  55. if main.empty?
  56. @main = eval("self", @binding)
  57. else
  58. @main = main[0]
  59. IRB.conf[:__MAIN__] = @main
  60. case @main
  61. when Module
  62. @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
  63. else
  64. begin
  65. @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
  66. rescue TypeError
  67. IRB.fail CantChangeBinding, @main.inspect
  68. end
  69. end
  70. end
  71. eval("_=nil", @binding)
  72. end
  73. attr_reader :binding
  74. attr_reader :main
  75. def evaluate(context, statements, file = __FILE__, line = __LINE__)
  76. eval(statements, @binding, file, line)
  77. end
  78. # error message manipulator
  79. def filter_backtrace(bt)
  80. case IRB.conf[:CONTEXT_MODE]
  81. when 0
  82. return nil if bt =~ /\(irb_local_binding\)/
  83. when 1
  84. if(bt =~ %r!/tmp/irb-binding! or
  85. bt =~ %r!irb/.*\.rb! or
  86. bt =~ /irb\.rb/)
  87. return nil
  88. end
  89. when 2
  90. return nil if bt =~ /irb\/.*\.rb/
  91. when 3
  92. return nil if bt =~ /irb\/.*\.rb/
  93. bt.sub!(/:\s*in `irb_binding'/){""}
  94. end
  95. bt
  96. end
  97. def IRB.delete_caller
  98. end
  99. end
  100. end