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.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/CONTRIBUTING.md +73 -9
- data/HISTORY.md +19 -0
- data/README.md +53 -8
- data/REFERENCE.md +112 -44
- data/benchmarks/no_gil/no_gil.rb +24 -0
- data/benchmarks/no_gil/no_gil.rubex +22 -0
- data/bin/rubex +1 -1
- data/examples/c_struct_interface/c_struct_interface.rubex +1 -0
- data/lib/rubex.rb +1 -0
- data/lib/rubex/ast.rb +11 -7
- data/lib/rubex/ast/expression.rb +1 -1
- data/lib/rubex/ast/expression/actual_arg_list.rb +7 -0
- data/lib/rubex/ast/expression/analysed_element_ref/c_var_element_ref.rb +5 -2
- data/lib/rubex/ast/expression/analysed_element_ref/ruby_object_element_ref.rb +26 -9
- data/lib/rubex/ast/expression/binary/binary_boolean.rb +1 -1
- data/lib/rubex/ast/expression/binary/binary_expo.rb +34 -0
- data/lib/rubex/ast/expression/binary/colon2.rb +34 -0
- data/lib/rubex/ast/expression/binary/empty_classes.rb +0 -3
- data/lib/rubex/ast/expression/command_call.rb +24 -0
- data/lib/rubex/ast/{statement → expression/command_call}/print.rb +4 -5
- data/lib/rubex/ast/{statement → expression/command_call}/raise.rb +29 -24
- data/lib/rubex/ast/expression/command_call/require.rb +27 -0
- data/lib/rubex/ast/expression/command_call/yield.rb +36 -0
- data/lib/rubex/ast/expression/element_ref.rb +10 -5
- data/lib/rubex/ast/expression/instance_var.rb +33 -0
- data/lib/rubex/ast/expression/method_call.rb +4 -2
- data/lib/rubex/ast/expression/method_call/c_function_call.rb +4 -3
- data/lib/rubex/ast/expression/method_call/ruby_method_call.rb +7 -5
- data/lib/rubex/ast/expression/name.rb +10 -1
- data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_array_element_ref.rb +5 -2
- data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_hash_element_ref.rb +10 -2
- data/lib/rubex/ast/expression/to_ruby_object.rb +1 -0
- data/lib/rubex/ast/expression/unary.rb +7 -3
- data/lib/rubex/ast/expression/unary_base/ampersand.rb +5 -0
- data/lib/rubex/ast/node.rb +213 -185
- data/lib/rubex/ast/node/file_node.rb +25 -0
- data/lib/rubex/ast/node/main_node.rb +56 -0
- data/lib/rubex/ast/statement/begin_block/begin.rb +4 -3
- data/lib/rubex/ast/statement/c_array_decl.rb +1 -1
- data/lib/rubex/ast/statement/c_ptr_decl.rb +2 -0
- data/lib/rubex/ast/statement/no_gil_block.rb +70 -0
- data/lib/rubex/ast/statement/return.rb +1 -0
- data/lib/rubex/ast/top_statement.rb +1 -1
- data/lib/rubex/ast/top_statement/klass.rb +4 -0
- data/lib/rubex/ast/top_statement/klass/attached_klass.rb +88 -10
- data/lib/rubex/ast/top_statement/method_def.rb +2 -3
- data/lib/rubex/ast/top_statement/method_def/c_function_def.rb +10 -4
- data/lib/rubex/cli.rb +11 -6
- data/lib/rubex/code_supervisor.rb +49 -0
- data/lib/rubex/code_writer.rb +22 -1
- data/lib/rubex/compiler.rb +109 -30
- data/lib/rubex/compiler_config.rb +14 -1
- data/lib/rubex/constants.rb +3 -0
- data/lib/rubex/data_type.rb +2 -3
- data/lib/rubex/data_type/ruby_object/ruby_symbol.rb +0 -1
- data/lib/rubex/error.rb +4 -0
- data/lib/rubex/helpers/writers.rb +33 -4
- data/lib/rubex/lexer.rex +9 -1
- data/lib/rubex/lexer.rex.rb +15 -2
- data/lib/rubex/parser.racc +125 -49
- data/lib/rubex/parser.racc.rb +1526 -1376
- data/lib/rubex/rake_task.rb +42 -6
- data/lib/rubex/symbol_table/entry.rb +6 -0
- data/lib/rubex/symbol_table/scope.rb +28 -3
- data/lib/rubex/version.rb +1 -1
- data/rubex.gemspec +1 -0
- data/spec/basic_ruby_method_spec.rb +2 -2
- data/spec/blocks_spec.rb +2 -2
- data/spec/box_op_multi_args_spec.rb +34 -0
- data/spec/c_function_ptrs_spec.rb +2 -2
- data/spec/c_functions_spec.rb +2 -0
- data/spec/c_struct_interface_spec.rb +8 -3
- data/spec/default_args_spec.rb +2 -2
- data/spec/external_c_struct_spec.rb +33 -0
- data/spec/fixtures/api/consumer.rubex +0 -0
- data/spec/fixtures/api/implementation.rubex +0 -0
- data/spec/fixtures/api/implementation.rubexd +0 -0
- data/spec/fixtures/box_op_multi_args/box_op_multi_args.rubex +3 -0
- data/spec/fixtures/c_functions/c_functions.rubex +13 -0
- data/spec/fixtures/c_struct_interface/c_struct_interface.rubex +28 -0
- data/spec/fixtures/class_methods/class_methods.rubex +1 -1
- data/spec/fixtures/error_handling/error_handling.rubex +2 -2
- data/spec/fixtures/external_c_struct/external_c_struct.rubex +16 -0
- data/spec/fixtures/if_else/if_else.rubex +1 -1
- data/spec/fixtures/init_ruby_objects_with_literal_syntax/init_ruby_objects_with_literal_syntax.rubex +1 -1
- data/spec/fixtures/instance_variables/instance_variables.rubex +25 -0
- data/spec/fixtures/loops/loops.rubex +2 -2
- data/spec/fixtures/module/module.rubex +28 -0
- data/spec/fixtures/multi_file_programs/Rakefile +8 -0
- data/spec/fixtures/multi_file_programs/a.rubex +5 -0
- data/spec/fixtures/multi_file_programs/b.rubex +5 -0
- data/spec/fixtures/multi_file_programs/multi_file_programs.rubex +14 -0
- data/spec/fixtures/no_gil/no_gil.rubex +24 -0
- data/spec/fixtures/no_gil_attach_class/no_gil_attach_class.rubex +23 -0
- data/spec/fixtures/no_gil_compile_check/no_gil_compile_check.rubex +4 -0
- data/spec/fixtures/outside_stmts/outside_stmts.rubex +6 -0
- data/spec/fixtures/pow/pow.rubex +4 -0
- data/spec/fixtures/rake_task/single_file/test.rubex +3 -0
- data/spec/fixtures/recursion/recursion.rubex +1 -1
- data/spec/fixtures/ruby_constant_scoping/ruby_constant_scoping.rubex +7 -0
- data/spec/fixtures/ruby_operators/ruby_operators.rubex +1 -1
- data/spec/fixtures/ruby_raise/ruby_raise.rubex +2 -2
- data/spec/fixtures/ruby_types/ruby_types.rubex +4 -4
- data/spec/fixtures/statement_expression/statement_expression.rubex +2 -2
- data/spec/fixtures/static_array/static_array.rubex +3 -3
- data/spec/fixtures/string_literals/string_literals.rubex +12 -2
- data/spec/fixtures/struct/struct.rubex +1 -1
- data/spec/fixtures/var_declarations/var_declarations.rubex +1 -1
- data/spec/implicit_lib_include_spec.rb +2 -2
- data/spec/init_ruby_objects_with_literal_syntax_spec.rb +2 -2
- data/spec/instance_variables_spec.rb +33 -0
- data/spec/loops_spec.rb +2 -2
- data/spec/module_spec.rb +39 -0
- data/spec/multi_file_programs_spec.rb +41 -0
- data/spec/no_gil_attach_class_spec.rb +33 -0
- data/spec/no_gil_compile_check_spec.rb +25 -0
- data/spec/no_gil_spec.rb +36 -0
- data/spec/outside_stmts_spec.rb +34 -0
- data/spec/pow_spec.rb +33 -0
- data/spec/rake_task_spec.rb +142 -0
- data/spec/recursion_spec.rb +4 -4
- data/spec/ruby_constant_scoping_spec.rb +42 -0
- data/spec/ruby_raise_spec.rb +2 -2
- data/spec/ruby_symbols_spec.rb +2 -2
- data/spec/ruby_types_spec.rb +2 -2
- data/spec/spec_helper.rb +17 -3
- data/spec/string_literals_spec.rb +1 -0
- metadata +90 -6
- data/lib/rubex/ast/statement/yield.rb +0 -41
data/spec/module_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubex do
|
4
|
+
test_case = "module"
|
5
|
+
|
6
|
+
context "Case: #{test_case}" do
|
7
|
+
before do
|
8
|
+
@path = path_str test_case
|
9
|
+
end
|
10
|
+
|
11
|
+
context ".ast" do
|
12
|
+
skip "generates the AST" do
|
13
|
+
t = Rubex::Compiler.ast(@path + '.rubex')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context ".compile" do
|
18
|
+
skip "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
|
+
skip "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(Foo::Bar.new.baz).to eq("hello world")
|
29
|
+
|
30
|
+
include Bar
|
31
|
+
expect(b).to eq("b")
|
32
|
+
|
33
|
+
include Outer::Inner
|
34
|
+
expect(abc).to eq("abc")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubex do
|
4
|
+
test_case = "multi_file_programs"
|
5
|
+
|
6
|
+
context "Case: #{test_case}" do
|
7
|
+
before do
|
8
|
+
@dir = dir_str test_case
|
9
|
+
@t_dir = @dir + "/#{test_case}"
|
10
|
+
@main_file = path_str test_case
|
11
|
+
@file_names = ["a.rubex", "b.rubex", "multi_file_programs.rubex"]
|
12
|
+
end
|
13
|
+
|
14
|
+
context ".ast" do
|
15
|
+
it "generates the AST" do
|
16
|
+
t = Rubex::Compiler.ast(@main_file + '.rubex', source_dir: @dir)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context ".compile" do
|
21
|
+
it "compiles to valid C file" do
|
22
|
+
t,c,e = Rubex::Compiler.compile(@main_file + '.rubex', files: @file_names,
|
23
|
+
source_dir: @dir, test: true, multi_file: true,
|
24
|
+
target_dir: @t_dir)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "black box testing" do
|
29
|
+
it "compiles and checks for valid output" do
|
30
|
+
setup_and_teardown_multiple_compiled_files(
|
31
|
+
@main_file + '.rubex', @dir, @t_dir, @file_names) do |dir|
|
32
|
+
|
33
|
+
require_relative "#{dir}/#{test_case}.#{os_extension}"
|
34
|
+
expect(C.new("hello ruby").bar).to eq("hello ruby")
|
35
|
+
expect(D.new("ruby ").foo).to eq("ruby hello world")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubex do
|
4
|
+
test_case = "no_gil_attach_class"
|
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
|
+
skip "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
|
+
skip "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(A.new.foo)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubex do
|
4
|
+
test_case = "no_gil_compile_check"
|
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 "raises compile error" do
|
19
|
+
expect {
|
20
|
+
Rubex::Compiler.compile(@path + '.rubex', test: true)
|
21
|
+
}.to raise_error(Rubex::CompileCheckError)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/no_gil_spec.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubex do
|
4
|
+
test_case = "no_gil"
|
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
|
+
N = 999
|
28
|
+
|
29
|
+
n = Thread.new { work_without_gil(N) }
|
30
|
+
m = Thread.new { work_without_gil(N) }
|
31
|
+
n.join; m.join
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Rubex::AST
|
3
|
+
|
4
|
+
describe Rubex do
|
5
|
+
test_case = 'outside_stmts'
|
6
|
+
|
7
|
+
context "Case : #{test_case}" do
|
8
|
+
before do
|
9
|
+
@path = path_str test_case
|
10
|
+
end
|
11
|
+
|
12
|
+
context ".ast" do
|
13
|
+
it "returns a valid Abstract Syntax Tree" do
|
14
|
+
t = Rubex::Compiler.ast @path + ".rubex"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context ".compile" do
|
19
|
+
it "generates valid C code" do
|
20
|
+
t, c, e = Rubex::Compiler.compile @path + ".rubex", test: true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "Black Box testing" do
|
25
|
+
it "compiles and checks for valid output" do
|
26
|
+
setup_and_teardown_compiled_files(test_case) do |dir|
|
27
|
+
require_relative "#{dir}/#{test_case}.#{os_extension}"
|
28
|
+
|
29
|
+
expect(use_narray).to eq(3.0)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/pow_spec.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubex do
|
4
|
+
test_case = "pow"
|
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(test_pow(4, 2)).to eq(20)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rubex/rake_task'
|
3
|
+
|
4
|
+
describe Rubex::RakeTask do
|
5
|
+
context "#files" do
|
6
|
+
it "specifies rubex files for a multi-file compile" do
|
7
|
+
files = ["foo.rubex", "bar.rubex", "bar.rubex"]
|
8
|
+
task = Rubex::RakeTask.new("test") do
|
9
|
+
files files
|
10
|
+
end
|
11
|
+
|
12
|
+
expect(task.rubex_files).to eq(files)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#ext" do
|
17
|
+
before do
|
18
|
+
@task_name = "test"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "assumes default dir for ext in a gem" do
|
22
|
+
task = Rubex::RakeTask.new(@task_name)
|
23
|
+
expect(task.ext_dir).to eq("#{Dir.pwd}/ext/#{@task_name}")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "allows user to set the ext directory" do
|
27
|
+
task = Rubex::RakeTask.new(@task_name) do
|
28
|
+
ext Dir.pwd
|
29
|
+
end
|
30
|
+
expect(task.ext_dir).to eq(Dir.pwd)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "#debug" do
|
35
|
+
before do
|
36
|
+
@task_name = "test"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets debug flag -g during compilation" do
|
40
|
+
task = Rubex::RakeTask.new(@task_name) do
|
41
|
+
debug = true
|
42
|
+
end
|
43
|
+
|
44
|
+
expect(task.debug).to eq(true)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "rake" do
|
50
|
+
context "rubex:compile" do
|
51
|
+
before do
|
52
|
+
Rake::Task.clear
|
53
|
+
end
|
54
|
+
|
55
|
+
it "compiles a single file program" do
|
56
|
+
ext_path = "#{Dir.pwd}/spec/fixtures/rake_task/single_file"
|
57
|
+
name = "test"
|
58
|
+
Rubex::RakeTask.new(name) do
|
59
|
+
ext ext_path
|
60
|
+
end
|
61
|
+
Rake::Task["rubex:compile"].invoke
|
62
|
+
|
63
|
+
build_path = "#{ext_path}/#{name}"
|
64
|
+
expect(File.exist?("#{build_path}/#{name}.c")).to eq(true)
|
65
|
+
expect(File.exist?("#{build_path}/extconf.rb")).to eq(true)
|
66
|
+
|
67
|
+
# delete generated files
|
68
|
+
Dir.chdir(build_path) do
|
69
|
+
FileUtils.rm(
|
70
|
+
Dir.glob(
|
71
|
+
"#{build_path}/*.{c,h,so,o,bundle,dll}") + ["Makefile", "extconf.rb"], force: true
|
72
|
+
)
|
73
|
+
end
|
74
|
+
FileUtils.rmdir(build_path)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "compiles a multiple file program" do
|
78
|
+
Rubex::RakeTask.new("test") do
|
79
|
+
ext "#{Dir.pwd}/fixtures/rake_task/multi_file"
|
80
|
+
files ["a.rubex", "test.rubex"]
|
81
|
+
end
|
82
|
+
Rake::Task["rubex:compile"].invoke
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "rake:clobber" do
|
87
|
+
before do
|
88
|
+
Rake::Task.clear
|
89
|
+
end
|
90
|
+
|
91
|
+
it "clobbers generated files." do
|
92
|
+
ext_path = "#{Dir.pwd}/spec/fixtures/rake_task/single_file"
|
93
|
+
name = "test"
|
94
|
+
Rubex::RakeTask.new(name) do
|
95
|
+
ext ext_path
|
96
|
+
end
|
97
|
+
Rake::Task["rubex:compile"].invoke
|
98
|
+
Rake::Task["rubex:clobber"].invoke
|
99
|
+
|
100
|
+
expect(!File.exist?("#{ext_path}/#{name}/#{name}.c")).to eq(true)
|
101
|
+
expect(!File.exist?("#{ext_path}/#{name}/extconf.rb")).to eq(true)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "rake:compile:install" do
|
106
|
+
before do
|
107
|
+
Rake::Task.clear
|
108
|
+
end
|
109
|
+
|
110
|
+
context "for single file" do
|
111
|
+
it "generates the shared object file after compilation" do
|
112
|
+
ext_path = "#{Dir.pwd}/spec/fixtures/rake_task/single_file"
|
113
|
+
name = "test"
|
114
|
+
Rubex::RakeTask.new(name) do
|
115
|
+
ext ext_path
|
116
|
+
end
|
117
|
+
Rake::Task["rubex:compile:install"].invoke
|
118
|
+
|
119
|
+
expect(File.exist?("#{ext_path}/#{name}/#{name}.c")).to eq(true)
|
120
|
+
expect(File.exist?("#{ext_path}/#{name}/extconf.rb")).to eq(true)
|
121
|
+
expect(File.exist?("#{ext_path}/#{name}/#{name}.so")).to eq(true)
|
122
|
+
|
123
|
+
# delete generated files
|
124
|
+
dir = "#{ext_path}/#{name}"
|
125
|
+
Dir.chdir(dir) do
|
126
|
+
FileUtils.rm(
|
127
|
+
Dir.glob(
|
128
|
+
"#{dir}/#{name}.{c,h,so,o,bundle,dll}") + ["Makefile", "extconf.rb"],
|
129
|
+
force: true
|
130
|
+
)
|
131
|
+
end
|
132
|
+
FileUtils.rmdir(dir)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context "for multi file" do
|
137
|
+
skip "generates .so file after compilation" do
|
138
|
+
# TODO
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/spec/recursion_spec.rb
CHANGED
@@ -9,22 +9,22 @@ describe Rubex do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
context '.ast' do
|
12
|
-
|
12
|
+
it 'generates a valid AST' do
|
13
13
|
t = Rubex::Compiler.ast(@path + '.rubex')
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
context '.compile' do
|
18
|
-
|
18
|
+
it '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
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}"
|
27
|
-
expect(Fibonnaci.new.compute(
|
27
|
+
expect(Fibonnaci.new.compute(10)).to eq(55)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include Rubex::AST
|
3
|
+
|
4
|
+
describe Rubex do
|
5
|
+
test_case = 'ruby_constant_scoping'
|
6
|
+
|
7
|
+
context "Case : #{test_case}" do
|
8
|
+
before do
|
9
|
+
@path = path_str test_case
|
10
|
+
end
|
11
|
+
|
12
|
+
context ".ast" do
|
13
|
+
it "returns a valid Abstract Syntax Tree" do
|
14
|
+
t = Rubex::Compiler.ast @path + ".rubex"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context ".compile" do
|
19
|
+
it "generates valid C code" do
|
20
|
+
t, c, e = Rubex::Compiler.compile @path + ".rubex", test: true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "Black Box testing" do
|
25
|
+
it "compiles and checks for valid output" do
|
26
|
+
setup_and_teardown_compiled_files(test_case) do |dir|
|
27
|
+
class Foo
|
28
|
+
class Bar
|
29
|
+
class Baz
|
30
|
+
NUMBER = 10
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
require_relative "#{dir}/#{test_case}.#{os_extension}"
|
35
|
+
|
36
|
+
expect(get_eid.is_a?(Fixnum)).to eq(true)
|
37
|
+
expect(user_chained_const).to eq(10)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|