ytljit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/README +29 -0
  2. data/Rakefile +22 -0
  3. data/ext/code_alloc.c +266 -0
  4. data/ext/extconf.rb +3 -0
  5. data/ext/ytljit.c +527 -0
  6. data/ext/ytljit.h +285 -0
  7. data/lib/ytljit/asm.rb +205 -0
  8. data/lib/ytljit/asmext.rb +199 -0
  9. data/lib/ytljit/asmext_x64.rb +212 -0
  10. data/lib/ytljit/asmext_x86.rb +128 -0
  11. data/lib/ytljit/asmutil.rb +182 -0
  12. data/lib/ytljit/codespace.rb +92 -0
  13. data/lib/ytljit/error.rb +7 -0
  14. data/lib/ytljit/instruction.rb +138 -0
  15. data/lib/ytljit/instruction_ia.rb +1298 -0
  16. data/lib/ytljit/instruction_x64.rb +41 -0
  17. data/lib/ytljit/instruction_x86.rb +11 -0
  18. data/lib/ytljit/marshal.rb +133 -0
  19. data/lib/ytljit/matcher.rb +235 -0
  20. data/lib/ytljit/rubyvm.rb +63 -0
  21. data/lib/ytljit/struct.rb +125 -0
  22. data/lib/ytljit/type.rb +112 -0
  23. data/lib/ytljit/util.rb +63 -0
  24. data/lib/ytljit/vm.rb +1649 -0
  25. data/lib/ytljit/vm_codegen.rb +491 -0
  26. data/lib/ytljit/vm_inline_method.rb +85 -0
  27. data/lib/ytljit/vm_inspect.rb +74 -0
  28. data/lib/ytljit/vm_sendnode.rb +561 -0
  29. data/lib/ytljit/vm_trans.rb +508 -0
  30. data/lib/ytljit/vm_type.rb +299 -0
  31. data/lib/ytljit/vm_type_gen.rb +158 -0
  32. data/lib/ytljit/vm_typeinf.rb +98 -0
  33. data/lib/ytljit.rb +46 -0
  34. data/test/asmsample.rb +117 -0
  35. data/test/cstest.rb +61 -0
  36. data/test/marshaltest.rb +27 -0
  37. data/test/test_assemble.rb +148 -0
  38. data/test/test_assemble2.rb +286 -0
  39. data/test/test_codespace.rb +102 -0
  40. data/test/test_typeinf.rb +21 -0
  41. data/test/tivmtest.rb +54 -0
  42. data/test/vmtest.rb +59 -0
  43. data/test/vmtest2.rb +41 -0
  44. data/test/vmtest3.rb +22 -0
  45. data/test/vmtest_compile_only.rb +41 -0
  46. data/test/vmtest_execute_only.rb +22 -0
  47. metadata +121 -0
data/test/vmtest.rb ADDED
@@ -0,0 +1,59 @@
1
+ # test program
2
+ require 'ytljit'
3
+ require 'pp'
4
+
5
+ include YTLJit
6
+ is = RubyVM::InstructionSequence.compile(
7
+ # "class Foo; def test(x);a = 0; x= 1;lambda {a = a + 1};p a;end;end","", "", 0,
8
+ # "b = 0;def test(x);a = 0;lambda {a = a + 1};p a;end;test(0)","", "", 0,
9
+ # "def test(x);a = x + 1;p a; p x;end;test(3)","", "", 0,
10
+ # "def test(x);if x then a = 1 else a = 3 end;p a end;test(3)","", "", 0,
11
+ # "def test(x);if x == 3 then a = 1 else a = 3 end;p a end;test(3)","", "", 0,
12
+ # "def fib(x);if x < 2 then 1 else fib(x + -1) + fib(x + -2) end;end;p fib(35)","", "", 0,
13
+ # "def ffib(x);if x < 2 then 1.0 else ffib(x + -1) + ffib(x + -2) end;end;p ffib(5)","", "", 0,
14
+ # "def foo; [1, 2, 3][0] + [1, 2, 3][1] end; p foo", "", "", 0,
15
+ # "def foo(x); if x then x = 1 else x = 2 end; x; end; p foo(1)", "", "", 0,
16
+ # "def foo(x); if x then x = 2.0 else x = 1 end; x; end; p foo(1)", "", "", 0,
17
+ "def foo(x); yield(x) + 2; end; p foo(1) {|a| a + 1}", "", "", 0,
18
+ # "def id(x); x; end; p id(1); p id(1.0)", "", "", 0,
19
+ # "1.1","", "", 0,
20
+ { :peephole_optimization => true,
21
+ :inline_const_cache => false,
22
+ :specialized_instruction => false,}
23
+ ).to_a
24
+ iseq = VMLib::InstSeqTree.new(nil, is)
25
+ pp iseq
26
+
27
+ tr = VM::YARVTranslatorSimple.new([iseq])
28
+ #tr.translate.compile(context)
29
+ tnode = tr.translate
30
+ # tnode.inspect_by_graph
31
+ context = VM::CollectInfoContext.new(tnode)
32
+ tnode.collect_info(context)
33
+ context = VM::TypeInferenceContext.new(tnode)
34
+ begin
35
+ pp "do type inference"
36
+ tnode.collect_candidate_type(context, [], [])
37
+ pp context.convergent
38
+ end until context.convergent
39
+ tnode.collect_candidate_type(context, [], [])
40
+
41
+ tnode = Marshal.load(Marshal.dump(tnode))
42
+ context = VM::CompileContext.new(tnode)
43
+ tnode.compile(context)
44
+ # context.code_space.disassemble
45
+ p tnode.code_space
46
+ # tnode.code_space.disassemble
47
+ =begin
48
+ asm = Assembler.new(tnode.code_space)
49
+ asm.with_retry do
50
+ end
51
+ tnode.code_space.disassemble
52
+ =end
53
+ tnode.code_space_tab.each do |cs|
54
+ cs.fill_disasm_cache
55
+ end
56
+ tnode.code_space.disassemble
57
+
58
+ tnode.code_space.call(tnode.code_space.base_address)
59
+
data/test/vmtest2.rb ADDED
@@ -0,0 +1,41 @@
1
+ # test program
2
+ require 'ytljit'
3
+ require 'pp'
4
+
5
+ include YTLJit
6
+ is = RubyVM::InstructionSequence.compile(
7
+ # "class Foo; def test(x);a = 0; x= 1;lambda {a = a + 1};p a;end;end","", "", 0,
8
+ # "b = 0;def test(x);a = 0;lambda {a = a + 1};p a;end;test(0)","", "", 0,
9
+ # "def test(x);a = x + 1;p a; p x;end;test(3)","", "", 0,
10
+ # "def test(x);if x then a = 1 else a = 3 end;p a end;test(3)","", "", 0,
11
+ # "def test(x);if x == 3 then a = 1 else a = 3 end;p a end;test(3)","", "", 0,
12
+ # "def fib(x);if x < 2 then 1 else fib(x + -1) + fib(x + -2) end;end;p fib(35)","", "", 0,
13
+ # "def ffib(x);if x < 2 then 1.0 else ffib(x + -1) + ffib(x + -2) end;end;p ffib(5)","", "", 0,
14
+ # "def foo; [1, 2, 3][0] + [1, 2, 3][1] end; p foo", "", "", 0,
15
+ # "def foo(x); if x then x = 1 else x = 2 end; x; end; p foo(1)", "", "", 0,
16
+ # "def foo(x); if x then x = 2.0 else x = 1 end; x; end; p foo(1)", "", "", 0,
17
+ "def foo(x); yield(x); end; p foo(1) {|a| a + 1}", "", "", 0,
18
+ # "1.1","", "", 0,
19
+ { :peephole_optimization => true,
20
+ :inline_const_cache => false,
21
+ :specialized_instruction => false,}
22
+ ).to_a
23
+ iseq = VMLib::InstSeqTree.new(nil, is)
24
+ pp iseq
25
+
26
+ tr = VM::YARVTranslatorSimple.new([iseq])
27
+ tnode = tr.translate
28
+ context = VM::CollectInfoContext.new(tnode)
29
+ tnode.collect_info(context)
30
+ context = VM::TypeInferenceContext.new(tnode)
31
+ tnode.collect_candidate_type(context, [], [])
32
+ tnode.collect_candidate_type(context, [], [])
33
+
34
+ context = VM::CompileContext.new(tnode)
35
+ tnode.compile(context)
36
+ p tnode.code_space
37
+
38
+ File.open("out.marshal", "w") do |fp|
39
+ fp.print Marshal.dump(tnode)
40
+ end
41
+
data/test/vmtest3.rb ADDED
@@ -0,0 +1,22 @@
1
+ # test program
2
+ require 'ytljit'
3
+ require 'pp'
4
+
5
+ include YTLJit
6
+ tnode = nil
7
+
8
+ File.open("out.marshal") do |fp|
9
+ tnode = Marshal.load(fp.read)
10
+ end
11
+ tnode.code_space_tab.each do |cs|
12
+ cs.update_refer
13
+ end
14
+
15
+ tnode.code_space_tab.each do |cs|
16
+ cs.fill_disasm_cache
17
+ end
18
+ tnode.code_space.disassemble
19
+
20
+ tnode.code_space.call(tnode.code_space.base_address)
21
+
22
+
@@ -0,0 +1,41 @@
1
+ # test program
2
+ require 'ytljit'
3
+ require 'pp'
4
+
5
+ include YTLJit
6
+ is = RubyVM::InstructionSequence.compile(
7
+ # "class Foo; def test(x);a = 0; x= 1;lambda {a = a + 1};p a;end;end","", "", 0,
8
+ # "b = 0;def test(x);a = 0;lambda {a = a + 1};p a;end;test(0)","", "", 0,
9
+ # "def test(x);a = x + 1;p a; p x;end;test(3)","", "", 0,
10
+ # "def test(x);if x then a = 1 else a = 3 end;p a end;test(3)","", "", 0,
11
+ # "def test(x);if x == 3 then a = 1 else a = 3 end;p a end;test(3)","", "", 0,
12
+ "def fib(x);if x < 2 then 1 else fib(x + -1) + fib(x + -2) end;end;p fib(35)","", "", 0,
13
+ # "def ffib(x);if x < 2 then 1.0 else ffib(x + -1) + ffib(x + -2) end;end;p ffib(5)","", "", 0,
14
+ # "def foo; [1, 2, 3][0] + [1, 2, 3][1] end; p foo", "", "", 0,
15
+ # "def foo(x); if x then x = 1 else x = 2 end; x; end; p foo(1)", "", "", 0,
16
+ # "def foo(x); if x then x = 2.0 else x = 1 end; x; end; p foo(1)", "", "", 0,
17
+ # "def foo(x); yield(x); end; p foo(1) {|a| a + 1}", "", "", 0,
18
+ # "1.1","", "", 0,
19
+ { :peephole_optimization => true,
20
+ :inline_const_cache => false,
21
+ :specialized_instruction => false,}
22
+ ).to_a
23
+ iseq = VMLib::InstSeqTree.new(nil, is)
24
+ pp iseq
25
+
26
+ tr = VM::YARVTranslatorSimple.new([iseq])
27
+ tnode = tr.translate
28
+ context = VM::CollectInfoContext.new(tnode)
29
+ tnode.collect_info(context)
30
+ File.open("out.marshal", "w") do |fp|
31
+ fp.print Marshal.dump(tnode)
32
+ end
33
+ context = VM::TypeInferenceContext.new(tnode)
34
+ tnode.collect_candidate_type(context, [], [])
35
+ tnode.collect_candidate_type(context, [], [])
36
+
37
+ context = VM::CompileContext.new(tnode)
38
+ tnode.compile(context)
39
+ p tnode.code_space
40
+
41
+
@@ -0,0 +1,22 @@
1
+ # test program
2
+ require 'ytljit'
3
+ require 'pp'
4
+
5
+ include YTLJit
6
+ tnode = nil
7
+
8
+ File.open("out.marshal") do |fp|
9
+ tnode = Marshal.load(fp.read)
10
+ end
11
+ tnode.code_space_tab.each do |cs|
12
+ cs.update_refer
13
+ end
14
+
15
+ tnode.code_space_tab.each do |cs|
16
+ cs.fill_disasm_cache
17
+ end
18
+ tnode.code_space.disassemble
19
+
20
+ tnode.code_space.call(tnode.code_space.base_address)
21
+
22
+
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ytljit
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Hideki Miura
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-18 00:00:00 +09:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description:
22
+ email:
23
+ executables: []
24
+
25
+ extensions:
26
+ - ext/extconf.rb
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/ytljit.rb
31
+ - lib/ytljit/asm.rb
32
+ - lib/ytljit/asmext.rb
33
+ - lib/ytljit/asmext_x64.rb
34
+ - lib/ytljit/asmext_x86.rb
35
+ - lib/ytljit/asmutil.rb
36
+ - lib/ytljit/codespace.rb
37
+ - lib/ytljit/error.rb
38
+ - lib/ytljit/instruction.rb
39
+ - lib/ytljit/instruction_ia.rb
40
+ - lib/ytljit/instruction_x64.rb
41
+ - lib/ytljit/instruction_x86.rb
42
+ - lib/ytljit/marshal.rb
43
+ - lib/ytljit/matcher.rb
44
+ - lib/ytljit/rubyvm.rb
45
+ - lib/ytljit/struct.rb
46
+ - lib/ytljit/type.rb
47
+ - lib/ytljit/util.rb
48
+ - lib/ytljit/vm.rb
49
+ - lib/ytljit/vm_codegen.rb
50
+ - lib/ytljit/vm_inline_method.rb
51
+ - lib/ytljit/vm_inspect.rb
52
+ - lib/ytljit/vm_sendnode.rb
53
+ - lib/ytljit/vm_trans.rb
54
+ - lib/ytljit/vm_type.rb
55
+ - lib/ytljit/vm_typeinf.rb
56
+ - lib/ytljit/vm_type_gen.rb
57
+ - ext/code_alloc.c
58
+ - ext/ytljit.c
59
+ - ext/ytljit.h
60
+ - ext/extconf.rb
61
+ - test/asmsample.rb
62
+ - test/cstest.rb
63
+ - test/marshaltest.rb
64
+ - test/test_assemble.rb
65
+ - test/test_assemble2.rb
66
+ - test/test_codespace.rb
67
+ - test/test_typeinf.rb
68
+ - test/tivmtest.rb
69
+ - test/vmtest.rb
70
+ - test/vmtest2.rb
71
+ - test/vmtest3.rb
72
+ - test/vmtest_compile_only.rb
73
+ - test/vmtest_execute_only.rb
74
+ - README
75
+ - Rakefile
76
+ has_rdoc: true
77
+ homepage:
78
+ licenses: []
79
+
80
+ post_install_message:
81
+ rdoc_options: []
82
+
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirements: []
102
+
103
+ rubyforge_project:
104
+ rubygems_version: 1.3.7
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: native code generator for ruby compiler
108
+ test_files:
109
+ - test/asmsample.rb
110
+ - test/cstest.rb
111
+ - test/marshaltest.rb
112
+ - test/test_assemble.rb
113
+ - test/test_assemble2.rb
114
+ - test/test_codespace.rb
115
+ - test/test_typeinf.rb
116
+ - test/tivmtest.rb
117
+ - test/vmtest.rb
118
+ - test/vmtest2.rb
119
+ - test/vmtest3.rb
120
+ - test/vmtest_compile_only.rb
121
+ - test/vmtest_execute_only.rb