rubex 0.1.1 → 0.1.2

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 (131) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/CONTRIBUTING.md +73 -9
  4. data/HISTORY.md +19 -0
  5. data/README.md +53 -8
  6. data/REFERENCE.md +112 -44
  7. data/benchmarks/no_gil/no_gil.rb +24 -0
  8. data/benchmarks/no_gil/no_gil.rubex +22 -0
  9. data/bin/rubex +1 -1
  10. data/examples/c_struct_interface/c_struct_interface.rubex +1 -0
  11. data/lib/rubex.rb +1 -0
  12. data/lib/rubex/ast.rb +11 -7
  13. data/lib/rubex/ast/expression.rb +1 -1
  14. data/lib/rubex/ast/expression/actual_arg_list.rb +7 -0
  15. data/lib/rubex/ast/expression/analysed_element_ref/c_var_element_ref.rb +5 -2
  16. data/lib/rubex/ast/expression/analysed_element_ref/ruby_object_element_ref.rb +26 -9
  17. data/lib/rubex/ast/expression/binary/binary_boolean.rb +1 -1
  18. data/lib/rubex/ast/expression/binary/binary_expo.rb +34 -0
  19. data/lib/rubex/ast/expression/binary/colon2.rb +34 -0
  20. data/lib/rubex/ast/expression/binary/empty_classes.rb +0 -3
  21. data/lib/rubex/ast/expression/command_call.rb +24 -0
  22. data/lib/rubex/ast/{statement → expression/command_call}/print.rb +4 -5
  23. data/lib/rubex/ast/{statement → expression/command_call}/raise.rb +29 -24
  24. data/lib/rubex/ast/expression/command_call/require.rb +27 -0
  25. data/lib/rubex/ast/expression/command_call/yield.rb +36 -0
  26. data/lib/rubex/ast/expression/element_ref.rb +10 -5
  27. data/lib/rubex/ast/expression/instance_var.rb +33 -0
  28. data/lib/rubex/ast/expression/method_call.rb +4 -2
  29. data/lib/rubex/ast/expression/method_call/c_function_call.rb +4 -3
  30. data/lib/rubex/ast/expression/method_call/ruby_method_call.rb +7 -5
  31. data/lib/rubex/ast/expression/name.rb +10 -1
  32. data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_array_element_ref.rb +5 -2
  33. data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_hash_element_ref.rb +10 -2
  34. data/lib/rubex/ast/expression/to_ruby_object.rb +1 -0
  35. data/lib/rubex/ast/expression/unary.rb +7 -3
  36. data/lib/rubex/ast/expression/unary_base/ampersand.rb +5 -0
  37. data/lib/rubex/ast/node.rb +213 -185
  38. data/lib/rubex/ast/node/file_node.rb +25 -0
  39. data/lib/rubex/ast/node/main_node.rb +56 -0
  40. data/lib/rubex/ast/statement/begin_block/begin.rb +4 -3
  41. data/lib/rubex/ast/statement/c_array_decl.rb +1 -1
  42. data/lib/rubex/ast/statement/c_ptr_decl.rb +2 -0
  43. data/lib/rubex/ast/statement/no_gil_block.rb +70 -0
  44. data/lib/rubex/ast/statement/return.rb +1 -0
  45. data/lib/rubex/ast/top_statement.rb +1 -1
  46. data/lib/rubex/ast/top_statement/klass.rb +4 -0
  47. data/lib/rubex/ast/top_statement/klass/attached_klass.rb +88 -10
  48. data/lib/rubex/ast/top_statement/method_def.rb +2 -3
  49. data/lib/rubex/ast/top_statement/method_def/c_function_def.rb +10 -4
  50. data/lib/rubex/cli.rb +11 -6
  51. data/lib/rubex/code_supervisor.rb +49 -0
  52. data/lib/rubex/code_writer.rb +22 -1
  53. data/lib/rubex/compiler.rb +109 -30
  54. data/lib/rubex/compiler_config.rb +14 -1
  55. data/lib/rubex/constants.rb +3 -0
  56. data/lib/rubex/data_type.rb +2 -3
  57. data/lib/rubex/data_type/ruby_object/ruby_symbol.rb +0 -1
  58. data/lib/rubex/error.rb +4 -0
  59. data/lib/rubex/helpers/writers.rb +33 -4
  60. data/lib/rubex/lexer.rex +9 -1
  61. data/lib/rubex/lexer.rex.rb +15 -2
  62. data/lib/rubex/parser.racc +125 -49
  63. data/lib/rubex/parser.racc.rb +1526 -1376
  64. data/lib/rubex/rake_task.rb +42 -6
  65. data/lib/rubex/symbol_table/entry.rb +6 -0
  66. data/lib/rubex/symbol_table/scope.rb +28 -3
  67. data/lib/rubex/version.rb +1 -1
  68. data/rubex.gemspec +1 -0
  69. data/spec/basic_ruby_method_spec.rb +2 -2
  70. data/spec/blocks_spec.rb +2 -2
  71. data/spec/box_op_multi_args_spec.rb +34 -0
  72. data/spec/c_function_ptrs_spec.rb +2 -2
  73. data/spec/c_functions_spec.rb +2 -0
  74. data/spec/c_struct_interface_spec.rb +8 -3
  75. data/spec/default_args_spec.rb +2 -2
  76. data/spec/external_c_struct_spec.rb +33 -0
  77. data/spec/fixtures/api/consumer.rubex +0 -0
  78. data/spec/fixtures/api/implementation.rubex +0 -0
  79. data/spec/fixtures/api/implementation.rubexd +0 -0
  80. data/spec/fixtures/box_op_multi_args/box_op_multi_args.rubex +3 -0
  81. data/spec/fixtures/c_functions/c_functions.rubex +13 -0
  82. data/spec/fixtures/c_struct_interface/c_struct_interface.rubex +28 -0
  83. data/spec/fixtures/class_methods/class_methods.rubex +1 -1
  84. data/spec/fixtures/error_handling/error_handling.rubex +2 -2
  85. data/spec/fixtures/external_c_struct/external_c_struct.rubex +16 -0
  86. data/spec/fixtures/if_else/if_else.rubex +1 -1
  87. data/spec/fixtures/init_ruby_objects_with_literal_syntax/init_ruby_objects_with_literal_syntax.rubex +1 -1
  88. data/spec/fixtures/instance_variables/instance_variables.rubex +25 -0
  89. data/spec/fixtures/loops/loops.rubex +2 -2
  90. data/spec/fixtures/module/module.rubex +28 -0
  91. data/spec/fixtures/multi_file_programs/Rakefile +8 -0
  92. data/spec/fixtures/multi_file_programs/a.rubex +5 -0
  93. data/spec/fixtures/multi_file_programs/b.rubex +5 -0
  94. data/spec/fixtures/multi_file_programs/multi_file_programs.rubex +14 -0
  95. data/spec/fixtures/no_gil/no_gil.rubex +24 -0
  96. data/spec/fixtures/no_gil_attach_class/no_gil_attach_class.rubex +23 -0
  97. data/spec/fixtures/no_gil_compile_check/no_gil_compile_check.rubex +4 -0
  98. data/spec/fixtures/outside_stmts/outside_stmts.rubex +6 -0
  99. data/spec/fixtures/pow/pow.rubex +4 -0
  100. data/spec/fixtures/rake_task/single_file/test.rubex +3 -0
  101. data/spec/fixtures/recursion/recursion.rubex +1 -1
  102. data/spec/fixtures/ruby_constant_scoping/ruby_constant_scoping.rubex +7 -0
  103. data/spec/fixtures/ruby_operators/ruby_operators.rubex +1 -1
  104. data/spec/fixtures/ruby_raise/ruby_raise.rubex +2 -2
  105. data/spec/fixtures/ruby_types/ruby_types.rubex +4 -4
  106. data/spec/fixtures/statement_expression/statement_expression.rubex +2 -2
  107. data/spec/fixtures/static_array/static_array.rubex +3 -3
  108. data/spec/fixtures/string_literals/string_literals.rubex +12 -2
  109. data/spec/fixtures/struct/struct.rubex +1 -1
  110. data/spec/fixtures/var_declarations/var_declarations.rubex +1 -1
  111. data/spec/implicit_lib_include_spec.rb +2 -2
  112. data/spec/init_ruby_objects_with_literal_syntax_spec.rb +2 -2
  113. data/spec/instance_variables_spec.rb +33 -0
  114. data/spec/loops_spec.rb +2 -2
  115. data/spec/module_spec.rb +39 -0
  116. data/spec/multi_file_programs_spec.rb +41 -0
  117. data/spec/no_gil_attach_class_spec.rb +33 -0
  118. data/spec/no_gil_compile_check_spec.rb +25 -0
  119. data/spec/no_gil_spec.rb +36 -0
  120. data/spec/outside_stmts_spec.rb +34 -0
  121. data/spec/pow_spec.rb +33 -0
  122. data/spec/rake_task_spec.rb +142 -0
  123. data/spec/recursion_spec.rb +4 -4
  124. data/spec/ruby_constant_scoping_spec.rb +42 -0
  125. data/spec/ruby_raise_spec.rb +2 -2
  126. data/spec/ruby_symbols_spec.rb +2 -2
  127. data/spec/ruby_types_spec.rb +2 -2
  128. data/spec/spec_helper.rb +17 -3
  129. data/spec/string_literals_spec.rb +1 -0
  130. metadata +90 -6
  131. data/lib/rubex/ast/statement/yield.rb +0 -41
@@ -5,30 +5,66 @@ require_relative '../rubex.rb'
5
5
 
6
6
  module Rubex
7
7
  class RakeTask < ::Rake::TaskLib
8
+ attr_reader :ext_dir, :rubex_files
9
+ attr_accessor :debug
8
10
 
9
- def initialize name, gem_spec=nil
11
+ def initialize name, gem_spec=nil, &block
10
12
  @name = name
11
13
  @gem_spec = gem_spec
12
- @ext_dir = "ext/#{@name}"
14
+ @ext_dir = "#{Dir.pwd}/ext/#{@name}"
13
15
  @lib_dir = 'lib'
14
16
  @source_pattern = "*.rubex"
15
17
  @compiled_pattern = "*.c"
16
18
  @config_script = "extconf.rb"
19
+ @debug = true
20
+ instance_eval(&block) if block_given?
17
21
  define_compile_tasks
18
22
  end
19
23
 
24
+ # Change the directory that contains rubex files. Overrides default
25
+ # assumption of gem file structure.
26
+ #
27
+ # @param [String] ext_dir Path to new ext dir.
28
+ def ext ext_dir
29
+ @ext_dir = ext_dir
30
+ end
31
+
32
+ # Specify the names of Rubex files with respect to ext directory if compiling
33
+ # multiple files.
34
+ #
35
+ # @param [Array[String]] files Array containing names of all files relative to
36
+ # ext directory as Strings.
37
+ def files files
38
+ @rubex_files = files
39
+ end
40
+
20
41
  def define_compile_tasks
21
42
  namespace :rubex do
22
43
  desc "Compile a Rubex file into a shared object."
23
44
  task :compile do
24
- file_name = "#{Dir.pwd}/#{@ext_dir}/#{@name}#{@source_pattern[1..-1]}"
25
- Rubex::Compiler.compile file_name, directory: "#{@ext_dir}"
45
+ file_name = "#{@ext_dir}/#{@name}#{@source_pattern[1..-1]}"
46
+ Rubex::Compiler.compile file_name, target_dir: "#{@ext_dir}", debug: @debug
47
+ end
48
+
49
+ desc "Delete all generated files."
50
+ task :clobber do
51
+ path = @ext_dir
52
+ unless path.end_with?(@name)
53
+ path += "/#{@name}"
54
+ end
55
+
56
+ Dir.chdir(path) do
57
+ FileUtils.rm(
58
+ Dir.glob(
59
+ "#{path}/*.{c,h,so,o,bundle,dll}") + ["Makefile", "extconf.rb"], force: true
60
+ )
61
+ end
26
62
  end
27
63
  end
28
64
  Rake::ExtensionTask.new(@name)
29
65
 
30
66
  desc "Compile Rubex code into a .so file for use in Ruby scripts."
31
- task :compile => "rubex:compile"
67
+ task "compile" => "rubex:compile"
32
68
  end
33
69
  end # class RakeTask
34
- end # module Rubex
70
+ end # module Rubex
@@ -13,9 +13,15 @@ module Rubex
13
13
  attr_accessor :extern
14
14
  # Is a Ruby singleton method
15
15
  attr_accessor :singleton
16
+ # Number of times this entry is called in a function. Useful for Ruby methods.
17
+ attr_accessor :times_called
18
+ # Whether this entry has a no_gil tag or not. Applicable for C functions.
19
+ attr_accessor :no_gil
16
20
 
17
21
  def initialize name, c_name, type, value
18
22
  @name, @c_name, @type, @value = name, c_name, type, value
23
+ @times_called = 0
24
+ @no_gil = false
19
25
  end
20
26
 
21
27
  def c_code local_scope
@@ -191,7 +191,11 @@ module Rubex
191
191
  class Klass
192
192
  include Rubex::SymbolTable::Scope
193
193
  attr_accessor :include_files #TODO: this should probably not be here.
194
+ # Stores callbacks for begin blocks since they cannot be a part of the
195
+ # statements of a class.
194
196
  attr_accessor :begin_block_callbacks
197
+ # Similar to begin_block_callbacks
198
+ attr_accessor :no_gil_block_callbacks
195
199
 
196
200
  def initialize name, outer_scope
197
201
  super(outer_scope)
@@ -199,6 +203,7 @@ module Rubex
199
203
  @klass_name = @name
200
204
  @include_files = []
201
205
  @begin_block_callbacks = []
206
+ @no_gil_block_callbacks = []
202
207
  end
203
208
 
204
209
  def object_scope
@@ -214,17 +219,24 @@ module Rubex
214
219
  def add_begin_block_callback func
215
220
  @begin_block_callbacks << func
216
221
  end
222
+
223
+ # Stores CFunctionDef nodes that represent no_gil block callbacks.
224
+ def add_no_gil_block_callback func
225
+ @no_gil_block_callbacks << func
226
+ end
217
227
  end # class Klass
218
228
 
219
229
  class Local
220
230
  include Rubex::SymbolTable::Scope
221
- attr_reader :begin_block_counter
231
+ attr_reader :begin_block_counter,
232
+ :no_gil_block_counter
222
233
 
223
234
  def initialize name, outer_scope
224
235
  super(outer_scope)
225
236
  @name = name
226
237
  @klass_name = outer_scope.klass_name
227
238
  @begin_block_counter = 0
239
+ @no_gil_block_counter = 0
228
240
  end
229
241
 
230
242
  # args - Rubex::AST::ArgumentList. Creates sym. table entries for args.
@@ -240,6 +252,10 @@ module Rubex
240
252
  def found_begin_block
241
253
  @begin_block_counter += 1
242
254
  end
255
+
256
+ def found_no_gil_block
257
+ @no_gil_block_counter += 1
258
+ end
243
259
  end # class Local
244
260
 
245
261
  class BeginBlock
@@ -254,11 +270,14 @@ module Rubex
254
270
  def upgrade_symbols_to_global
255
271
  @block_entries.uniq!
256
272
  @block_entries.each do |entry|
257
- entry.c_name = Rubex::GLOBAL_PREFIX + @name + entry.c_name
258
273
  @outer_scope.global_entries << entry
259
274
  end
260
275
 
261
276
  remove_global_from_local_entries
277
+
278
+ @outer_scope.global_entries.each do |entry|
279
+ entry.c_name = Rubex::GLOBAL_PREFIX + @name + entry.c_name
280
+ end
262
281
  end
263
282
 
264
283
  # IMPORTANT NOTE TO PROGRAMMER:
@@ -268,6 +287,10 @@ module Rubex
268
287
  # C, the begin block must be put inside its own C function, which is then
269
288
  # sent as a callback to rb_protect().
270
289
  #
290
+ # The same as above applies to a no_gil block, which is why the NoGilBlock
291
+ # (defined below) inherits from this class and completely imitates its
292
+ # behaviour.
293
+ #
271
294
  # As a result, it is necesary to 'upgrade' the local variables present
272
295
  # inside the begin block to C global variables so that they can be shared
273
296
  # between the callback C function encapsulating the begin block and the
@@ -286,7 +309,7 @@ module Rubex
286
309
  # of @outer_scope get carried forward into this begin block callback.
287
310
  # Therefore these variables get declared inside the begin block callback
288
311
  # 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.
312
+ # scope, we preturn an empty array so that nothing gets declared.
290
313
  def method_missing meth, *args, &block
291
314
  return [] if meth == :var_entries
292
315
  ret = @outer_scope.send(meth, *args, &block)
@@ -315,6 +338,8 @@ module Rubex
315
338
  end
316
339
  end # class BeginBlock
317
340
 
341
+ class NoGilBlock < BeginBlock; end
342
+
318
343
  class StructOrUnion
319
344
  include Rubex::SymbolTable::Scope
320
345
  # FIXME: Change scope structure to identify struct scopes by name too.
@@ -1,3 +1,3 @@
1
1
  module Rubex
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.1.2".freeze
3
3
  end
@@ -37,4 +37,5 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'ruby-prof'
38
38
  spec.add_development_dependency 'benchmark-ips'
39
39
  spec.add_development_dependency 'simplecov'
40
+ spec.add_development_dependency 'numo-narray'
40
41
  end
@@ -15,9 +15,9 @@ describe Rubex do
15
15
  end
16
16
  end
17
17
 
18
- context ".compile" do
18
+ context ".compile", tit: true do
19
19
  it "generates valid C code" do
20
- t, c, e = Rubex::Compiler.compile @path + ".rubex", test: true
20
+ t, c, e, h = Rubex::Compiler.compile @path + ".rubex", test: true
21
21
  end
22
22
  end
23
23
 
@@ -14,13 +14,13 @@ describe Rubex do
14
14
  end
15
15
  end
16
16
 
17
- context ".compile", focus: true do
17
+ context ".compile" do
18
18
  it "compiles to valid C file" do
19
19
  t,c,e = Rubex::Compiler.compile(@path + '.rubex', test: true)
20
20
  end
21
21
  end
22
22
 
23
- context "Black Box testing", focus: true do
23
+ context "Black Box testing" do
24
24
  it "compiles and checks for valid output" do
25
25
  setup_and_teardown_compiled_files(test_case) do |dir|
26
26
  require_relative "#{dir}/#{test_case}.#{os_extension}"
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rubex do
4
+ test_case = "box_op_multi_args"
5
+
6
+ context "Case: #{test_case}" do
7
+ before do
8
+ @path = path_str test_case
9
+ end
10
+
11
+ context ".ast" do
12
+ it "generates the AST" do
13
+ t = Rubex::Compiler.ast(@path + '.rubex')
14
+ end
15
+ end
16
+
17
+ context ".compile" do
18
+ it "compiles to valid C file" do
19
+ t,c,e = Rubex::Compiler.compile(@path + '.rubex', test: true)
20
+ end
21
+ end
22
+
23
+ context "Black Box testing" do
24
+ it "compiles and checks for valid output" do
25
+ setup_and_teardown_compiled_files(test_case) do |dir|
26
+ require_relative "#{dir}/#{test_case}.#{os_extension}"
27
+ require 'numo/narray'
28
+ n = Numo::DFloat.new(3,3).seq
29
+ expect(multi_arg_box(n)).to eq(4.0)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -15,13 +15,13 @@ describe Rubex do
15
15
  end
16
16
  end
17
17
 
18
- context ".compile", focus: true do
18
+ context ".compile" do
19
19
  it "generates valid C code" do
20
20
  t, c, e = Rubex::Compiler.compile @path + ".rubex", test: true
21
21
  end
22
22
  end
23
23
 
24
- context "Black Box testing", focus: true do
24
+ context "Black Box testing" do
25
25
  it "compiles and checks for valid output" do
26
26
  setup_and_teardown_compiled_files(test_case) do |dir|
27
27
  require_relative "#{dir}/#{test_case}.#{os_extension}"
@@ -28,6 +28,8 @@ describe Rubex do
28
28
  c = CFunctions.new
29
29
  expect(c.pure_ruby_method).to eq(50)
30
30
  expect { c.first_c_function(1,2) }.to raise_error(NoMethodError)
31
+
32
+ expect(TypeCast.new.foo(5,5)).to eq(10)
31
33
  end
32
34
  end
33
35
  end
@@ -15,13 +15,13 @@ describe Rubex do
15
15
  end
16
16
  end
17
17
 
18
- context ".compile", focus: true do
18
+ context ".compile" do
19
19
  it "generates valid C code" do
20
- t, c, e = Rubex::Compiler.compile @path + ".rubex", test: true
20
+ t, c, e, h = Rubex::Compiler.compile @path + ".rubex", test: true
21
21
  end
22
22
  end
23
23
 
24
- context "Black Box testing", focus: true do
24
+ context "Black Box testing" do
25
25
  it "compiles and checks for valid output" do
26
26
  setup_and_teardown_compiled_files(test_case) do |dir|
27
27
  require_relative "#{dir}/#{test_case}.#{os_extension}"
@@ -31,6 +31,11 @@ describe Rubex do
31
31
  expect(m.artist).to eq("Animals as Leaders")
32
32
  expect(m.title) .to eq("CAFO")
33
33
  expect(m.id) .to eq(id)
34
+ expect(m.id_i) .to eq(id + 1)
35
+
36
+ t = A.new
37
+
38
+ expect(t.foo).to eq(55)
34
39
  end
35
40
  end
36
41
  end
@@ -14,13 +14,13 @@ describe Rubex do
14
14
  end
15
15
  end
16
16
 
17
- context '.compile', focus: true do
17
+ context '.compile' do
18
18
  skip 'compiles to valid C code' do
19
19
  t, c, e = Rubex::Compiler.compile(@path + '.rubex', test: true)
20
20
  end
21
21
  end
22
22
 
23
- context 'Black Box testing', focus: true do
23
+ context 'Black Box testing' do
24
24
  skip 'compiles and checks for valid output' do
25
25
  setup_and_teardown_compiled_files(test_case) do |dir|
26
26
  require_relative "#{dir}/#{test_case}.#{os_extension}"
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rubex do
4
+ test_case = 'external_c_struct'
5
+
6
+ context "Case: #{test_case}" do
7
+ before do
8
+ @path = path_str test_case
9
+ end
10
+
11
+ context ".ast" do
12
+ it "generates the AST" do
13
+ t = Rubex::Compiler.ast(@path + '.rubex')
14
+ end
15
+ end
16
+
17
+ context ".compile" do
18
+ it "compiles to valid C file" do
19
+ t,c,e = Rubex::Compiler.compile(@path + '.rubex', test: true)
20
+ end
21
+ end
22
+
23
+ context "Black Box testing" do
24
+ it "compiles and checks for valid output" do
25
+ setup_and_teardown_compiled_files(test_case) do |dir|
26
+ require_relative "#{dir}/#{test_case}.#{os_extension}"
27
+
28
+ expect(HelloFile.new.foo).to eq(false)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ def multi_arg_box(n)
2
+ return n[1,1]
3
+ end
@@ -23,3 +23,16 @@ class CFunctions
23
23
 
24
24
  end
25
25
  end
26
+
27
+ # Try to typecast ruby object to target type when sending to function with a
28
+ # given type.
29
+ class TypeCast
30
+ cfunc int bar(char * s, int a, int b)
31
+ return a + b
32
+ end
33
+
34
+ def foo(i, j)
35
+ s = "hello world!"
36
+ return bar(s,i,j)
37
+ end
38
+ end
@@ -31,4 +31,32 @@ class Music attach mp3info
31
31
  def id
32
32
  return data$.mp3info.id
33
33
  end
34
+
35
+ cfunc int inc_id
36
+ return (data$.mp3info.id + 1)
37
+ end
38
+
39
+ def id_i
40
+ inc_id()
41
+ return inc_id()
42
+ end
43
+ end
44
+
45
+ struct test
46
+ int *a
47
+ end
48
+
49
+ class A attach test
50
+ cfunc object allocate
51
+ data$.test.a = <int*>xmalloc(sizeof(int)*100)
52
+ end
53
+
54
+ def foo
55
+ data$.test.a[3] = 55
56
+ return data$.test.a[3]
57
+ end
58
+
59
+ cfunc void deallocate
60
+ xfree(data$.test.a)
61
+ end
34
62
  end
@@ -3,7 +3,7 @@ class Bhau
3
3
  int i = 0
4
4
 
5
5
  while i < 10 do
6
- print string
6
+ print(string)
7
7
  i += 1
8
8
  end
9
9
 
@@ -24,7 +24,7 @@ class Handler
24
24
 
25
25
  def test_uncaught_error
26
26
  begin
27
- raise ArgumentError
27
+ raise(ArgumentError)
28
28
  rescue SyntaxError
29
29
  end
30
30
  end
@@ -32,7 +32,7 @@ class Handler
32
32
  def test_without_rescue
33
33
  int i = 1
34
34
  begin
35
- raise ArgumentError
35
+ raise(ArgumentError)
36
36
  ensure
37
37
  return i
38
38
  end