ytljit 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/ytljit.h +2 -2
- data/lib/ytljit/asmext.rb +20 -0
- data/lib/ytljit/asmext_x64.rb +10 -2
- data/lib/ytljit/asmext_x86.rb +1 -1
- data/lib/ytljit/asmutil.rb +7 -1
- data/lib/ytljit/instruction_ia.rb +47 -5
- data/lib/ytljit/util.rb +1 -0
- data/lib/ytljit/vm.rb +405 -82
- data/lib/ytljit/vm_codegen.rb +12 -13
- data/lib/ytljit/vm_inline_method.rb +24 -21
- data/lib/ytljit/vm_sendnode.rb +361 -187
- data/lib/ytljit/vm_trans.rb +57 -10
- data/lib/ytljit/vm_type.rb +27 -18
- data/lib/ytljit/vm_type_gen.rb +0 -2
- data/test/vmtest.rb +5 -1
- metadata +3 -3
data/lib/ytljit/vm_trans.rb
CHANGED
@@ -190,6 +190,25 @@ module YTLJit
|
|
190
190
|
# setclassvariable
|
191
191
|
|
192
192
|
def visit_getconstant(code, ins, context)
|
193
|
+
klass = context.expstack.pop
|
194
|
+
case klass
|
195
|
+
when ConstantRefNode
|
196
|
+
klass = klass.value_node
|
197
|
+
|
198
|
+
|
199
|
+
when LiteralNode
|
200
|
+
klass = klass.value
|
201
|
+
if klass == nil then
|
202
|
+
klass = context.current_class_node
|
203
|
+
end
|
204
|
+
|
205
|
+
else
|
206
|
+
raise "Umkonwn node #{klass.class}"
|
207
|
+
end
|
208
|
+
name = ins[1]
|
209
|
+
curnode = context.current_node
|
210
|
+
node = ConstantRefNode.new(curnode, klass, name)
|
211
|
+
context.expstack.push node
|
193
212
|
end
|
194
213
|
|
195
214
|
def visit_setconstant(code, ins, context)
|
@@ -305,27 +324,51 @@ module YTLJit
|
|
305
324
|
def visit_defineclass(code, ins, context)
|
306
325
|
name = ins[1]
|
307
326
|
supklsnode = context.expstack.pop
|
308
|
-
|
327
|
+
defat = context.expstack.pop
|
328
|
+
clsobj = context.current_class_node.klass_object
|
329
|
+
klassobj = nil
|
330
|
+
begin
|
331
|
+
klassobj = clsobj.const_get(name, true)
|
332
|
+
rescue NameError
|
333
|
+
end
|
309
334
|
|
310
335
|
if klassobj == nil then
|
311
|
-
klassnode = context.
|
336
|
+
klassnode = context.current_class_node.constant_tab[name]
|
312
337
|
if klassnode then
|
313
|
-
klassobj = klassnodne.
|
338
|
+
klassobj = klassnodne.klass_object
|
314
339
|
|
315
340
|
else
|
341
|
+
supklass = nil
|
342
|
+
case supklsnode
|
343
|
+
when LiteralNode
|
344
|
+
supklass = supklsnode.value
|
345
|
+
if supklass == nil then
|
346
|
+
supklass = Object
|
347
|
+
end
|
348
|
+
|
349
|
+
when ConstantRefNode
|
350
|
+
supnode = supklsnode.value_node
|
351
|
+
if supnode.is_a?(ClassTopNode) then
|
352
|
+
supklass = supnode.klass_object
|
353
|
+
else
|
354
|
+
raise "Not class #{supnode.class}"
|
355
|
+
end
|
356
|
+
|
357
|
+
else
|
358
|
+
raise "Not support #{supklsnode.class}"
|
359
|
+
end
|
360
|
+
|
316
361
|
case ins[3]
|
317
362
|
when 0
|
318
|
-
supklass = nil
|
319
|
-
if supklsnode then
|
320
|
-
supklass = supklasnode.klasss_object
|
321
|
-
end
|
322
363
|
klassobj = Class.new(supklass)
|
323
364
|
|
324
365
|
when 2
|
325
|
-
klassobj = Module.new
|
366
|
+
klassobj = Module.new
|
326
367
|
end
|
327
368
|
end
|
369
|
+
clsobj.const_set(name, klassobj)
|
328
370
|
end
|
371
|
+
RubyType::define_wraped_class(klassobj, RubyType::RubyTypeBoxed)
|
329
372
|
cnode = ClassTopNode.new(context.current_class_node, klassobj, name)
|
330
373
|
|
331
374
|
body = VMLib::InstSeqTree.new(code, ins[2])
|
@@ -333,12 +376,16 @@ module YTLJit
|
|
333
376
|
ncontext.current_file_name = context.current_file_name
|
334
377
|
ncontext.current_node = cnode
|
335
378
|
ncontext.current_class_node = cnode
|
336
|
-
ncontext.top_nodes.push
|
379
|
+
ncontext.top_nodes.push cnode
|
337
380
|
|
338
381
|
tr = self.class.new([body])
|
339
382
|
tr.translate(ncontext)
|
340
383
|
|
341
|
-
context.current_class_node.
|
384
|
+
context.current_class_node.constant_tab[name] = cnode
|
385
|
+
curnode = context.current_node
|
386
|
+
cvnode = ClassValueNode.new(curnode, cnode)
|
387
|
+
context.expstack.push cvnode
|
388
|
+
|
342
389
|
context
|
343
390
|
end
|
344
391
|
|
data/lib/ytljit/vm_type.rb
CHANGED
@@ -85,7 +85,7 @@ module YTLJit
|
|
85
85
|
@types_tree = KlassTree.new
|
86
86
|
end
|
87
87
|
|
88
|
-
def
|
88
|
+
def to_signature(context, offset = -1)
|
89
89
|
context.current_method_signature[offset]
|
90
90
|
end
|
91
91
|
|
@@ -143,18 +143,24 @@ module YTLJit
|
|
143
143
|
module RubyType
|
144
144
|
def self.define_wraped_class(klass, base = RubyTypeBoxed)
|
145
145
|
cn = nil
|
146
|
-
|
147
|
-
if klass then
|
146
|
+
if klass.name then
|
148
147
|
cn = klass.name.to_sym
|
149
|
-
|
150
|
-
|
151
|
-
|
148
|
+
else
|
149
|
+
cns = klass.inspect
|
150
|
+
if /([a-zA-Z:]+)/ =~ cns then
|
151
|
+
cn = $1.to_sym
|
152
|
+
else
|
153
|
+
raise "Unexcepcted class format #{cns}"
|
152
154
|
end
|
153
|
-
|
154
|
-
boxobj = boxtt[cn]
|
155
|
-
unboxobj = unboxtt[cn]
|
156
|
-
[boxobj, unboxobj]
|
157
155
|
end
|
156
|
+
basett, boxtt, unboxtt = BaseType.type_tab
|
157
|
+
if boxtt[cn] == nil then
|
158
|
+
BaseType.related_ruby_class(klass, base)
|
159
|
+
end
|
160
|
+
|
161
|
+
boxobj = boxtt[cn]
|
162
|
+
unboxobj = unboxtt[cn]
|
163
|
+
[boxobj, unboxobj]
|
158
164
|
end
|
159
165
|
|
160
166
|
class BaseType
|
@@ -287,13 +293,16 @@ module YTLJit
|
|
287
293
|
include VM::TypeCodeGen::DefaultTypeCodeGen
|
288
294
|
end
|
289
295
|
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
296
|
+
define_wraped_class(NilClass, RubyTypeBoxed)
|
297
|
+
define_wraped_class(Fixnum, RubyTypeUnboxed)
|
298
|
+
define_wraped_class(Float, RubyTypeUnboxed)
|
299
|
+
define_wraped_class(TrueClass, RubyTypeBoxed)
|
300
|
+
define_wraped_class(FalseClass, RubyTypeBoxed)
|
301
|
+
define_wraped_class(Symbol, RubyTypeBoxed)
|
302
|
+
define_wraped_class(String, RubyTypeBoxed)
|
303
|
+
define_wraped_class(Array, RubyTypeBoxed)
|
304
|
+
define_wraped_class(Hash, RubyTypeBoxed)
|
305
|
+
define_wraped_class(Module, RubyTypeBoxed)
|
306
|
+
define_wraped_class(Class, RubyTypeBoxed)
|
298
307
|
end
|
299
308
|
end
|
data/lib/ytljit/vm_type_gen.rb
CHANGED
data/test/vmtest.rb
CHANGED
@@ -17,7 +17,10 @@ is = RubyVM::InstructionSequence.compile(
|
|
17
17
|
# "def foo(x); if x then x = 2.0 else x = 1 end; x; end; p foo(1)", "", "", 0,
|
18
18
|
# "def foo(x); yield(x) + 2; end; p foo(1) {|a| a + 1}", "", "", 0,
|
19
19
|
# "def id(x); x; end; p id(1); p id(1.0)", "", "", 0,
|
20
|
-
"def id(x); x; end; p id(1); p id(1.0); def id2(x) x end; id2(1)", "", "", 0,
|
20
|
+
# "def id(x); x; end; p id(1); p id(1.0); def id2(x) x end; id2(1)", "", "", 0,
|
21
|
+
"def mul(x); x * x; end; p mul(20);p mul(30.0)", "", "", 0,
|
22
|
+
# "def div(x, y); x / y; end; p div(20, 10);p div(30.0, -12.0)", "", "", 0,
|
23
|
+
# "def div(x, y); x / y; end; p div(-20, 10);p div(30.0, -12.0)", "", "", 0,
|
21
24
|
# "1.1","", "", 0,
|
22
25
|
{ :peephole_optimization => true,
|
23
26
|
:inline_const_cache => false,
|
@@ -42,6 +45,7 @@ tnode.collect_candidate_type(context, [], [])
|
|
42
45
|
|
43
46
|
tnode = Marshal.load(Marshal.dump(tnode))
|
44
47
|
context = VM::CompileContext.new(tnode)
|
48
|
+
context.options = {:disp_signature => true}
|
45
49
|
tnode.compile(context)
|
46
50
|
# context.code_space.disassemble
|
47
51
|
p tnode.code_space
|
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
|
+
- 3
|
9
|
+
version: 0.0.3
|
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: 2010-
|
17
|
+
date: 2010-11-04 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|