fastruby 0.0.19 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +8 -0
- data/{README → README.rdoc} +6 -1
- data/Rakefile +7 -7
- data/benchmarks/benchmark.rb~ +14 -2
- data/ext/fastruby_base/fastruby_base.inl +8 -4
- data/lib/fastruby/builder/inference_updater.rb +76 -0
- data/lib/fastruby/builder/inference_updater.rb~ +76 -0
- data/lib/fastruby/builder/inferencer.rb +38 -0
- data/lib/fastruby/{inliner → builder}/inliner.rb +16 -27
- data/lib/fastruby/builder/inliner.rb~ +60 -0
- data/lib/fastruby/builder/locals_inference.rb +53 -0
- data/lib/fastruby/builder/lvar_type.rb +43 -0
- data/lib/fastruby/builder/lvar_type.rb~ +44 -0
- data/lib/fastruby/builder/pipeline.rb +43 -0
- data/lib/fastruby/builder/pipeline.rb~ +43 -0
- data/lib/fastruby/{reductor → builder}/reductor.rb +6 -3
- data/lib/fastruby/builder/reductor.rb~ +42 -0
- data/lib/fastruby/builder.rb +73 -25
- data/lib/fastruby/builder.rb~ +311 -0
- data/lib/fastruby/corelib/fixnum.rb +75 -0
- data/lib/fastruby/corelib/fixnum.rb~ +146 -0
- data/lib/fastruby/corelib/integer.rb +96 -0
- data/lib/fastruby/corelib/integer.rb~ +96 -0
- data/lib/fastruby/corelib.rb +23 -0
- data/lib/fastruby/corelib.rb~ +23 -0
- data/lib/fastruby/getlocals.rb +3 -1
- data/lib/fastruby/logging.rb +2 -2
- data/lib/fastruby/modules/inferencer/infer.rb +31 -0
- data/lib/fastruby/modules/inferencer/literal.rb +42 -0
- data/lib/fastruby/modules/inliner/call.rb +327 -0
- data/lib/fastruby/{inliner/modules/call.rb → modules/inliner/call.rb~} +14 -24
- data/lib/fastruby/modules/inliner/defn.rb +41 -0
- data/lib/fastruby/modules/inliner/defn.rb~ +29 -0
- data/lib/fastruby/modules/inliner/recursive.rb +40 -0
- data/lib/fastruby/{inliner/modules/recursive.rb → modules/inliner/recursive.rb~} +1 -1
- data/lib/fastruby/modules/lvar_type/call.rb +36 -0
- data/lib/fastruby/modules/lvar_type/call.rb~ +36 -0
- data/lib/fastruby/modules/lvar_type/defn.rb +42 -0
- data/lib/fastruby/modules/lvar_type/defn.rb~ +42 -0
- data/lib/fastruby/modules/lvar_type/lasgn.rb +41 -0
- data/lib/fastruby/modules/lvar_type/lasgn.rb~ +42 -0
- data/lib/fastruby/modules/lvar_type/recursive.rb +33 -0
- data/lib/fastruby/modules/lvar_type/recursive.rb~ +33 -0
- data/lib/fastruby/{reductor/modules → modules/reductor}/case.rb +0 -0
- data/lib/fastruby/modules/reductor/fastruby_flag.rb +33 -0
- data/lib/fastruby/{reductor/modules → modules/reductor}/for.rb +0 -0
- data/lib/fastruby/{reductor/modules → modules/reductor}/nontree.rb +0 -0
- data/lib/fastruby/modules/reductor/nontree.rb~ +32 -0
- data/lib/fastruby/{reductor/modules → modules/reductor}/recursive.rb +1 -1
- data/lib/fastruby/modules/reductor/recursive.rb~ +31 -0
- data/lib/fastruby/{translator/modules → modules/translator}/block.rb +0 -0
- data/lib/fastruby/modules/translator/call.rb +344 -0
- data/lib/fastruby/{translator/modules/call.rb → modules/translator/call.rb~} +24 -3
- data/lib/fastruby/{translator/modules → modules/translator}/defn.rb +10 -9
- data/lib/fastruby/modules/translator/defn.rb~ +267 -0
- data/lib/fastruby/{translator/modules → modules/translator}/directive.rb +3 -1
- data/lib/fastruby/modules/translator/directive.rb~ +44 -0
- data/lib/fastruby/{translator/modules → modules/translator}/exceptions.rb +3 -1
- data/lib/fastruby/modules/translator/exceptions.rb~ +120 -0
- data/lib/fastruby/{translator/modules → modules/translator}/flow.rb +0 -0
- data/lib/fastruby/modules/translator/iter.rb +745 -0
- data/lib/fastruby/{translator/modules/iter.rb → modules/translator/iter.rb~} +103 -48
- data/lib/fastruby/modules/translator/literal.rb +150 -0
- data/lib/fastruby/{translator/modules/literal.rb → modules/translator/literal.rb~} +3 -3
- data/lib/fastruby/{translator/modules → modules/translator}/logical.rb +0 -0
- data/lib/fastruby/{translator/modules → modules/translator}/method_group.rb +0 -0
- data/lib/fastruby/{translator/modules → modules/translator}/nonlocal.rb +18 -6
- data/lib/fastruby/modules/translator/nonlocal.rb~ +298 -0
- data/lib/fastruby/modules/translator/static.rb +290 -0
- data/lib/fastruby/{translator/modules/static.rb → modules/translator/static.rb~} +66 -17
- data/lib/fastruby/modules/translator/variable.rb +280 -0
- data/lib/fastruby/{translator/modules/variable.rb → modules/translator/variable.rb~} +14 -44
- data/lib/fastruby/modules.rb +30 -0
- data/lib/fastruby/object.rb +42 -6
- data/lib/fastruby/object.rb~ +159 -0
- data/lib/fastruby/set_tree.rb +7 -11
- data/lib/fastruby/set_tree.rb~ +71 -0
- data/lib/fastruby/sexp_extension.rb +29 -7
- data/lib/fastruby/sexp_extension.rb~ +262 -0
- data/lib/fastruby/translator/scope_mode_helper.rb~ +138 -0
- data/lib/fastruby/translator/translator.rb +87 -92
- data/lib/fastruby/translator/translator.rb~ +1600 -0
- data/lib/fastruby/translator/translator_modules.rb +3 -1
- data/lib/fastruby/translator/translator_modules.rb~ +53 -0
- data/lib/fastruby.rb +3 -1
- data/lib/fastruby.rb~ +3 -1
- data/lib/fastruby_only/base.rb +1 -0
- data/spec/corelib/numeric/fixnum_spec.rb +110 -0
- data/spec/corelib/numeric/fixnum_spec.rb~ +104 -0
- data/spec/corelib/numeric/integer_spec.rb +173 -0
- data/spec/corelib/numeric/integer_spec.rb~ +173 -0
- data/spec/fastruby_only/base_spec.rb +74 -0
- data/spec/graph/base_spec.rb +2 -1
- data/spec/graph/base_spec.rb~ +35 -0
- data/spec/graph/path_spec.rb +2 -2
- data/spec/graph/path_spec.rb~ +48 -0
- data/spec/graph/vertex_spec.rb +2 -1
- data/spec/graph/vertex_spec.rb~ +58 -0
- data/spec/reductor/base_spec.rb +1 -1
- data/spec/ruby/block/lambda_spec.rb~ +163 -0
- data/spec/ruby/block/proc_as_block_spec.rb~ +69 -1
- data/spec/ruby/block_spec.rb~ +2 -494
- data/spec/ruby/call/base_call_spec.rb +1 -1
- data/spec/ruby/call/base_call_spec.rb~ +2 -60
- data/spec/ruby/defn/replacement_spec.rb +26 -14
- data/spec/ruby/defn/replacement_spec.rb~ +13 -3
- data/spec/ruby/exception/internal_ex_spec.rb~ +86 -0
- data/spec/ruby/integrity_spec.rb~ +35 -1
- data/spec/ruby/variable_spec.rb~ +31 -0
- data/spec/scope_mode/flow_spec.rb +1 -1
- data/spec/scope_mode/flow_spec.rb~ +109 -0
- data/spec/sugar/base_spec.rb +29 -0
- data/spec/sugar/base_spec.rb~ +16 -0
- metadata +100 -43
- data/spec/fastruby/inliner/modules/call_spec.rb +0 -0
- data/spec/fastruby/translator/modules/nonlocal_spec.rb +0 -0
- data/spec/fastruby/translator/translator_spec.rb +0 -0
- data/spec/ruby/block/arguments_spec.rb~ +0 -214
- data/spec/ruby/block/break_spec.rb~ +0 -236
- data/spec/ruby/block/next_spec.rb~ +0 -85
- data/spec/ruby/block/retry_spec.rb~ +0 -43
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.0.20 Fastruby implementation of some fixnum methods allowing inline it
|
2
|
+
|
3
|
+
Improve and bug fixing on inline
|
4
|
+
|
5
|
+
Syntantic sugar for fastruby method definitions (see README)
|
6
|
+
|
7
|
+
Internal design improvements, builder pipeline and translator decoupling
|
8
|
+
|
1
9
|
0.0.19 Fixed temporal variable names of case blocks to make it deterministic and allow caching
|
2
10
|
|
3
11
|
Fixed bug of duplicated entries on $LOAD_PATH, significant performance improvement saves 80% of time both with caching and without caching
|
data/{README → README.rdoc}
RENAMED
@@ -33,6 +33,12 @@ direct calls instead of normal and expensive ruby calls.
|
|
33
33
|
|
34
34
|
The currently implementation only can infer types for method and block arguments, and for literals
|
35
35
|
|
36
|
+
=== Method inlining
|
37
|
+
|
38
|
+
Type information is used to inline methods by replacing calls with the implementation of method being called. This greatly increase the performance WITHOUT
|
39
|
+
breaking the expected dynamics of ruby code (e.g. allow replace an inlined method), many of corelib methods was reimplemented with ruby to allow inline them
|
40
|
+
and increase the performance of code using corelib methods (e.g. Fixnum methods)
|
41
|
+
|
36
42
|
=== Customization through build directives and API
|
37
43
|
|
38
44
|
To compensate for the described limitations, fastruby suport a few build directives to allow the programmer help the inference.
|
@@ -61,7 +67,6 @@ I will stabilize the API and document it for next releases. I promise
|
|
61
67
|
* fastruby on ruby1.8 is faster than ruby1.8 on a few cases (see benchmarks) but is slower than ruby1.9
|
62
68
|
* callcc is not supported, it works but using it may result in unexpected behaviour
|
63
69
|
* calls with blocks to ruby or cruby methods are almost as slow as normal ruby (if the called method is defined by fastruby, the call is pretty fast)
|
64
|
-
* replacement of methods using identical code strings will work, but it will generate duplicated objects on the cache each time te snippet run
|
65
70
|
|
66
71
|
== Usage
|
67
72
|
|
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ require "rspec/core/rake_task"
|
|
7
7
|
|
8
8
|
spec = Gem::Specification.new do |s|
|
9
9
|
s.name = 'fastruby'
|
10
|
-
s.version = '0.0.
|
10
|
+
s.version = '0.0.20'
|
11
11
|
s.author = 'Dario Seminara'
|
12
12
|
s.email = 'robertodarioseminara@gmail.com'
|
13
13
|
s.platform = Gem::Platform::RUBY
|
@@ -15,15 +15,15 @@ spec = Gem::Specification.new do |s|
|
|
15
15
|
s.homepage = "http://github.com/tario/fastruby"
|
16
16
|
s.add_dependency "RubyInline", "= 3.11.0"
|
17
17
|
s.add_dependency "ruby_parser", ">= 2.0.6"
|
18
|
-
s.add_dependency "define_method_handler", ">= 0.0.
|
18
|
+
s.add_dependency "define_method_handler", ">= 0.0.6"
|
19
19
|
s.add_dependency "method_source", ">= 0.6.7"
|
20
20
|
s.add_dependency "ruby2ruby", ">= 1.3.1"
|
21
21
|
s.has_rdoc = true
|
22
|
-
s.extra_rdoc_files = [ 'README' ]
|
22
|
+
s.extra_rdoc_files = [ 'README.rdoc' ]
|
23
23
|
s.extensions = FileList["ext/**/extconf.rb"].to_a
|
24
|
-
# s.rdoc_options << '--main' << 'README'
|
24
|
+
# s.rdoc_options << '--main' << 'README.rdoc'
|
25
25
|
s.files = Dir.glob("{benchmarks,examples,lib,spec}/**/*") + Dir.glob("ext/**/*.inl")+ Dir.glob("ext/**/*.c") + Dir.glob("ext/**/*.h") + Dir.glob("ext/**/extconf.rb") +
|
26
|
-
[ 'LICENSE', 'AUTHORS', 'README', 'Rakefile', 'TODO', 'CHANGELOG' ]
|
26
|
+
[ 'LICENSE', 'AUTHORS', 'README.rdoc', 'Rakefile', 'TODO', 'CHANGELOG' ]
|
27
27
|
end
|
28
28
|
|
29
29
|
desc 'Run tests'
|
@@ -35,8 +35,8 @@ end
|
|
35
35
|
desc 'Generate RDoc'
|
36
36
|
Rake::RDocTask.new :rdoc do |rd|
|
37
37
|
rd.rdoc_dir = 'doc'
|
38
|
-
rd.rdoc_files.add 'lib', 'README'
|
39
|
-
rd.main = 'README'
|
38
|
+
rd.rdoc_files.add 'lib', 'README.rdoc'
|
39
|
+
rd.main = 'README.rdoc'
|
40
40
|
end
|
41
41
|
|
42
42
|
desc 'Build Gem'
|
data/benchmarks/benchmark.rb~
CHANGED
@@ -1,9 +1,21 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "fastruby"
|
3
3
|
|
4
|
+
class Fixnum
|
5
|
+
fastruby(:fastruby_only => true) do
|
6
|
+
def +(b)
|
7
|
+
_static{INT2FIX(FIX2INT(self)+FIX2INT(b))}
|
8
|
+
end
|
9
|
+
|
10
|
+
def -(b)
|
11
|
+
_static{INT2FIX(FIX2INT(self)-FIX2INT(b))}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
4
16
|
class X
|
5
17
|
def foo(a,b)
|
6
|
-
a+b
|
18
|
+
return a+b
|
7
19
|
end
|
8
20
|
end
|
9
21
|
|
@@ -15,7 +27,7 @@ class Y
|
|
15
27
|
|
16
28
|
ret = 0
|
17
29
|
while i > 0
|
18
|
-
ret = (i
|
30
|
+
ret = x.foo(i,i)
|
19
31
|
i = i - 1
|
20
32
|
end
|
21
33
|
return ret
|
@@ -143,6 +143,10 @@ struct METHOD {
|
|
143
143
|
NODE *body;
|
144
144
|
};
|
145
145
|
|
146
|
+
|
147
|
+
RUBY_EXTERN void* ruby_current_thread;
|
148
|
+
|
149
|
+
|
146
150
|
static inline void stack_chunk_initialize(struct STACKCHUNK* sc) {
|
147
151
|
// initialize pointers with zeros
|
148
152
|
memset(sc->pages, 0, sizeof(sc->pages));
|
@@ -351,16 +355,16 @@ static void init_stack_chunk() {
|
|
351
355
|
rb_define_singleton_method(rb_cStackChunk, "create", rb_stack_chunk_create,0);
|
352
356
|
rb_define_method(rb_cStackChunk, "alloc", rb_stack_chunk_alloc,1);
|
353
357
|
}
|
354
|
-
|
358
|
+
# define NUM2PTR(x) ((void*)(NUM2ULONG(x)))
|
355
359
|
static VALUE clear_method_hash_addresses(VALUE klass,VALUE rb_method_hash) {
|
356
|
-
|
357
360
|
if (rb_method_hash != Qnil) {
|
358
361
|
VALUE rb_values = rb_funcall(rb_method_hash, rb_intern("values"),0);
|
359
362
|
void** address;
|
360
363
|
int i;
|
364
|
+
|
361
365
|
for (i = 0; i < _RARRAY_LEN(rb_values); i++) {
|
362
|
-
address = (void**)
|
363
|
-
|
366
|
+
address = (void**)NUM2PTR(rb_ary_entry(rb_values,i));
|
367
|
+
*address = 0;
|
364
368
|
}
|
365
369
|
}
|
366
370
|
|
@@ -0,0 +1,76 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
module FastRuby
|
22
|
+
class InferenceUpdater
|
23
|
+
class AddInfer
|
24
|
+
attr_accessor :variable_hash
|
25
|
+
|
26
|
+
define_method_handler(:process, :priority => 1) {|tree|
|
27
|
+
tree
|
28
|
+
}.condition{|tree| (tree.node_type == :iter and tree[1][2] == :_static) or (tree.node_type == :call and tree[2] == :infer) }
|
29
|
+
|
30
|
+
define_method_handler(:process, :priority => -1) {|tree|
|
31
|
+
tree.map{|subtree| process subtree}
|
32
|
+
}.condition{|tree| tree.respond_to?(:node_type) }
|
33
|
+
|
34
|
+
define_method_handler(:process, :priority => 1) {|tree|
|
35
|
+
tree
|
36
|
+
}.condition{|tree| not tree.respond_to?(:node_type) }
|
37
|
+
|
38
|
+
define_method_handler(:process) {|tree|
|
39
|
+
fs(:call, tree, :infer, fs(:arglist, fs(:const, variable_hash[tree[1]].to_s.to_sym)))
|
40
|
+
}.condition{|tree| tree.node_type == :lvar and variable_hash[tree[1]] and variable_hash[tree[1]] != :dynamic}
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(inferencer)
|
45
|
+
@inferencer = inferencer
|
46
|
+
end
|
47
|
+
|
48
|
+
def call(tree)
|
49
|
+
variable_hash = Hash.new
|
50
|
+
|
51
|
+
# search variable assignments
|
52
|
+
tree.walk_tree do |subtree|
|
53
|
+
if subtree.node_type == :lasgn and subtree[2]
|
54
|
+
types = @inferencer.infer(subtree[2])
|
55
|
+
lname = subtree[1]
|
56
|
+
if types.size == 1
|
57
|
+
if variable_hash[lname]
|
58
|
+
if variable_hash[lname] != types.first
|
59
|
+
variable_hash[lname] = :dynamic
|
60
|
+
end
|
61
|
+
else
|
62
|
+
variable_hash[lname] = types.first
|
63
|
+
end
|
64
|
+
elsif types.size == 0
|
65
|
+
variable_hash[lname] = :dynamic
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
add_infer = AddInfer.new
|
71
|
+
add_infer.variable_hash = variable_hash
|
72
|
+
|
73
|
+
add_infer.process(tree)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
module FastRuby
|
22
|
+
class InferenceUpdater
|
23
|
+
class AddInfer
|
24
|
+
attr_accessor :variable_hash
|
25
|
+
|
26
|
+
define_method_handler(:process, :priority => 1) {|tree|
|
27
|
+
tree
|
28
|
+
}.condition{|tree| (tree.node_type == :iter and tree[1][2] == :_static) or (tree.node_type == :call and tree[2] == :infer) }
|
29
|
+
|
30
|
+
define_method_handler(:process, :priority => -1) {|tree|
|
31
|
+
tree.map &method(:process)
|
32
|
+
}.condition{|tree| tree.respond_to?(:node_type) }
|
33
|
+
|
34
|
+
define_method_handler(:process, :priority => 1) {|tree|
|
35
|
+
tree
|
36
|
+
}.condition{|tree| not tree.respond_to?(:node_type) }
|
37
|
+
|
38
|
+
define_method_handler(:process) {|tree|
|
39
|
+
fs(:call, tree, :infer, fs(:arglist, fs(:const, variable_hash[tree[1]].to_s.to_sym)))
|
40
|
+
}.condition{|tree| tree.node_type == :lvar and variable_hash[tree[1]] and variable_hash[tree[1]] != :dynamic}
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(inferencer)
|
45
|
+
@inferencer = inferencer
|
46
|
+
end
|
47
|
+
|
48
|
+
def call(tree)
|
49
|
+
variable_hash = Hash.new
|
50
|
+
|
51
|
+
# search variable assignments
|
52
|
+
tree.walk_tree do |subtree|
|
53
|
+
if subtree.node_type == :lasgn and subtree[2]
|
54
|
+
types = @inferencer.infer(subtree[2])
|
55
|
+
lname = subtree[1]
|
56
|
+
if types.size == 1
|
57
|
+
if variable_hash[lname]
|
58
|
+
if variable_hash[lname] != types.first
|
59
|
+
variable_hash[lname] = :dynamic
|
60
|
+
end
|
61
|
+
else
|
62
|
+
variable_hash[lname] = types.first
|
63
|
+
end
|
64
|
+
elsif types.size == 0
|
65
|
+
variable_hash[lname] = :dynamic
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
add_infer = AddInfer.new
|
71
|
+
add_infer.variable_hash = variable_hash
|
72
|
+
|
73
|
+
add_infer.process(tree)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
require "set"
|
22
|
+
require "sexp"
|
23
|
+
require "define_method_handler"
|
24
|
+
require "fastruby/modules"
|
25
|
+
|
26
|
+
module FastRuby
|
27
|
+
class Inferencer
|
28
|
+
define_method_handler(:infer, :priority => -1000) do |tree|
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.define_infer_for(node_type, &blk)
|
33
|
+
define_method_handler(:infer, &blk).condition{|tree| tree.node_type == node_type}
|
34
|
+
end
|
35
|
+
|
36
|
+
FastRuby::Modules.load_all("inferencer")
|
37
|
+
end
|
38
|
+
end
|
@@ -18,51 +18,40 @@ you should have received a copy of the gnu general public license
|
|
18
18
|
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
19
|
|
20
20
|
=end
|
21
|
-
require "set"
|
22
|
-
require "sexp"
|
23
21
|
require "define_method_handler"
|
22
|
+
require "fastruby/modules"
|
24
23
|
|
25
24
|
module FastRuby
|
26
25
|
class Inliner
|
27
|
-
attr_accessor :infer_lvar_map
|
28
|
-
attr_accessor :infer_self
|
29
|
-
attr_reader :extra_locals
|
30
|
-
attr_reader :extra_inferences
|
31
26
|
attr_reader :inlined_methods
|
32
|
-
|
33
|
-
def initialize
|
34
|
-
@extra_locals = Set.new
|
35
|
-
@extra_inferences = Hash.new
|
27
|
+
|
28
|
+
def initialize(inferencer)
|
36
29
|
@inlined_methods = Array.new
|
30
|
+
@inferencer = inferencer
|
37
31
|
end
|
38
32
|
|
39
33
|
define_method_handler(:inline, :priority => -1000) do |tree|
|
40
34
|
FastRubySexp.from_sexp(tree)
|
41
35
|
end
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
37
|
+
def call(*args)
|
38
|
+
if args.first.find_tree{|tree| tree.node_type == :call && tree[2] != :infer && infer_type(tree[1] || fs(:self))}
|
39
|
+
inline *args
|
40
|
+
else
|
41
|
+
args.first
|
42
|
+
end
|
49
43
|
end
|
50
44
|
|
45
|
+
FastRuby::Modules.load_all("inliner")
|
46
|
+
|
51
47
|
def infer_type(recv)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
elsif recv[0] == :lvar
|
57
|
-
@infer_lvar_map[recv[1]]
|
58
|
-
elsif recv[0] == :self
|
59
|
-
@infer_self
|
60
|
-
elsif recv[0] == :str or recv[0] == :lit
|
61
|
-
recv[1].class
|
48
|
+
array = @inferencer.infer(recv).to_a
|
49
|
+
|
50
|
+
if array.size == 1
|
51
|
+
array[0]
|
62
52
|
else
|
63
53
|
nil
|
64
54
|
end
|
65
55
|
end
|
66
|
-
|
67
56
|
end
|
68
57
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
require "define_method_handler"
|
22
|
+
require "fastruby/modules"
|
23
|
+
|
24
|
+
module FastRuby
|
25
|
+
class Inliner
|
26
|
+
attr_reader :inlined_methods
|
27
|
+
|
28
|
+
def initialize(inferencer)
|
29
|
+
@inlined_methods = Array.new
|
30
|
+
@inferencer = inferencer
|
31
|
+
end
|
32
|
+
|
33
|
+
define_method_handler(:inline, :priority => -1000) do |tree|
|
34
|
+
FastRubySexp.from_sexp(tree)
|
35
|
+
end
|
36
|
+
|
37
|
+
def call(*args)
|
38
|
+
|
39
|
+
return args.first
|
40
|
+
|
41
|
+
if args.first.find_tree{|tree| tree.node_type == :call && tree[2] != :infer && infer_type(tree[1] || fs(:self))}
|
42
|
+
inline *args
|
43
|
+
else
|
44
|
+
args.first
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
FastRuby::Modules.load_all("inliner")
|
49
|
+
|
50
|
+
def infer_type(recv)
|
51
|
+
array = @inferencer.infer(recv).to_a
|
52
|
+
|
53
|
+
if array.size == 1
|
54
|
+
array[0]
|
55
|
+
else
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
module FastRuby
|
22
|
+
class LocalsInference
|
23
|
+
attr_accessor :infer_self
|
24
|
+
attr_accessor :infer_lvar_map
|
25
|
+
|
26
|
+
def call(arg)
|
27
|
+
if arg.find_tree{|subtree| subtree.node_type == :lvar && @infer_lvar_map[subtree[1]]}
|
28
|
+
transform_block = proc do |tree|
|
29
|
+
if tree.node_type == :lvar
|
30
|
+
next tree unless @infer_lvar_map
|
31
|
+
lvar_type = @infer_lvar_map[tree[1]]
|
32
|
+
next tree unless lvar_type
|
33
|
+
fs(:call, tree, :infer, fs(:arglist, fs(:const, lvar_type.to_s.to_sym)))
|
34
|
+
elsif tree.node_type == :iter
|
35
|
+
if tree[1][2] == :_static
|
36
|
+
tree
|
37
|
+
end
|
38
|
+
elsif tree.node_type == :call
|
39
|
+
if tree[2] == :infer
|
40
|
+
tree[1]
|
41
|
+
end
|
42
|
+
else
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
arg.transform &transform_block
|
48
|
+
else
|
49
|
+
arg
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
require "set"
|
22
|
+
require "sexp"
|
23
|
+
require "define_method_handler"
|
24
|
+
require "fastruby/modules"
|
25
|
+
|
26
|
+
module FastRuby
|
27
|
+
class LvarType
|
28
|
+
def initialize(inferencer)
|
29
|
+
@infer_lvar_map = Hash.new
|
30
|
+
@inferencer = inferencer
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(*args)
|
34
|
+
if args.first.find_tree{|tree| tree.node_type == :call && tree[2] == :lvar_type}
|
35
|
+
process *args
|
36
|
+
else
|
37
|
+
args.first
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
FastRuby::Modules.load_all("lvar_type")
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
require "set"
|
22
|
+
require "sexp"
|
23
|
+
require "define_method_handler"
|
24
|
+
require "fastruby/modules"
|
25
|
+
|
26
|
+
module FastRuby
|
27
|
+
class LvarType
|
28
|
+
def initialize(inferencer)
|
29
|
+
@infer_lvar_map = Hash.new
|
30
|
+
@inferencer = inferencer
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(*args)
|
34
|
+
p args.first
|
35
|
+
# if args.first.find_tree{|tree| tree.node_type == :call && tree[2] == :lvar_type}
|
36
|
+
# process *args
|
37
|
+
# else
|
38
|
+
args.first
|
39
|
+
# end
|
40
|
+
end
|
41
|
+
|
42
|
+
FastRuby::Modules.load_all("lvar_type")
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
require "define_method_handler"
|
22
|
+
|
23
|
+
module FastRuby
|
24
|
+
class Pipeline
|
25
|
+
def initialize
|
26
|
+
@array = Array.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def << (object)
|
30
|
+
@array << object
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(arg)
|
34
|
+
|
35
|
+
last_result = arg
|
36
|
+
@array.each do |processor|
|
37
|
+
last_result = processor.call(last_result)
|
38
|
+
end
|
39
|
+
|
40
|
+
last_result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This file is part of the fastruby project, http://github.com/tario/fastruby
|
4
|
+
|
5
|
+
Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
|
6
|
+
|
7
|
+
fastruby is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the gnu general public license as published by
|
9
|
+
the free software foundation, either version 3 of the license, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
fastruby is distributed in the hope that it will be useful,
|
13
|
+
but without any warranty; without even the implied warranty of
|
14
|
+
merchantability or fitness for a particular purpose. see the
|
15
|
+
gnu general public license for more details.
|
16
|
+
|
17
|
+
you should have received a copy of the gnu general public license
|
18
|
+
along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
19
|
+
|
20
|
+
=end
|
21
|
+
require "define_method_handler"
|
22
|
+
|
23
|
+
module FastRuby
|
24
|
+
class Pipeline
|
25
|
+
def initialize
|
26
|
+
@array = Array.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def << (object)
|
30
|
+
@array << object
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(arg)
|
34
|
+
|
35
|
+
last_result = arg
|
36
|
+
@array.each do |processor|
|
37
|
+
last_result = processor.call(last_result)
|
38
|
+
end
|
39
|
+
|
40
|
+
last_result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|