rubex 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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