ytl 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/ytl/accmem.rb +3 -3
- data/lib/ytl.rb +49 -39
- data/runtime/prelude.rb +45 -2
- data/test/floattest.rb +7 -0
- data/test/hashtest.rb +15 -0
- metadata +5 -4
- data/runtime/test.rb +0 -1
data/lib/ytl/accmem.rb
CHANGED
@@ -243,9 +243,9 @@ module YTLJit
|
|
243
243
|
end
|
244
244
|
|
245
245
|
def collect_candidate_type_regident(context, slf)
|
246
|
-
|
247
|
-
|
248
|
-
|
246
|
+
slfcls = @arguments[2].get_constant_value
|
247
|
+
tt = RubyType::BaseType.from_ruby_class(slfcls[0])
|
248
|
+
if tt.ruby_type == Runtime::Arena then
|
249
249
|
add_type(context.to_signature, tt)
|
250
250
|
|
251
251
|
if @initmethod.is_a?(SendInitializeNode) then
|
data/lib/ytl.rb
CHANGED
@@ -9,7 +9,7 @@ include YTLJit
|
|
9
9
|
module YTL
|
10
10
|
include YTLJit
|
11
11
|
|
12
|
-
VERSION = "0.0.
|
12
|
+
VERSION = "0.0.4"
|
13
13
|
|
14
14
|
ISEQ_OPTS = {
|
15
15
|
:peephole_optimization => true,
|
@@ -19,60 +19,68 @@ module YTL
|
|
19
19
|
|
20
20
|
def self.parse_opt(argv)
|
21
21
|
ytlopt = {}
|
22
|
-
|
23
|
-
ytlopt[:execute_before_compile] = [prelude]
|
22
|
+
ytlopt[:execute_before_compile] = []
|
24
23
|
opt = OptionParser.new
|
25
24
|
|
26
25
|
opt.on('--disasm', 'Disasemble generated code') do |f|
|
27
26
|
ytlopt[:disasm] = f
|
28
27
|
end
|
29
|
-
|
28
|
+
|
30
29
|
opt.on('--dump-yarv', 'Dump YARV byte code') do |f|
|
31
30
|
ytlopt[:dump_yarv] = f
|
32
31
|
end
|
33
|
-
|
32
|
+
|
34
33
|
opt.on('--disp-signature', 'Display signature of method') do |f|
|
35
34
|
ytlopt[:disp_signature] = f
|
36
35
|
end
|
37
|
-
|
36
|
+
|
38
37
|
opt.on('--dump-context', 'Dump context(registor/stack) for debug') do |f|
|
39
38
|
ytlopt[:dump_context] = f
|
40
39
|
end
|
41
|
-
|
40
|
+
|
42
41
|
opt.on('-o FILE', '--write-code =FILE',
|
43
|
-
|
42
|
+
'Write generating naitive code and node objects') do |f|
|
44
43
|
ytlopt[:write_code] = f
|
45
44
|
end
|
46
|
-
|
45
|
+
|
47
46
|
opt.on('--write-node-before-type-inference =FILE',
|
48
47
|
'Write node of before type inference') do |f|
|
49
48
|
ytlopt[:write_node_before_ti] = f
|
50
49
|
end
|
51
|
-
|
50
|
+
|
52
51
|
opt.on('--write-node-after-type-inference =FILE',
|
53
52
|
'Write node of after type inference') do |f|
|
54
53
|
ytlopt[:write_node_after_ti] = f
|
55
54
|
end
|
56
|
-
|
55
|
+
|
57
56
|
opt.on('-r FILE', '--execute-before-compile =FILE',
|
58
57
|
'Execute ruby program (execute by CRuby)') do |f|
|
59
58
|
ytlopt[:execute_before_compile].push f
|
60
59
|
end
|
61
|
-
|
60
|
+
|
62
61
|
opt.on('-c', '--compile-only',
|
63
62
|
'Stop when compile finished (not execute compiled code)') do |f|
|
64
63
|
ytlopt[:compile_only] = f
|
65
64
|
end
|
66
|
-
|
65
|
+
|
67
66
|
opt.on('--compile-array-as-unboxed',
|
68
67
|
'Compile Array as unboxed if nesseary(not excape, not use special methods)') do |f|
|
69
68
|
ytlopt[:compile_array_as_uboxed] = f
|
70
69
|
end
|
71
|
-
|
70
|
+
|
72
71
|
opt.parse!(argv)
|
73
72
|
ytlopt
|
74
73
|
end
|
75
74
|
|
75
|
+
def self.prelude_iseq
|
76
|
+
prelude = File.join(File.dirname(__FILE__), "..", "runtime", "prelude.rb")
|
77
|
+
rf = File.read(prelude)
|
78
|
+
prog = eval(rf)
|
79
|
+
is = RubyVM::InstructionSequence.compile(prog, ARGV[0],
|
80
|
+
"", 0, ISEQ_OPTS).to_a
|
81
|
+
VMLib::InstSeqTree.new(nil, is)
|
82
|
+
end
|
83
|
+
|
76
84
|
def self.dump_node(tnode, fn)
|
77
85
|
if defined? yield then
|
78
86
|
yield
|
@@ -83,72 +91,73 @@ module YTL
|
|
83
91
|
fp.print "class #{klass.name}; end\n"
|
84
92
|
end
|
85
93
|
end
|
86
|
-
|
94
|
+
|
87
95
|
fp.print "Marshal.load(<<'EOS')\n"
|
88
96
|
fp.print Marshal.dump(tnode)
|
89
97
|
fp.print "\n"
|
90
98
|
fp.print "EOS\n"
|
91
99
|
end
|
92
100
|
end
|
93
|
-
|
101
|
+
|
94
102
|
def self.reduced_main(prog, options)
|
95
103
|
tr_context = VM::YARVContext.new
|
96
|
-
|
104
|
+
|
97
105
|
import_ruby_object(tr_context)
|
98
|
-
|
106
|
+
|
99
107
|
tnode = nil
|
100
108
|
is = RubyVM::InstructionSequence.compile(prog, ARGV[0],
|
101
109
|
"", 0, ISEQ_OPTS).to_a
|
102
110
|
iseq = VMLib::InstSeqTree.new(nil, is)
|
111
|
+
iseqs = [prelude_iseq, iseq]
|
103
112
|
|
104
|
-
tr = VM::YARVTranslatorCRubyObject.new(
|
113
|
+
tr = VM::YARVTranslatorCRubyObject.new(iseqs)
|
105
114
|
tnode = tr.translate(tr_context)
|
106
|
-
|
115
|
+
|
107
116
|
ci_context = VM::CollectInfoContext.new(tnode)
|
108
117
|
ci_context.options = options
|
109
118
|
tnode.collect_info(ci_context)
|
110
|
-
|
119
|
+
|
111
120
|
dmylit = VM::Node::LiteralNode.new(tnode, nil)
|
112
121
|
arg = [dmylit, dmylit, dmylit]
|
113
122
|
sig = []
|
114
123
|
arg.each do |ele|
|
115
124
|
sig.push RubyType::BaseType.from_ruby_class(NilClass)
|
116
125
|
end
|
117
|
-
|
126
|
+
|
118
127
|
ti_context = VM::TypeInferenceContext.new(tnode)
|
119
128
|
ti_context.options = options
|
120
129
|
begin
|
121
130
|
tnode.collect_candidate_type(ti_context, arg, sig)
|
122
131
|
end until ti_context.convergent
|
123
132
|
ti_context = tnode.collect_candidate_type(ti_context, arg, sig)
|
124
|
-
|
133
|
+
|
125
134
|
c_context = VM::CompileContext.new(tnode)
|
126
135
|
c_context.current_method_signature.push sig
|
127
136
|
c_context.options = options
|
128
137
|
c_context = tnode.compile(c_context)
|
129
138
|
tnode.make_frame_struct_tab
|
130
|
-
|
139
|
+
|
131
140
|
tcs = tnode.code_space
|
132
141
|
tcs.call(tcs.base_address)
|
133
142
|
end
|
134
|
-
|
143
|
+
|
135
144
|
def self.main(options)
|
136
145
|
tr_context = VM::YARVContext.new
|
137
146
|
progs = []
|
138
|
-
|
147
|
+
|
139
148
|
import_ruby_object(tr_context)
|
140
149
|
options[:execute_before_compile].each do |fn|
|
141
150
|
rf = File.read(fn)
|
142
151
|
prog = eval(rf)
|
143
152
|
progs.push prog
|
144
153
|
is = RubyVM::InstructionSequence.compile(prog, ARGV[0],
|
145
|
-
|
154
|
+
"", 0, ISEQ_OPTS).to_a
|
146
155
|
iseq = VMLib::InstSeqTree.new(nil, is)
|
147
156
|
tr = VM::YARVTranslatorCRubyObject.new([iseq])
|
148
157
|
tr_context.current_file_name = fn
|
149
158
|
tr.translate(tr_context)
|
150
159
|
end
|
151
|
-
|
160
|
+
|
152
161
|
tnode = nil
|
153
162
|
case File.extname(ARGV[0])
|
154
163
|
when ".ytl"
|
@@ -160,7 +169,7 @@ module YTL
|
|
160
169
|
tnode.code_space.call(tnode.code_space.base_address)
|
161
170
|
return
|
162
171
|
end
|
163
|
-
|
172
|
+
|
164
173
|
when ".rb"
|
165
174
|
prog = File.read(ARGV[0])
|
166
175
|
is = RubyVM::InstructionSequence.compile(prog, ARGV[0],
|
@@ -169,34 +178,35 @@ module YTL
|
|
169
178
|
if options[:dump_yarv] then
|
170
179
|
pp iseq
|
171
180
|
end
|
172
|
-
|
173
|
-
|
181
|
+
iseqs = [prelude_iseq, iseq]
|
182
|
+
|
183
|
+
tr = VM::YARVTranslatorCRubyObject.new(iseqs)
|
174
184
|
tr_context.current_file_name = ARGV[0]
|
175
185
|
tnode = tr.translate(tr_context)
|
176
186
|
end
|
177
|
-
|
187
|
+
|
178
188
|
ci_context = VM::CollectInfoContext.new(tnode)
|
179
189
|
ci_context.options = options
|
180
190
|
tnode.collect_info(ci_context)
|
181
|
-
|
191
|
+
|
182
192
|
if fn = options[:write_node_before_ti] then
|
183
193
|
dump_node(tnode, fn)
|
184
194
|
end
|
185
|
-
|
195
|
+
|
186
196
|
dmylit = VM::Node::LiteralNode.new(tnode, nil)
|
187
197
|
arg = [dmylit, dmylit, dmylit]
|
188
198
|
sig = []
|
189
199
|
arg.each do |ele|
|
190
200
|
sig.push RubyType::BaseType.from_ruby_class(NilClass)
|
191
201
|
end
|
192
|
-
|
202
|
+
|
193
203
|
ti_context = VM::TypeInferenceContext.new(tnode)
|
194
204
|
ti_context.options = options
|
195
205
|
begin
|
196
206
|
tnode.collect_candidate_type(ti_context, arg, sig)
|
197
207
|
end until ti_context.convergent
|
198
208
|
ti_context = tnode.collect_candidate_type(ti_context, arg, sig)
|
199
|
-
|
209
|
+
|
200
210
|
if fn = options[:write_node_after_ti] then
|
201
211
|
dump_node(tnode, fn)
|
202
212
|
end
|
@@ -206,20 +216,20 @@ module YTL
|
|
206
216
|
c_context.options = options
|
207
217
|
c_context = tnode.compile(c_context)
|
208
218
|
tnode.make_frame_struct_tab
|
209
|
-
|
219
|
+
|
210
220
|
if fn = options[:write_code] then
|
211
221
|
dump_node(tnode, fn) {
|
212
222
|
tnode.code_store_hook
|
213
223
|
}
|
214
224
|
end
|
215
|
-
|
225
|
+
|
216
226
|
if options[:disasm] then
|
217
227
|
tnode.code_space_tab.each do |cs|
|
218
228
|
cs.fill_disasm_cache
|
219
229
|
end
|
220
230
|
tnode.code_space.disassemble
|
221
231
|
end
|
222
|
-
|
232
|
+
|
223
233
|
tcs = tnode.code_space
|
224
234
|
STDOUT.flush
|
225
235
|
if !options[:compile_only] then
|
data/runtime/prelude.rb
CHANGED
@@ -24,10 +24,34 @@ class Array
|
|
24
24
|
yield self[i]
|
25
25
|
i = i + 1
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
self
|
29
29
|
end
|
30
30
|
|
31
|
+
def collect
|
32
|
+
res = []
|
33
|
+
i = 0
|
34
|
+
e = self.size
|
35
|
+
while i < e
|
36
|
+
res[i] = yield self[i]
|
37
|
+
i = i + 1
|
38
|
+
end
|
39
|
+
|
40
|
+
res
|
41
|
+
end
|
42
|
+
|
43
|
+
def map
|
44
|
+
res = []
|
45
|
+
i = 0
|
46
|
+
e = self.size
|
47
|
+
while i < e
|
48
|
+
res[i] = yield self[i]
|
49
|
+
i = i + 1
|
50
|
+
end
|
51
|
+
|
52
|
+
res
|
53
|
+
end
|
54
|
+
|
31
55
|
def at(idx)
|
32
56
|
self[idx]
|
33
57
|
end
|
@@ -49,7 +73,26 @@ class Range
|
|
49
73
|
end
|
50
74
|
end
|
51
75
|
|
52
|
-
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_a
|
80
|
+
i = self.first
|
81
|
+
e = self.last
|
82
|
+
res = []
|
83
|
+
if self.exclude_end? then
|
84
|
+
while i < e
|
85
|
+
res.push i
|
86
|
+
i = i + 1
|
87
|
+
end
|
88
|
+
else
|
89
|
+
while i <= e
|
90
|
+
res.push i
|
91
|
+
i = i + 1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
res
|
53
96
|
end
|
54
97
|
end
|
55
98
|
|
data/test/floattest.rb
CHANGED
data/test/hashtest.rb
ADDED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Hideki Miura
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-08-14 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -46,7 +46,6 @@ files:
|
|
46
46
|
- lib/ytl/importobj.rb
|
47
47
|
- lib/ytl/macro.rb
|
48
48
|
- runtime/prelude.rb
|
49
|
-
- runtime/test.rb
|
50
49
|
- runtime/type.rb
|
51
50
|
- test/basictest.rb
|
52
51
|
- test/breaktest.rb
|
@@ -56,6 +55,7 @@ files:
|
|
56
55
|
- test/execytl.rb
|
57
56
|
- test/exttest.rb
|
58
57
|
- test/floattest.rb
|
58
|
+
- test/hashtest.rb
|
59
59
|
- test/ivtest.rb
|
60
60
|
- test/looptest.rb
|
61
61
|
- test/macrotest.rb
|
@@ -103,6 +103,7 @@ test_files:
|
|
103
103
|
- test/execytl.rb
|
104
104
|
- test/exttest.rb
|
105
105
|
- test/floattest.rb
|
106
|
+
- test/hashtest.rb
|
106
107
|
- test/ivtest.rb
|
107
108
|
- test/looptest.rb
|
108
109
|
- test/macrotest.rb
|
data/runtime/test.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
|