rubex 0.0.1 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.travis.yml +14 -0
  4. data/CONTRIBUTING.md +101 -0
  5. data/HISTORY.md +3 -0
  6. data/README.md +112 -297
  7. data/REFERENCE.md +753 -0
  8. data/Rakefile +4 -1
  9. data/TUTORIAL.md +234 -0
  10. data/bin/rubex +1 -1
  11. data/docs/_config.yml +1 -0
  12. data/docs/index.html +1 -0
  13. data/examples/c_struct_interface/c_struct_interface.rb +6 -0
  14. data/examples/c_struct_interface/c_struct_interface.rubex +47 -0
  15. data/examples/linked_list/linked_list.rubex +39 -0
  16. data/examples/linked_list/rb_linked_list.rb +8 -0
  17. data/examples/rcsv wrapper/rcsv/README.md +1 -0
  18. data/examples/rcsv wrapper/rcsv/Rakefile +7 -0
  19. data/examples/rcsv wrapper/rcsv/ext/rcsv/extconf.rb +3 -0
  20. data/examples/rcsv wrapper/rcsv/ext/rcsv/rcsv.c +302 -0
  21. data/examples/rcsv wrapper/rcsv/ext/rcsv/rcsv.rubex +124 -0
  22. data/examples/rcsv wrapper/rcsv/lib/rcsv.rb +8 -0
  23. data/examples/rcsv wrapper/rcsv/lib/rcsv.so +0 -0
  24. data/examples/rcsv wrapper/rcsv/lib/rcsv/version.rb +1 -0
  25. data/examples/rcsv wrapper/rcsv/rcsv.gemspec +27 -0
  26. data/examples/rcsv wrapper/rcsv/spec/rcsv.csv +5 -0
  27. data/examples/rcsv wrapper/rcsv/spec/rcsv_spec.rb +17 -0
  28. data/examples/rcsv wrapper/rcsv/spec/spec_helper.rb +6 -0
  29. data/{spec/fixtures/basic_ruby_method/Makefile → examples/rcsv wrapper/rcsv/tmp/x86_64-linux/rcsv/2.3.3/Makefile } +20 -20
  30. data/examples/rcsv wrapper/rcsv/tmp/x86_64-linux/rcsv/2.3.3/rcsv.o +0 -0
  31. data/examples/rcsv wrapper/rcsv/tmp/x86_64-linux/rcsv/2.3.3/rcsv.so +0 -0
  32. data/examples/rcsv wrapper/rcsv/tmp/x86_64-linux/stage/lib/rcsv.so +0 -0
  33. data/lib/rubex.rb +6 -50
  34. data/lib/rubex/ast.rb +1 -3
  35. data/lib/rubex/ast/expression.rb +1257 -8
  36. data/lib/rubex/ast/node.rb +226 -28
  37. data/lib/rubex/ast/statement.rb +1162 -35
  38. data/lib/rubex/ast/top_statement.rb +815 -0
  39. data/lib/rubex/code_writer.rb +103 -26
  40. data/lib/rubex/compiler.rb +72 -0
  41. data/lib/rubex/compiler_config.rb +19 -0
  42. data/lib/rubex/constants.rb +145 -8
  43. data/lib/rubex/data_type.rb +667 -4
  44. data/lib/rubex/error.rb +15 -0
  45. data/lib/rubex/helpers.rb +154 -0
  46. data/lib/rubex/lexer.rex +186 -22
  47. data/lib/rubex/lexer.rex.rb +261 -35
  48. data/lib/rubex/parser.racc +876 -28
  49. data/lib/rubex/parser.racc.rb +2845 -90
  50. data/lib/rubex/rake_task.rb +34 -0
  51. data/lib/rubex/symbol_table/entry.rb +17 -3
  52. data/lib/rubex/symbol_table/scope.rb +298 -25
  53. data/lib/rubex/version.rb +1 -1
  54. data/rubex.gemspec +11 -3
  55. data/spec/basic_ruby_method_spec.rb +15 -21
  56. data/spec/binding_ptr_args_spec.rb +33 -0
  57. data/spec/bitwise_operators_spec.rb +40 -0
  58. data/spec/blocks_spec.rb +35 -0
  59. data/spec/c_bindings_spec.rb +36 -0
  60. data/spec/c_constants_spec.rb +33 -0
  61. data/spec/c_function_ptrs_spec.rb +38 -0
  62. data/spec/c_functions_spec.rb +35 -0
  63. data/spec/c_struct_interface_spec.rb +38 -0
  64. data/spec/call_by_reference_spec.rb +33 -0
  65. data/spec/class_methods_spec.rb +33 -0
  66. data/spec/class_spec.rb +40 -0
  67. data/spec/comments_spec.rb +33 -0
  68. data/spec/default_args_spec.rb +37 -0
  69. data/spec/error_handling_spec.rb +42 -0
  70. data/spec/examples_spec.rb +52 -0
  71. data/spec/expressions_spec.rb +33 -0
  72. data/spec/fixtures/basic_ruby_method/basic_ruby_method.rubex +2 -0
  73. data/spec/fixtures/binding_ptr_args/binding_ptr_args.rubex +30 -0
  74. data/spec/fixtures/bitwise_operators/bitwise_operators.rubex +40 -0
  75. data/spec/fixtures/blocks/blocks.rubex +11 -0
  76. data/spec/fixtures/c_bindings/c_bindings.rubex +58 -0
  77. data/spec/fixtures/c_constants/c_constants.rubex +7 -0
  78. data/spec/fixtures/c_function_ptrs/c_function_ptrs.rubex +52 -0
  79. data/spec/fixtures/c_functions/c_functions.rubex +25 -0
  80. data/spec/fixtures/c_struct_interface/c_struct_interface.rubex +34 -0
  81. data/spec/fixtures/call_by_reference/call_by_reference.rubex +30 -0
  82. data/spec/fixtures/class/class.rubex +20 -0
  83. data/spec/fixtures/class_methods/class_methods.rubex +12 -0
  84. data/spec/fixtures/comments/comments.rubex +9 -0
  85. data/spec/fixtures/default_args/default_args.rubex +11 -0
  86. data/spec/fixtures/error_handling/error_handling.rubex +54 -0
  87. data/spec/fixtures/examples/array_to_hash.rubex +14 -0
  88. data/spec/fixtures/examples/rcsv.csv +5 -0
  89. data/spec/fixtures/examples/rcsv.rubex +329 -0
  90. data/spec/fixtures/expressions/expressions.rubex +10 -0
  91. data/spec/fixtures/if_else/if_else.rubex +77 -0
  92. data/spec/fixtures/implicit_lib_include/implicit_lib_include.rubex +15 -0
  93. data/spec/fixtures/init_ruby_objects_with_literal_syntax/init_ruby_objects_with_literal_syntax.rubex +17 -0
  94. data/spec/fixtures/loops/loops.rubex +33 -0
  95. data/spec/fixtures/recursion/recursion.rubex +9 -0
  96. data/spec/fixtures/ruby_constant_method_calls/ruby_constant_method_calls.rubex +17 -0
  97. data/spec/fixtures/ruby_operators/ruby_operators.rubex +29 -0
  98. data/spec/fixtures/ruby_raise/ruby_raise.rubex +13 -0
  99. data/spec/fixtures/ruby_strings/ruby_strings.rubex +19 -0
  100. data/spec/fixtures/ruby_strings/string_blank_bm.rb +37 -0
  101. data/spec/fixtures/ruby_symbols/ruby_symbols.rubex +12 -0
  102. data/spec/fixtures/ruby_types/ruby_types.rubex +15 -0
  103. data/spec/fixtures/statement_expression/statement_expression.rubex +23 -0
  104. data/spec/fixtures/static_array/static_array.rubex +20 -0
  105. data/spec/fixtures/string_literals/string_literals.rubex +15 -0
  106. data/spec/fixtures/struct/struct.rubex +82 -0
  107. data/spec/fixtures/typecasting/typecasting.rubex +23 -0
  108. data/spec/fixtures/var_declarations/var_declarations.rubex +39 -0
  109. data/spec/if_else_spec.rb +39 -0
  110. data/spec/implicit_lib_include_spec.rb +33 -0
  111. data/spec/init_ruby_objects_with_literal_syntax_spec.rb +39 -0
  112. data/spec/loops_spec.rb +34 -0
  113. data/spec/recursion_spec.rb +35 -0
  114. data/spec/ruby_constant_method_calls_spec.rb +35 -0
  115. data/spec/ruby_operators_spec.rb +40 -0
  116. data/spec/ruby_raise_spec.rb +35 -0
  117. data/spec/ruby_strings_spec.rb +33 -0
  118. data/spec/ruby_symbols_spec.rb +37 -0
  119. data/spec/ruby_types_spec.rb +35 -0
  120. data/spec/spec_helper.rb +54 -1
  121. data/spec/statement_expression_spec.rb +34 -0
  122. data/spec/static_array_spec.rb +33 -0
  123. data/spec/string_literals_spec.rb +34 -0
  124. data/spec/struct_spec.rb +36 -0
  125. data/spec/typecasting_spec.rb +38 -0
  126. data/spec/var_declarions_spec.rb +35 -0
  127. metadata +255 -29
  128. data/lib/rubex/ast/argument_list.rb +0 -20
  129. data/lib/rubex/ast/c_base_type.rb +0 -11
  130. data/lib/rubex/ast/ruby_method_def.rb +0 -84
  131. data/spec/fixtures/basic_ruby_method/basic.rb +0 -3
  132. data/spec/fixtures/basic_ruby_method/basic_ruby_method.c +0 -16
  133. data/spec/fixtures/basic_ruby_method/basic_ruby_method.o +0 -0
  134. data/spec/fixtures/basic_ruby_method/basic_ruby_method.so +0 -0
  135. data/spec/fixtures/basic_ruby_method/extconf.rb +0 -3
@@ -0,0 +1,34 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+ require "rake/extensiontask"
4
+ require_relative '../rubex.rb'
5
+
6
+ module Rubex
7
+ class RakeTask < ::Rake::TaskLib
8
+
9
+ def initialize name, gem_spec=nil
10
+ @name = name
11
+ @gem_spec = gem_spec
12
+ @ext_dir = "ext/#{@name}"
13
+ @lib_dir = 'lib'
14
+ @source_pattern = "*.rubex"
15
+ @compiled_pattern = "*.c"
16
+ @config_script = "extconf.rb"
17
+ define_compile_tasks
18
+ end
19
+
20
+ def define_compile_tasks
21
+ namespace :rubex do
22
+ desc "Compile a Rubex file into a shared object."
23
+ task :compile do
24
+ file_name = "#{Dir.pwd}/#{@ext_dir}/#{@name}#{@source_pattern[1..-1]}"
25
+ Rubex::Compiler.compile file_name, directory: "#{@ext_dir}"
26
+ end
27
+ end
28
+ Rake::ExtensionTask.new(@name)
29
+
30
+ desc "Compile Rubex code into a .so file for use in Ruby scripts."
31
+ task :compile => "rubex:compile"
32
+ end
33
+ end # class RakeTask
34
+ end # module Rubex
@@ -7,10 +7,24 @@ module Rubex
7
7
  attr_accessor :c_name
8
8
  # Ctype of the the entry.
9
9
  attr_accessor :type
10
+ # Default value of the entry, if any.
11
+ attr_accessor :value
12
+ # Is an extern entry
13
+ attr_accessor :extern
14
+ # Is a Ruby singleton method
15
+ attr_accessor :singleton
10
16
 
11
- def initialize name, c_name, type
12
- @name, @c_name, @type = name, c_name, type
17
+ def initialize name, c_name, type, value
18
+ @name, @c_name, @type, @value = name, c_name, type, value
13
19
  end
20
+
21
+ def c_code local_scope
22
+ c_name
23
+ end
24
+
25
+ def extern?; @extern; end
26
+
27
+ def singleton?; @singleton; end
14
28
  end
15
29
  end
16
- end
30
+ end
@@ -1,57 +1,330 @@
1
1
  module Rubex
2
2
  module SymbolTable
3
3
  module Scope
4
- attr_accessor :entries, :outer_scope, :arg_entries, :return_type
4
+ attr_accessor :entries
5
+ attr_accessor :outer_scope
6
+ attr_accessor :arg_entries
7
+ attr_accessor :type
8
+ attr_accessor :var_entries
9
+ attr_accessor :ruby_obj_entries
10
+ attr_accessor :carray_entries
11
+ attr_accessor :sue_entries
12
+ attr_accessor :c_method_entries
13
+ attr_accessor :type_entries
14
+ attr_accessor :ruby_class_entries
15
+ attr_accessor :ruby_method_entries
16
+ attr_accessor :ruby_constant_entries
17
+ attr_accessor :self_name
18
+ attr_accessor :temp_entries
19
+ attr_accessor :free_temp_entries
20
+ attr_accessor :global_entries
21
+ attr_reader :klass_name, :name
5
22
 
6
23
  def initialize outer_scope=nil
7
24
  @outer_scope = outer_scope
8
25
  @entries = {}
9
26
  @arg_entries = []
10
- @return_type = nil
27
+ @var_entries = []
28
+ @type = nil
29
+ @ruby_obj_entries = []
30
+ @carray_entries = []
31
+ @sue_entries = []
32
+ @c_method_entries = []
33
+ @type_entries = []
34
+ @ruby_class_entries = []
35
+ @ruby_method_entries = []
36
+ @ruby_constant_entries = []
37
+ @self_name = ""
38
+ @klass_name = ""
39
+ @temp_entries = []
40
+ @free_temp_entries = []
41
+ @global_entries = []
42
+ @temp_counter = 0
43
+ end
44
+
45
+ def check_entry name
46
+ if @entries.has_key? name
47
+ raise "Symbol name #{name} already exists in this scope."
48
+ end
49
+ end
50
+
51
+ # vars - Rubex::AST::Statement::VarDecl/CPtrDecl
52
+ def declare_var(name: "", c_name: "", type: nil, value: nil, extern: false)
53
+ entry = Rubex::SymbolTable::Entry.new(name, c_name, type, value)
54
+ entry.extern = extern
55
+ check_entry name
56
+ @entries[name] = entry
57
+ @var_entries << entry
58
+
59
+ entry
60
+ end
61
+
62
+ def declare_sue name:, c_name:, type:, extern:
63
+ entry = Rubex::SymbolTable::Entry.new(
64
+ name, c_name, type, nil)
65
+ entry.extern = extern
66
+ @entries[name] = entry
67
+ @sue_entries << entry
68
+ @type_entries << entry
69
+
70
+ entry
71
+ end
72
+
73
+ def declare_type type:, extern:
74
+ entry = Rubex::SymbolTable::Entry.new(nil, nil, type, nil)
75
+ entry.extern = extern
76
+ @type_entries << entry
77
+
78
+ entry
79
+ end
80
+
81
+ def add_ruby_obj name: , c_name:, value: nil
82
+ entry = Rubex::SymbolTable::Entry.new(
83
+ name, c_name, Rubex::DataType::RubyObject.new, value)
84
+ @entries[name] = entry
85
+ @ruby_obj_entries << entry
86
+
87
+ entry
88
+ end
89
+
90
+ # Add a C array to the current scope.
91
+ def add_carray name: ,c_name: ,dimension: ,type: ,value: nil
92
+ type = Rubex::DataType::CArray.new dimension, type
93
+ entry = Rubex::SymbolTable::Entry.new name, c_name, type, value
94
+ @entries[name] = entry
95
+ @carray_entries << entry
96
+
97
+ entry
98
+ end
99
+
100
+ # Add a Ruby class to the current scope.
101
+ def add_ruby_class name: , c_name:, scope:, ancestor:, extern:
102
+ type = Rubex::DataType::RubyClass.new name, c_name, scope, ancestor
103
+ entry = Rubex::SymbolTable::Entry.new name, c_name, type, nil
104
+ entry.extern = extern
105
+ @entries[name] = entry
106
+ @ruby_class_entries << entry
107
+
108
+ entry
109
+ end
110
+
111
+ def add_c_method name:, c_name:, scope:, arg_list:, return_type:, extern: false
112
+ type = Rubex::DataType::CFunction.new(
113
+ name, c_name, arg_list, return_type, scope)
114
+ entry = Rubex::SymbolTable::Entry.new name, c_name, type, nil
115
+ entry.extern = extern
116
+ @entries[name] = entry
117
+ @c_method_entries << entry
118
+
119
+ entry
120
+ end
121
+
122
+ # name: name of the method
123
+ # c_name: c_name of the method
124
+ # extern: whether it is defined within the Rubex script or in a scope
125
+ # outside the Rubex script.
126
+ def add_ruby_method name:, c_name:, scope:, arg_list:, extern: false
127
+ type = Rubex::DataType::RubyMethod.new name, c_name, scope, arg_list
128
+ entry = Rubex::SymbolTable::Entry.new name, c_name, type, nil
129
+ entry.extern = extern
130
+ @entries[name] = entry
131
+ @ruby_method_entries << entry unless extern
132
+
133
+ entry
134
+ end
135
+
136
+ # allocate a temp and return its c_name
137
+ def allocate_temp type
138
+ if @free_temp_entries.empty?
139
+ @temp_counter += 1
140
+ c_name = Rubex::TEMP_PREFIX + @temp_counter.to_s
141
+ entry = Rubex::SymbolTable::Entry.new c_name, c_name, type,
142
+ Expression::Literal::CNull.new('NULL')
143
+ @entries[c_name] = entry
144
+ @temp_entries << entry
145
+ else
146
+ entry = @free_temp_entries.pop
147
+ c_name = entry.c_name
148
+ end
149
+
150
+ c_name
151
+ end
152
+
153
+ # release a temp of name 'c_name' for reuse
154
+ def release_temp c_name
155
+ @free_temp_entries << @entries[c_name]
156
+ end
157
+
158
+ def [] entry
159
+ @entries[entry] or raise(Rubex::SymbolNotFoundError,
160
+ "Symbol #{entry} does not exist in this scope.")
161
+ end
162
+
163
+ def has_entry? entry
164
+ !!@entries[entry]
11
165
  end
12
- end
13
- end
14
- end
166
+
167
+ # Find an entry in this scope or the ones above it recursively.
168
+ def find name
169
+ return recursive_find(name, self)
170
+ end
171
+
172
+ private
173
+ def recursive_find name, scope
174
+ if scope
175
+ if scope.has_entry?(name)
176
+ return scope[name]
177
+ else
178
+ return recursive_find(name, scope.outer_scope)
179
+ end
180
+ end
181
+
182
+ return nil
183
+ end
184
+ end # module Scope
185
+ end # module SymbolTable
186
+ end # module Rubex
15
187
 
16
188
  module Rubex
17
189
  module SymbolTable
18
190
  module Scope
19
191
  class Klass
20
192
  include Rubex::SymbolTable::Scope
193
+ attr_accessor :include_files #TODO: this should probably not be here.
194
+ attr_accessor :begin_block_callbacks
21
195
 
22
- attr_reader :name, :c_name
23
-
24
- def initialize name
25
- name == 'Object' ? super(nil) : super
196
+ def initialize name, outer_scope
197
+ super(outer_scope)
26
198
  @name = name
199
+ @klass_name = @name
200
+ @include_files = []
201
+ @begin_block_callbacks = []
202
+ end
27
203
 
28
- if Rubex::CLASS_MAPPINGS.has_key? name
29
- @c_name = Rubex::CLASS_MAPPINGS[name]
30
- else
31
- @c_name = Rubex::CLASS_PREFIX + name
204
+ def object_scope
205
+ temp = self
206
+ while temp.outer_scope != nil
207
+ temp = temp.outer_scope
32
208
  end
209
+
210
+ temp
33
211
  end
34
- end
212
+
213
+ # Stores CFunctionDef nodes that represent begin block callbacks.
214
+ def add_begin_block_callback func
215
+ @begin_block_callbacks << func
216
+ end
217
+ end # class Klass
35
218
 
36
219
  class Local
37
220
  include Rubex::SymbolTable::Scope
221
+ attr_reader :begin_block_counter
222
+
223
+ def initialize name, outer_scope
224
+ super(outer_scope)
225
+ @name = name
226
+ @klass_name = outer_scope.klass_name
227
+ @begin_block_counter = 0
228
+ end
38
229
 
39
230
  # args - Rubex::AST::ArgumentList. Creates sym. table entries for args.
40
- def declare_args args
41
- args.each do |arg|
42
- c_name = Rubex::ARG_PREFIX + arg.name
43
- type = Rubex::TYPE_MAPPINGS[arg.type].new
44
- entry = Rubex::SymbolTable::Entry.new arg.name, c_name, type
45
-
46
- @entries[arg.name] = entry
47
- @arg_entries << entry
48
- end
231
+ def add_arg name:, c_name:, type:, value:
232
+ entry = Rubex::SymbolTable::Entry.new name, c_name, type, value
233
+ check_entry name
234
+ @entries[name] = entry
235
+ @arg_entries << entry
236
+
237
+ entry
49
238
  end
50
239
 
51
- def [] entry
52
- @entries[entry] or raise "Symbol #{entry} does not exist in this scope."
240
+ def found_begin_block
241
+ @begin_block_counter += 1
53
242
  end
54
243
  end # class Local
244
+
245
+ class BeginBlock
246
+ attr_reader :name, :outer_scope
247
+
248
+ def initialize name, outer_scope
249
+ @outer_scope = outer_scope
250
+ @name = name
251
+ @block_entries = []
252
+ end
253
+
254
+ def upgrade_symbols_to_global
255
+ @block_entries.uniq!
256
+ @block_entries.each do |entry|
257
+ entry.c_name = Rubex::GLOBAL_PREFIX + @name + entry.c_name
258
+ @outer_scope.global_entries << entry
259
+ end
260
+
261
+ remove_global_from_local_entries
262
+ end
263
+
264
+ # IMPORTANT NOTE TO PROGRAMMER:
265
+ #
266
+ # A problem with the BeginBlock is that in the Ruby world, it must share
267
+ # scope with the method above and below it. However, when translating to
268
+ # C, the begin block must be put inside its own C function, which is then
269
+ # sent as a callback to rb_protect().
270
+ #
271
+ # As a result, it is necesary to 'upgrade' the local variables present
272
+ # inside the begin block to C global variables so that they can be shared
273
+ # between the callback C function encapsulating the begin block and the
274
+ # ruby method that has a begin block defined inside it.
275
+ #
276
+ # Now, since variables must be shared, it is also necessary to share the
277
+ # scopes between these functions. Therefore, the BeginBlock scope uses
278
+ # method_missing to capture whatever methods calls it has received and
279
+ # redirect those to @outer_scope, which is the scope of the method that
280
+ # contains the begin block. Whenever a method call to @outer_scope returns
281
+ # a SymbolTable::Entry object, that object is read to check if it is a
282
+ # variable. If yes, it is added into the @block_entries Array which
283
+ # stores the entries that need to be upgraded to C global variables.
284
+ #
285
+ # Now as a side effect of this behaviour, the various *_entries Arrays
286
+ # of @outer_scope get carried forward into this begin block callback.
287
+ # Therefore these variables get declared inside the begin block callback
288
+ # as well. So whenever one of these Arrays is called for this particular
289
+ # scope, we return an empty array so that nothing gets declared.
290
+ def method_missing meth, *args, &block
291
+ return [] if meth == :var_entries
292
+ ret = @outer_scope.send(meth, *args, &block)
293
+ if ret.is_a?(Rubex::SymbolTable::Entry)
294
+ if !ret.extern?
295
+ if !ret.type.c_function? && !ret.type.ruby_method? &&
296
+ !ret.type.ruby_class?
297
+ @block_entries << ret
298
+ end
299
+ end
300
+ end
301
+
302
+ ret
303
+ end
304
+
305
+ private
306
+
307
+ def remove_global_from_local_entries
308
+ @outer_scope.arg_entries -= @outer_scope.global_entries
309
+ @outer_scope.var_entries -= @outer_scope.global_entries
310
+ @outer_scope.ruby_obj_entries -= @outer_scope.global_entries
311
+ @outer_scope.carray_entries -= @outer_scope.global_entries
312
+ @outer_scope.sue_entries -= @outer_scope.global_entries
313
+ @outer_scope.c_method_entries -= @outer_scope.global_entries
314
+ @outer_scope.type_entries -= @outer_scope.global_entries
315
+ end
316
+ end # class BeginBlock
317
+
318
+ class StructOrUnion
319
+ include Rubex::SymbolTable::Scope
320
+ # FIXME: Change scope structure to identify struct scopes by name too.
321
+
322
+ def initialize name, outer_scope
323
+ super(outer_scope)
324
+ @klass_name = outer_scope.klass_name
325
+ @name = name
326
+ end
327
+ end # class StructOrUnion
55
328
  end
56
329
  end
57
330
  end
@@ -1,3 +1,3 @@
1
1
  module Rubex
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1".freeze
3
3
  end
@@ -4,7 +4,9 @@ $:.unshift File.expand_path("../lib", __FILE__)
4
4
  require 'rubex/version.rb'
5
5
 
6
6
  Rubex::DESCRIPTION = <<MSG
7
- A Crystal-inspired language for writing Ruby extensions
7
+ A Ruby-like language for writing Ruby C extensions.
8
+
9
+ Rubex keeps you happy even when writing C extensions.
8
10
  MSG
9
11
 
10
12
  Gem::Specification.new do |spec|
@@ -14,7 +16,7 @@ Gem::Specification.new do |spec|
14
16
  spec.email = ['sameer.deshmukh93@gmail.com']
15
17
  spec.summary = Rubex::DESCRIPTION
16
18
  spec.description = Rubex::DESCRIPTION
17
- spec.homepage = "http://github.com/v0dro/rubex"
19
+ spec.homepage = "http://github.com/sciruby/rubex"
18
20
  spec.license = 'BSD-2'
19
21
 
20
22
  spec.files = `git ls-files -z`.split("\x0")
@@ -22,9 +24,15 @@ Gem::Specification.new do |spec|
22
24
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
25
  spec.require_paths = ["lib"]
24
26
 
27
+ spec.add_runtime_dependency 'racc', '~> 1.4.14'
28
+ spec.add_runtime_dependency 'rake-compiler', '~> 1.0.4'
29
+
25
30
  spec.add_development_dependency 'oedipus_lex', '~> 2.4'
26
- spec.add_development_dependency 'racc', '~> 1.4.14'
27
31
  spec.add_development_dependency 'rake', '~> 11.2'
28
32
  spec.add_development_dependency 'rspec', '~> 3.4'
29
33
  spec.add_development_dependency 'awesome_print'
34
+ spec.add_development_dependency 'pry-byebug'
35
+ spec.add_development_dependency 'pretty_backtrace'
36
+ spec.add_development_dependency 'ruby-prof'
37
+ spec.add_development_dependency 'benchmark-ips'
30
38
  end