fastruby 0.0.19 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/CHANGELOG +8 -0
  2. data/{README → README.rdoc} +6 -1
  3. data/Rakefile +7 -7
  4. data/benchmarks/benchmark.rb~ +14 -2
  5. data/ext/fastruby_base/fastruby_base.inl +8 -4
  6. data/lib/fastruby/builder/inference_updater.rb +76 -0
  7. data/lib/fastruby/builder/inference_updater.rb~ +76 -0
  8. data/lib/fastruby/builder/inferencer.rb +38 -0
  9. data/lib/fastruby/{inliner → builder}/inliner.rb +16 -27
  10. data/lib/fastruby/builder/inliner.rb~ +60 -0
  11. data/lib/fastruby/builder/locals_inference.rb +53 -0
  12. data/lib/fastruby/builder/lvar_type.rb +43 -0
  13. data/lib/fastruby/builder/lvar_type.rb~ +44 -0
  14. data/lib/fastruby/builder/pipeline.rb +43 -0
  15. data/lib/fastruby/builder/pipeline.rb~ +43 -0
  16. data/lib/fastruby/{reductor → builder}/reductor.rb +6 -3
  17. data/lib/fastruby/builder/reductor.rb~ +42 -0
  18. data/lib/fastruby/builder.rb +73 -25
  19. data/lib/fastruby/builder.rb~ +311 -0
  20. data/lib/fastruby/corelib/fixnum.rb +75 -0
  21. data/lib/fastruby/corelib/fixnum.rb~ +146 -0
  22. data/lib/fastruby/corelib/integer.rb +96 -0
  23. data/lib/fastruby/corelib/integer.rb~ +96 -0
  24. data/lib/fastruby/corelib.rb +23 -0
  25. data/lib/fastruby/corelib.rb~ +23 -0
  26. data/lib/fastruby/getlocals.rb +3 -1
  27. data/lib/fastruby/logging.rb +2 -2
  28. data/lib/fastruby/modules/inferencer/infer.rb +31 -0
  29. data/lib/fastruby/modules/inferencer/literal.rb +42 -0
  30. data/lib/fastruby/modules/inliner/call.rb +327 -0
  31. data/lib/fastruby/{inliner/modules/call.rb → modules/inliner/call.rb~} +14 -24
  32. data/lib/fastruby/modules/inliner/defn.rb +41 -0
  33. data/lib/fastruby/modules/inliner/defn.rb~ +29 -0
  34. data/lib/fastruby/modules/inliner/recursive.rb +40 -0
  35. data/lib/fastruby/{inliner/modules/recursive.rb → modules/inliner/recursive.rb~} +1 -1
  36. data/lib/fastruby/modules/lvar_type/call.rb +36 -0
  37. data/lib/fastruby/modules/lvar_type/call.rb~ +36 -0
  38. data/lib/fastruby/modules/lvar_type/defn.rb +42 -0
  39. data/lib/fastruby/modules/lvar_type/defn.rb~ +42 -0
  40. data/lib/fastruby/modules/lvar_type/lasgn.rb +41 -0
  41. data/lib/fastruby/modules/lvar_type/lasgn.rb~ +42 -0
  42. data/lib/fastruby/modules/lvar_type/recursive.rb +33 -0
  43. data/lib/fastruby/modules/lvar_type/recursive.rb~ +33 -0
  44. data/lib/fastruby/{reductor/modules → modules/reductor}/case.rb +0 -0
  45. data/lib/fastruby/modules/reductor/fastruby_flag.rb +33 -0
  46. data/lib/fastruby/{reductor/modules → modules/reductor}/for.rb +0 -0
  47. data/lib/fastruby/{reductor/modules → modules/reductor}/nontree.rb +0 -0
  48. data/lib/fastruby/modules/reductor/nontree.rb~ +32 -0
  49. data/lib/fastruby/{reductor/modules → modules/reductor}/recursive.rb +1 -1
  50. data/lib/fastruby/modules/reductor/recursive.rb~ +31 -0
  51. data/lib/fastruby/{translator/modules → modules/translator}/block.rb +0 -0
  52. data/lib/fastruby/modules/translator/call.rb +344 -0
  53. data/lib/fastruby/{translator/modules/call.rb → modules/translator/call.rb~} +24 -3
  54. data/lib/fastruby/{translator/modules → modules/translator}/defn.rb +10 -9
  55. data/lib/fastruby/modules/translator/defn.rb~ +267 -0
  56. data/lib/fastruby/{translator/modules → modules/translator}/directive.rb +3 -1
  57. data/lib/fastruby/modules/translator/directive.rb~ +44 -0
  58. data/lib/fastruby/{translator/modules → modules/translator}/exceptions.rb +3 -1
  59. data/lib/fastruby/modules/translator/exceptions.rb~ +120 -0
  60. data/lib/fastruby/{translator/modules → modules/translator}/flow.rb +0 -0
  61. data/lib/fastruby/modules/translator/iter.rb +745 -0
  62. data/lib/fastruby/{translator/modules/iter.rb → modules/translator/iter.rb~} +103 -48
  63. data/lib/fastruby/modules/translator/literal.rb +150 -0
  64. data/lib/fastruby/{translator/modules/literal.rb → modules/translator/literal.rb~} +3 -3
  65. data/lib/fastruby/{translator/modules → modules/translator}/logical.rb +0 -0
  66. data/lib/fastruby/{translator/modules → modules/translator}/method_group.rb +0 -0
  67. data/lib/fastruby/{translator/modules → modules/translator}/nonlocal.rb +18 -6
  68. data/lib/fastruby/modules/translator/nonlocal.rb~ +298 -0
  69. data/lib/fastruby/modules/translator/static.rb +290 -0
  70. data/lib/fastruby/{translator/modules/static.rb → modules/translator/static.rb~} +66 -17
  71. data/lib/fastruby/modules/translator/variable.rb +280 -0
  72. data/lib/fastruby/{translator/modules/variable.rb → modules/translator/variable.rb~} +14 -44
  73. data/lib/fastruby/modules.rb +30 -0
  74. data/lib/fastruby/object.rb +42 -6
  75. data/lib/fastruby/object.rb~ +159 -0
  76. data/lib/fastruby/set_tree.rb +7 -11
  77. data/lib/fastruby/set_tree.rb~ +71 -0
  78. data/lib/fastruby/sexp_extension.rb +29 -7
  79. data/lib/fastruby/sexp_extension.rb~ +262 -0
  80. data/lib/fastruby/translator/scope_mode_helper.rb~ +138 -0
  81. data/lib/fastruby/translator/translator.rb +87 -92
  82. data/lib/fastruby/translator/translator.rb~ +1600 -0
  83. data/lib/fastruby/translator/translator_modules.rb +3 -1
  84. data/lib/fastruby/translator/translator_modules.rb~ +53 -0
  85. data/lib/fastruby.rb +3 -1
  86. data/lib/fastruby.rb~ +3 -1
  87. data/lib/fastruby_only/base.rb +1 -0
  88. data/spec/corelib/numeric/fixnum_spec.rb +110 -0
  89. data/spec/corelib/numeric/fixnum_spec.rb~ +104 -0
  90. data/spec/corelib/numeric/integer_spec.rb +173 -0
  91. data/spec/corelib/numeric/integer_spec.rb~ +173 -0
  92. data/spec/fastruby_only/base_spec.rb +74 -0
  93. data/spec/graph/base_spec.rb +2 -1
  94. data/spec/graph/base_spec.rb~ +35 -0
  95. data/spec/graph/path_spec.rb +2 -2
  96. data/spec/graph/path_spec.rb~ +48 -0
  97. data/spec/graph/vertex_spec.rb +2 -1
  98. data/spec/graph/vertex_spec.rb~ +58 -0
  99. data/spec/reductor/base_spec.rb +1 -1
  100. data/spec/ruby/block/lambda_spec.rb~ +163 -0
  101. data/spec/ruby/block/proc_as_block_spec.rb~ +69 -1
  102. data/spec/ruby/block_spec.rb~ +2 -494
  103. data/spec/ruby/call/base_call_spec.rb +1 -1
  104. data/spec/ruby/call/base_call_spec.rb~ +2 -60
  105. data/spec/ruby/defn/replacement_spec.rb +26 -14
  106. data/spec/ruby/defn/replacement_spec.rb~ +13 -3
  107. data/spec/ruby/exception/internal_ex_spec.rb~ +86 -0
  108. data/spec/ruby/integrity_spec.rb~ +35 -1
  109. data/spec/ruby/variable_spec.rb~ +31 -0
  110. data/spec/scope_mode/flow_spec.rb +1 -1
  111. data/spec/scope_mode/flow_spec.rb~ +109 -0
  112. data/spec/sugar/base_spec.rb +29 -0
  113. data/spec/sugar/base_spec.rb~ +16 -0
  114. metadata +100 -43
  115. data/spec/fastruby/inliner/modules/call_spec.rb +0 -0
  116. data/spec/fastruby/translator/modules/nonlocal_spec.rb +0 -0
  117. data/spec/fastruby/translator/translator_spec.rb +0 -0
  118. data/spec/ruby/block/arguments_spec.rb~ +0 -214
  119. data/spec/ruby/block/break_spec.rb~ +0 -236
  120. data/spec/ruby/block/next_spec.rb~ +0 -85
  121. data/spec/ruby/block/retry_spec.rb~ +0 -43
@@ -21,6 +21,7 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
21
21
  require "set"
22
22
  require "sexp"
23
23
  require "define_method_handler"
24
+ require "fastruby/modules"
24
25
 
25
26
  module FastRuby
26
27
  class Reductor
@@ -28,12 +29,14 @@ module FastRuby
28
29
  define_method_handler(:reduce, options, &blk).condition{|tree| tree.respond_to?(:node_type) && tree.node_type == ntype}
29
30
  end
30
31
 
32
+ def call(*args)
33
+ reduce *args
34
+ end
35
+
31
36
  define_method_handler(:reduce, :priority => -1000) do |tree|
32
37
  FastRubySexp.from_sexp(tree)
33
38
  end
34
39
 
35
- Dir.glob(FastRuby.fastruby_load_path + "/fastruby/reductor/modules/**/*.rb").each do |path|
36
- require path
37
- end
40
+ FastRuby::Modules.load_all("reductor")
38
41
  end
39
42
  end
@@ -0,0 +1,42 @@
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 Reductor
28
+ def self.reduce_for(ntype, options = {}, &blk)
29
+ define_method_handler(:reduce, options, &blk).condition{|*x| tree = x.first; tree.respond_to?(:node_type) && tree.node_type == ntype}
30
+ end
31
+
32
+ def call(*args)
33
+ reduce args.first
34
+ end
35
+
36
+ define_method_handler(:reduce, :priority => -1000) do |*x| tree = x.first;
37
+ FastRubySexp.from_sexp(tree)
38
+ end
39
+
40
+ FastRuby::Modules.load_all("reductor")
41
+ end
42
+ end
@@ -22,19 +22,18 @@ require "fastruby/method_extension"
22
22
  require "fastruby/logging"
23
23
  require "fastruby/getlocals"
24
24
  require "fastruby_load_path"
25
- require "fastruby/inliner/inliner"
26
- require "fastruby/translator/translator"
27
- require "rubygems"
28
- require "inline"
29
- require "fastruby/inline_extension"
25
+ require "fastruby/builder/inliner"
26
+ require "fastruby/builder/inferencer"
27
+ require "fastruby/builder/lvar_type"
28
+ require "fastruby/builder/pipeline"
29
+ require "fastruby/builder/locals_inference"
30
+ require "fastruby/builder/inference_updater"
30
31
 
31
32
  require FastRuby.fastruby_load_path + "/../ext/fastruby_base/fastruby_base"
32
33
 
33
34
  module FastRuby
34
35
  class Method
35
- attr_accessor :locals
36
36
  attr_accessor :options
37
- attr_accessor :snippet_hash
38
37
 
39
38
  def initialize(method_name, owner)
40
39
  @method_name = method_name
@@ -69,15 +68,22 @@ module FastRuby
69
68
  rebuild(signature, noreturn)
70
69
  end
71
70
 
71
+ def has_loops?(tree)
72
+ if tree.respond_to? :node_type
73
+ nt = tree.node_type
74
+ return false if nt == :defn or nt == :defs
75
+ return true if nt == :for or nt == :iter or nt == :while or nt == :retry
76
+ tree.each do |subtree|
77
+ return true if has_loops? subtree
78
+ end
79
+ end
80
+ false
81
+ end
82
+
72
83
  def rebuild(signature, noreturn = false)
73
84
  no_cache = false
74
85
  mname = FastRuby.make_str_signature(@method_name, signature)
75
86
 
76
- inliner = FastRuby::Inliner.new
77
-
78
- context = FastRuby::Context.new
79
- context.options = options
80
-
81
87
  args_tree = if tree[0] == :defn
82
88
  tree[2]
83
89
  elsif tree[0] == :defs
@@ -85,10 +91,15 @@ module FastRuby
85
91
  else
86
92
  raise ArgumentError, "unknown type of method definition #{tree[0]}"
87
93
  end
94
+
95
+ impl_tree = if tree[0] == :defn
96
+ tree[3]
97
+ elsif tree[0] == :defs
98
+ tree[4]
99
+ end
88
100
 
89
101
  # create random method name
90
- context.snippet_hash = snippet_hash
91
- context.alt_method_name = "_" + @method_name.to_s + "_" + rand(10000000000).to_s
102
+ infer_lvar_map = Hash.new
92
103
 
93
104
  (1..signature.size-1).each do |i|
94
105
  arg = args_tree[i]
@@ -97,26 +108,48 @@ module FastRuby
97
108
 
98
109
  if arg
99
110
  if arg.to_s.match(/\*/)
100
- context.infer_lvar_map[arg.to_s.gsub("*","").to_sym] = Array
111
+ infer_lvar_map[arg.to_s.gsub("*","").to_sym] = Array
101
112
  else
102
- context.infer_lvar_map[arg.to_sym] = signature[i]
113
+ infer_lvar_map[arg.to_sym] = signature[i]
103
114
  end
104
115
  end
105
116
  end
106
117
  end
107
118
 
108
- context.infer_self = signature[0]
119
+ inferencer = Inferencer.new
120
+ inferencer.infer_self = signature[0]
109
121
 
110
- inliner.infer_self = context.infer_self
111
- inliner.infer_lvar_map = context.infer_lvar_map
112
-
113
- inlined_tree = inliner.inline(tree)
114
- context.locals = locals + inliner.extra_locals
122
+ locals_inference = LocalsInference.new
123
+ locals_inference.infer_self = signature[0]
124
+ locals_inference.infer_lvar_map = infer_lvar_map
125
+
126
+ inference_updater = InferenceUpdater.new(inferencer)
127
+
128
+ inliner = FastRuby::Inliner.new(inferencer)
129
+ pipeline = Pipeline.new
130
+
131
+ if options[:validate_lvar_types]
132
+ pipeline << LvarType.new(locals_inference)
133
+ end
134
+ pipeline << locals_inference
115
135
 
116
- inliner.extra_inferences.each do |local, itype|
117
- context.infer_lvar_map[local] = itype
136
+ if has_loops?(impl_tree)
137
+ pipeline << inliner
138
+ if options[:validate_lvar_types]
139
+ pipeline << LvarType.new(locals_inference)
140
+ end
141
+
142
+ pipeline << inference_updater
143
+ pipeline << inliner
144
+ if options[:validate_lvar_types]
145
+ pipeline << LvarType.new(locals_inference)
146
+ end
147
+
148
+ pipeline << inference_updater
118
149
  end
119
150
 
151
+ inlined_tree = pipeline.call(tree)
152
+
120
153
  inliner.inlined_methods.each do |inlined_method|
121
154
  inlined_method.observe("#{@owner}##{@method_name}#{mname}") do |imethod|
122
155
  rebuild(signature, noreturn)
@@ -133,6 +166,20 @@ module FastRuby
133
166
 
134
167
  $last_obj_proc = nil
135
168
  if paths.empty?
169
+ unless Object.respond_to? :inline
170
+ require "rubygems"
171
+ require "inline"
172
+ require "fastruby/inline_extension"
173
+ end
174
+
175
+ unless defined? FastRuby::Context
176
+ require "fastruby/translator/translator"
177
+ end
178
+
179
+ context = FastRuby::Context.new(true, inferencer)
180
+ context.options = options
181
+ context.locals = FastRuby::GetLocalsProcessor.get_locals(inlined_tree)
182
+
136
183
  FastRuby.logger.info "Compiling #{@owner}::#{@method_name} for signature #{signature.inspect}"
137
184
  c_code = context.to_c_method(inlined_tree,signature)
138
185
 
@@ -248,8 +295,9 @@ module FastRuby
248
295
  @method_hash = Hash.new unless @method_hash
249
296
  @method_hash[method_name]
250
297
  end
251
-
298
+
252
299
  def method_added(method_name)
300
+ clear_method_hash_addresses(@method_hash[method_name]) if @method_hash and @method_hash[method_name]
253
301
  FastRuby.unset_tree(self,method_name)
254
302
  end
255
303
 
@@ -0,0 +1,311 @@
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 "fastruby/method_extension"
22
+ require "fastruby/logging"
23
+ require "fastruby/getlocals"
24
+ require "fastruby_load_path"
25
+ require "fastruby/builder/inliner"
26
+ require "fastruby/builder/inferencer"
27
+ require "fastruby/builder/lvar_type"
28
+ require "fastruby/builder/pipeline"
29
+ require "fastruby/builder/locals_inference"
30
+ require "fastruby/builder/inference_updater"
31
+
32
+ require FastRuby.fastruby_load_path + "/../ext/fastruby_base/fastruby_base"
33
+
34
+ module FastRuby
35
+ class Method
36
+ attr_accessor :options
37
+
38
+ def initialize(method_name, owner)
39
+ @method_name = method_name
40
+ @owner = owner
41
+ @observers = Hash.new
42
+ end
43
+
44
+ def observe(key, &blk)
45
+ @observers[key] = blk
46
+ end
47
+
48
+ def tree_changed
49
+ @observers.values.each do |observer|
50
+ observer.call(self)
51
+ end
52
+ end
53
+
54
+ def build(signature, noreturn = false)
55
+ return nil unless tree
56
+
57
+ no_cache = false
58
+ mname = FastRuby.make_str_signature(@method_name, signature)
59
+
60
+ if @owner.respond_to? :method_hash
61
+ method_hash = @owner.method_hash(@method_name.to_sym) || {}
62
+ if (@owner.has_fastruby_function(method_hash,mname.to_s))
63
+ FastRuby.logger.info "NOT Building #{@owner}::#{@method_name} for signature #{signature.inspect}, it's already done"
64
+ return nil
65
+ end
66
+ end
67
+
68
+ rebuild(signature, noreturn)
69
+ end
70
+
71
+ def has_loops?(tree)
72
+ if tree.respond_to? :node_type
73
+ nt = tree.node_type
74
+ return false if nt == :defn or nt == :defs
75
+ return true if nt == :for or nt == :iter or nt == :while or nt == :retry
76
+ tree.each do |subtree|
77
+ return true if has_loops? subtree
78
+ end
79
+ end
80
+ false
81
+ end
82
+
83
+ def rebuild(signature, noreturn = false)
84
+ no_cache = false
85
+ mname = FastRuby.make_str_signature(@method_name, signature)
86
+
87
+ args_tree = if tree[0] == :defn
88
+ tree[2]
89
+ elsif tree[0] == :defs
90
+ tree[3]
91
+ else
92
+ raise ArgumentError, "unknown type of method definition #{tree[0]}"
93
+ end
94
+
95
+ impl_tree = if tree[0] == :defn
96
+ tree[3]
97
+ elsif tree[0] == :defs
98
+ tree[4]
99
+ end
100
+
101
+ # create random method name
102
+ infer_lvar_map = Hash.new
103
+
104
+ (1..signature.size-1).each do |i|
105
+ arg = args_tree[i]
106
+
107
+ if arg.instance_of? Symbol
108
+
109
+ if arg
110
+ if arg.to_s.match(/\*/)
111
+ infer_lvar_map[arg.to_s.gsub("*","").to_sym] = Array
112
+ else
113
+ infer_lvar_map[arg.to_sym] = signature[i]
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ inferencer = Inferencer.new
120
+ inferencer.infer_self = signature[0]
121
+
122
+ locals_inference = LocalsInference.new
123
+ locals_inference.infer_self = signature[0]
124
+ locals_inference.infer_lvar_map = infer_lvar_map
125
+
126
+ inference_updater = InferenceUpdater.new(inferencer)
127
+
128
+ inliner = FastRuby::Inliner.new(inferencer)
129
+ pipeline = Pipeline.new
130
+
131
+ if options[:validate_lvar_types]
132
+ pipeline << LvarType.new(locals_inference)
133
+ end
134
+ pipeline << locals_inference
135
+
136
+ if has_loops?(impl_tree)
137
+ pipeline << inliner
138
+ if options[:validate_lvar_types]
139
+ pipeline << LvarType.new(locals_inference)
140
+ end
141
+
142
+ pipeline << inference_updater
143
+ pipeline << inliner
144
+ if options[:validate_lvar_types]
145
+ pipeline << LvarType.new(locals_inference)
146
+ end
147
+
148
+ pipeline << inference_updater
149
+ end
150
+
151
+ inlined_tree = pipeline.call(tree)
152
+
153
+ inliner.inlined_methods.each do |inlined_method|
154
+ inlined_method.observe("#{@owner}##{@method_name}#{mname}") do |imethod|
155
+ rebuild(signature, noreturn)
156
+ end
157
+ end
158
+
159
+ alt_options = options.dup
160
+ alt_options.delete(:self)
161
+
162
+ require "pry"; binding.pry
163
+ code_sha1 = FastRuby.cache.hash_snippet(inlined_tree.inspect, FastRuby::VERSION + signature.map(&:to_s).join('-') + alt_options.inspect)
164
+
165
+ paths = FastRuby.cache.retrieve(code_sha1)
166
+
167
+ $last_obj_proc = nil
168
+ if paths.empty?
169
+ unless Object.respond_to? :inline
170
+ require "rubygems"
171
+ require "inline"
172
+ require "fastruby/inline_extension"
173
+ end
174
+
175
+ unless defined? FastRuby::Context
176
+ require "fastruby/translator/translator"
177
+ end
178
+
179
+ context = FastRuby::Context.new(true, inferencer)
180
+ context.options = options
181
+ context.locals = FastRuby::GetLocalsProcessor.get_locals(inlined_tree)
182
+
183
+ FastRuby.logger.info "Compiling #{@owner}::#{@method_name} for signature #{signature.inspect}"
184
+ c_code = context.to_c_method(inlined_tree,signature)
185
+
186
+ unless options[:main]
187
+ context.define_method_at_init(@method_name, args_tree.size+1, signature)
188
+ end
189
+
190
+ so_name = nil
191
+
192
+ old_class_self = $class_self
193
+ $class_self = @owner
194
+
195
+ begin
196
+
197
+ unless $inline_extra_flags
198
+ $inline_extra_flags = true
199
+
200
+ ['CFLAGS','CXXFLAGS','OPTFLAGS','cflags','cxxflags','optflags'].each do |name|
201
+ RbConfig::CONFIG[name].gsub!(/\-O\d/,"-O1") if RbConfig::CONFIG[name]
202
+ end
203
+
204
+ if RUBY_VERSION =~ /^1\.8/
205
+ RbConfig::CONFIG['CFLAGS'] << " -DRUBY_1_8 -Wno-clobbered"
206
+ elsif RUBY_VERSION =~ /^1\.9/
207
+ RbConfig::CONFIG['CFLAGS'] << " -DRUBY_1_9 -Wno-clobbered"
208
+ end
209
+ end
210
+
211
+ @owner.class_eval do
212
+ inline :C do |builder|
213
+ builder.inc << context.extra_code
214
+ builder.init_extra = context.init_extra
215
+
216
+ def builder.generate_ext
217
+ ext = []
218
+
219
+ @inc.unshift "#include \"ruby.h\""
220
+
221
+ ext << @inc
222
+ ext << nil
223
+ ext << @src.join("\n\n")
224
+ ext << nil
225
+ ext << nil
226
+ ext << "#ifdef __cplusplus"
227
+ ext << "extern \"C\" {"
228
+ ext << "#endif"
229
+ ext << " void Init_#{module_name}() {"
230
+
231
+ ext << @init_extra.join("\n") unless @init_extra.empty?
232
+
233
+ ext << nil
234
+ ext << " }"
235
+ ext << "#ifdef __cplusplus"
236
+ ext << "}"
237
+ ext << "#endif"
238
+ ext << nil
239
+
240
+ ext.join "\n"
241
+ end
242
+
243
+ builder.c c_code
244
+ so_name = builder.so_name
245
+ end
246
+ end
247
+
248
+ unless no_cache
249
+ no_cache = context.no_cache
250
+ end
251
+
252
+ unless no_cache
253
+ FastRuby.cache.insert(code_sha1, so_name)
254
+ end
255
+ ensure
256
+ $class_self = old_class_self
257
+ end
258
+ else
259
+ paths.each do |path|
260
+ require path
261
+ end
262
+ end
263
+
264
+ if $last_obj_proc
265
+ FastRuby.cache.register_proc(code_sha1, $last_obj_proc)
266
+ end
267
+
268
+ $class_self = @owner
269
+ begin
270
+ FastRuby.cache.execute(code_sha1, signature, @owner)
271
+ ensure
272
+ $class_self = old_class_self
273
+ end
274
+
275
+ observe("#{@owner}##{@method_name}#{mname}") do |imethod|
276
+ if tree
277
+ rebuild(signature, noreturn)
278
+ end
279
+ end
280
+ end
281
+ end
282
+
283
+ module BuilderModule
284
+ def build(signature, method_name, noreturn = false)
285
+ fastruby_method(method_name.to_sym).build(signature, noreturn)
286
+ end
287
+
288
+ def register_method_value(method_name,key,value)
289
+ @method_hash = Hash.new unless @method_hash
290
+ @method_hash[method_name] = Hash.new unless @method_hash[method_name]
291
+ @method_hash[method_name][key] = value
292
+ end
293
+
294
+ def method_hash(method_name)
295
+ @method_hash = Hash.new unless @method_hash
296
+ @method_hash[method_name]
297
+ end
298
+
299
+ def method_added(method_name)
300
+ clear_method_hash_addresses(@method_hash[method_name]) if @method_hash and @method_hash[method_name]
301
+ FastRuby.unset_tree(self,method_name)
302
+ end
303
+
304
+ def fastruby_method(mname_)
305
+ mname = mname_.to_sym
306
+ @fastruby_method = Hash.new unless @fastruby_method
307
+ @fastruby_method[mname] = FastRuby::Method.new(mname,self) unless @fastruby_method[mname]
308
+ @fastruby_method[mname]
309
+ end
310
+ end
311
+ end
@@ -0,0 +1,75 @@
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 "fastruby/sexp_extension"
22
+
23
+ class Fixnum
24
+ fastruby(:fastruby_only => true, :skip_reduce => true) do
25
+ if RUBY_VERSION =~ /^1\\.9/
26
+ def +(b)
27
+ if b._class == Fixnum
28
+ _static{LONG2NUM(FIX2LONG(self)+FIX2LONG(b))}
29
+ elsif b._class == Bignum
30
+ _static{rb_big_plus(b,self)}
31
+ elsif b._class == Float
32
+ _static{DBL2NUM(FIX2LONG(self) + RFLOAT_VALUE(b))}
33
+ else
34
+ _static{rb_num_coerce_bin(self, b, inline_c("'+'"))}
35
+ end
36
+ end
37
+
38
+ def -(b)
39
+ if b._class == Fixnum
40
+ _static{LONG2NUM(FIX2LONG(self)-FIX2LONG(b))}
41
+ elsif b._class == Bignum
42
+ _static{rb_big_minus(rb_int2big(FIX2LONG(self)),b)}
43
+ elsif b._class == Float
44
+ _static{DBL2NUM(FIX2LONG(self) - RFLOAT_VALUE(b))}
45
+ else
46
+ _static{rb_num_coerce_bin(self, b, inline_c("'-'"))}
47
+ end
48
+ end
49
+
50
+ def >(y)
51
+ if y._class == Fixnum
52
+ _static{FIX2LONG(self)>FIX2LONG(y) ? true: false }
53
+ elsif y._class == Bignum
54
+ _static{FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(self)), y)) > 0 ? true : false}
55
+ elsif y._class == Float
56
+ _static{FIX2LONG(self) > RFLOAT_VALUE(y) ? true : false}
57
+ else
58
+ _static{rb_num_coerce_relop(self, y, inline_c("'>'"))}
59
+ end
60
+ end
61
+
62
+ def <(y)
63
+ if y._class == Fixnum
64
+ _static{FIX2LONG(self)<FIX2LONG(y) ? true: false }
65
+ elsif y._class == Bignum
66
+ _static{FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(self)), y)) < 0 ? true : false}
67
+ elsif y._class == Float
68
+ _static{FIX2LONG(self) < RFLOAT_VALUE(y) ? true : false}
69
+ else
70
+ _static{rb_num_coerce_relop(self, y, inline_c("'<'"))}
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end