rubex 0.0.1 → 0.1

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.
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