Imported File#ftype spec from rubyspecs.
[rbx.git] / lib / bin / describe
blob14f283c0f9cc0eeec0eb849a2c423e24c0a95fb2
1 require 'compiler/text'
3 # "Interactive" mode
4 def interactive()
5   require 'readline'
7   c = Compiler.new(Compiler::TextGenerator)
8   puts "Enter ? for help, ^D to exit."
10   while code = Readline.readline("rbx:describe> ")
11     if code == "?"
12       puts "Enter any valid Ruby expression to see its compilation process."
13       next
14     end
16     code = code.to_sexp
18     puts ""
19     puts code.indented_inspect
20     puts c.into_script(code).to_description.generator.text
21     puts ""
22   end
24   exit
25 end
27 require 'pp'
29 file = ARGV.shift
30 unless file
31   interactive()
32   exit 0
33 end
35 sexp = if File.exist? file then
36          File.to_sexp file
37        else
38          file.to_sexp
39        end
41 puts "Sexp:"
42 pp sexp
44 top = if File.exist? file then
45         Compiler.compile_file file
46       else
47         exit # HACK - Can't figure out compile_string problems
48         # Compiler.compile_string file
49       end
51 puts "\nBytecode:"
52 puts top.decode
54 extra = top.literals.to_a.find_all { |l| l.kind_of? CompiledMethod }
56 until extra.empty?
57   cm = extra.shift
58   puts "= #{cm.name} (0x#{cm.object_id.to_s(16)}) ======================"
59   puts cm.decode
60   extra += cm.literals.to_a.find_all { |l| l.kind_of? CompiledMethod }
61 end