rubex 0.1 → 0.1.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.
- checksums.yaml +5 -5
- data/.gitignore +3 -2
- data/.travis.yml +9 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +4 -1
- data/Rakefile +2 -2
- data/bin/rubex +4 -5
- data/lib/rubex.rb +4 -4
- data/lib/rubex/ast.rb +4 -1
- data/lib/rubex/ast/expression.rb +22 -1191
- data/lib/rubex/ast/expression/actual_arg_list.rb +40 -0
- data/lib/rubex/ast/expression/analysed_element_ref.rb +26 -0
- data/lib/rubex/ast/expression/analysed_element_ref/c_var_element_ref.rb +30 -0
- data/lib/rubex/ast/expression/analysed_element_ref/ruby_object_element_ref.rb +42 -0
- data/lib/rubex/ast/expression/arg_declaration.rb +43 -0
- data/lib/rubex/ast/expression/binary.rb +57 -0
- data/lib/rubex/ast/expression/binary/binary_boolean.rb +23 -0
- data/lib/rubex/ast/expression/binary/binary_boolean_special_op.rb +20 -0
- data/lib/rubex/ast/expression/binary/empty_classes.rb +62 -0
- data/lib/rubex/ast/expression/block_given.rb +15 -0
- data/lib/rubex/ast/expression/coerce_object.rb +15 -0
- data/lib/rubex/ast/expression/command_call.rb +74 -0
- data/lib/rubex/ast/expression/command_call/struct_or_union_member_call.rb +38 -0
- data/lib/rubex/ast/expression/element_ref.rb +64 -0
- data/lib/rubex/ast/expression/empty.rb +13 -0
- data/lib/rubex/ast/expression/from_ruby_object.rb +20 -0
- data/lib/rubex/ast/expression/func_ptr_arg_declaration.rb +21 -0
- data/lib/rubex/ast/expression/func_ptr_internal_arg_declaration.rb +13 -0
- data/lib/rubex/ast/expression/literal.rb +30 -0
- data/lib/rubex/ast/expression/literal/array_lit.rb +51 -0
- data/lib/rubex/ast/expression/literal/c_null.rb +15 -0
- data/lib/rubex/ast/expression/literal/char.rb +36 -0
- data/lib/rubex/ast/expression/literal/double.rb +14 -0
- data/lib/rubex/ast/expression/literal/false.rb +33 -0
- data/lib/rubex/ast/expression/literal/hash_lit.rb +45 -0
- data/lib/rubex/ast/expression/literal/int.rb +14 -0
- data/lib/rubex/ast/expression/literal/nil.rb +14 -0
- data/lib/rubex/ast/expression/literal/ruby_symbol.rb +22 -0
- data/lib/rubex/ast/expression/literal/string_lit.rb +45 -0
- data/lib/rubex/ast/expression/literal/true.rb +29 -0
- data/lib/rubex/ast/expression/method_call.rb +52 -0
- data/lib/rubex/ast/expression/method_call/c_function_call.rb +40 -0
- data/lib/rubex/ast/expression/method_call/ruby_method_call.rb +83 -0
- data/lib/rubex/ast/expression/name.rb +127 -0
- data/lib/rubex/ast/expression/ruby_constant.rb +25 -0
- data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_array_element_ref.rb +20 -0
- data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_hash_element_ref.rb +22 -0
- data/lib/rubex/ast/expression/self.rb +15 -0
- data/lib/rubex/ast/expression/size_of.rb +22 -0
- data/lib/rubex/ast/expression/struct_or_union_member_call/element_ref_member_call.rb +23 -0
- data/lib/rubex/ast/expression/to_ruby_object.rb +21 -0
- data/lib/rubex/ast/expression/typecast.rb +20 -0
- data/lib/rubex/ast/expression/typecast_to.rb +10 -0
- data/lib/rubex/ast/expression/unary.rb +37 -0
- data/lib/rubex/ast/expression/unary_base.rb +24 -0
- data/lib/rubex/ast/expression/unary_base/ampersand.rb +16 -0
- data/lib/rubex/ast/expression/unary_base/unary_bit_not.rb +18 -0
- data/lib/rubex/ast/expression/unary_base/unary_not.rb +18 -0
- data/lib/rubex/ast/expression/unary_base/unary_sub.rb +18 -0
- data/lib/rubex/ast/node.rb +111 -111
- data/lib/rubex/ast/statement.rb +9 -1160
- data/lib/rubex/ast/statement/alias.rb +43 -0
- data/lib/rubex/ast/statement/argument_list.rb +59 -0
- data/lib/rubex/ast/statement/assign.rb +35 -0
- data/lib/rubex/ast/statement/begin_block.rb +14 -0
- data/lib/rubex/ast/statement/begin_block/begin.rb +202 -0
- data/lib/rubex/ast/statement/begin_block/else.rb +21 -0
- data/lib/rubex/ast/statement/begin_block/ensure.rb +21 -0
- data/lib/rubex/ast/statement/begin_block/rescue.rb +34 -0
- data/lib/rubex/ast/statement/break.rb +18 -0
- data/lib/rubex/ast/statement/c_array_decl.rb +49 -0
- data/lib/rubex/ast/statement/c_base_type.rb +26 -0
- data/lib/rubex/ast/statement/c_function_decl.rb +30 -0
- data/lib/rubex/ast/statement/c_ptr_decl.rb +52 -0
- data/lib/rubex/ast/statement/c_ptr_decl/c_ptr_func_decl.rb +25 -0
- data/lib/rubex/ast/statement/c_struct_or_union_def.rb +49 -0
- data/lib/rubex/ast/statement/expression.rb +26 -0
- data/lib/rubex/ast/statement/for.rb +73 -0
- data/lib/rubex/ast/statement/forward_decl.rb +31 -0
- data/lib/rubex/ast/statement/if_block.rb +64 -0
- data/lib/rubex/ast/statement/if_block/else.rb +30 -0
- data/lib/rubex/ast/statement/if_block/elsif.rb +22 -0
- data/lib/rubex/ast/statement/if_block/helper.rb +38 -0
- data/lib/rubex/ast/statement/print.rb +49 -0
- data/lib/rubex/ast/statement/raise.rb +66 -0
- data/lib/rubex/ast/statement/return.rb +45 -0
- data/lib/rubex/ast/statement/var_decl.rb +49 -0
- data/lib/rubex/ast/statement/while.rb +34 -0
- data/lib/rubex/ast/statement/yield.rb +41 -0
- data/lib/rubex/ast/top_statement.rb +1 -815
- data/lib/rubex/ast/top_statement/c_bindings.rb +145 -0
- data/lib/rubex/ast/top_statement/klass.rb +125 -0
- data/lib/rubex/ast/top_statement/klass/attached_klass.rb +417 -0
- data/lib/rubex/ast/top_statement/method_def.rb +110 -0
- data/lib/rubex/ast/top_statement/method_def/c_function_def.rb +26 -0
- data/lib/rubex/ast/top_statement/method_def/ruby_method_def.rb +33 -0
- data/lib/rubex/cli.rb +26 -0
- data/lib/rubex/code_writer.rb +1 -1
- data/lib/rubex/compiler.rb +49 -28
- data/lib/rubex/compiler_config.rb +4 -2
- data/lib/rubex/constants.rb +71 -71
- data/lib/rubex/data_type.rb +9 -675
- data/lib/rubex/data_type/c_array.rb +33 -0
- data/lib/rubex/data_type/c_function.rb +23 -0
- data/lib/rubex/data_type/c_ptr.rb +71 -0
- data/lib/rubex/data_type/c_str.rb +23 -0
- data/lib/rubex/data_type/c_struct_or_union.rb +23 -0
- data/lib/rubex/data_type/char.rb +30 -0
- data/lib/rubex/data_type/f_32.rb +38 -0
- data/lib/rubex/data_type/f_64.rb +38 -0
- data/lib/rubex/data_type/int.rb +32 -0
- data/lib/rubex/data_type/int/c_boolean.rb +13 -0
- data/lib/rubex/data_type/int_16.rb +32 -0
- data/lib/rubex/data_type/int_32.rb +32 -0
- data/lib/rubex/data_type/int_64.rb +36 -0
- data/lib/rubex/data_type/int_8.rb +33 -0
- data/lib/rubex/data_type/l_int.rb +38 -0
- data/lib/rubex/data_type/l_l_int.rb +26 -0
- data/lib/rubex/data_type/ruby_method.rb +22 -0
- data/lib/rubex/data_type/ruby_object.rb +19 -0
- data/lib/rubex/data_type/ruby_object/boolean.rb +11 -0
- data/lib/rubex/data_type/ruby_object/boolean/false_type.rb +5 -0
- data/lib/rubex/data_type/ruby_object/boolean/true_type.rb +5 -0
- data/lib/rubex/data_type/ruby_object/nil_type.rb +9 -0
- data/lib/rubex/data_type/ruby_object/ruby_array.rb +10 -0
- data/lib/rubex/data_type/ruby_object/ruby_constant.rb +18 -0
- data/lib/rubex/data_type/ruby_object/ruby_constant/ruby_class.rb +18 -0
- data/lib/rubex/data_type/ruby_object/ruby_hash.rb +9 -0
- data/lib/rubex/data_type/ruby_object/ruby_string.rb +10 -0
- data/lib/rubex/data_type/ruby_object/ruby_symbol.rb +10 -0
- data/lib/rubex/data_type/type_def.rb +34 -0
- data/lib/rubex/data_type/u_char.rb +27 -0
- data/lib/rubex/data_type/u_int.rb +32 -0
- data/lib/rubex/data_type/u_int_16.rb +22 -0
- data/lib/rubex/data_type/u_int_32.rb +22 -0
- data/lib/rubex/data_type/u_int_64.rb +26 -0
- data/lib/rubex/data_type/u_int_8.rb +22 -0
- data/lib/rubex/data_type/u_l_int.rb +36 -0
- data/lib/rubex/data_type/u_l_int/size_t.rb +10 -0
- data/lib/rubex/data_type/u_l_l_int.rb +26 -0
- data/lib/rubex/data_type/void.rb +15 -0
- data/lib/rubex/data_type_helpers/float_helpers.rb +8 -0
- data/lib/rubex/data_type_helpers/helpers.rb +48 -0
- data/lib/rubex/data_type_helpers/int_helpers.rb +10 -0
- data/lib/rubex/data_type_helpers/u_int_helpers.rb +11 -0
- data/lib/rubex/helpers.rb +35 -118
- data/lib/rubex/helpers/node_type_methods.rb +9 -0
- data/lib/rubex/helpers/writers.rb +79 -0
- data/lib/rubex/parser.racc +83 -34
- data/lib/rubex/parser.racc.rb +233 -184
- data/lib/rubex/version.rb +2 -2
- data/rubex.gemspec +2 -0
- data/spec/basic_ruby_method_spec.rb +1 -1
- data/spec/binding_ptr_args_spec.rb +2 -2
- data/spec/bitwise_operators_spec.rb +1 -1
- data/spec/blocks_spec.rb +2 -2
- data/spec/c_bindings_spec.rb +1 -1
- data/spec/c_constants_spec.rb +1 -1
- data/spec/c_function_ptrs_spec.rb +1 -1
- data/spec/c_functions_spec.rb +2 -2
- data/spec/c_struct_interface_spec.rb +1 -1
- data/spec/call_by_reference_spec.rb +2 -2
- data/spec/class_methods_spec.rb +2 -2
- data/spec/class_spec.rb +4 -4
- data/spec/cli_spec.rb +43 -0
- data/spec/comments_spec.rb +2 -2
- data/spec/default_args_spec.rb +21 -23
- data/spec/error_handling_spec.rb +1 -1
- data/spec/examples_spec.rb +4 -4
- data/spec/expressions_spec.rb +1 -1
- data/spec/fixtures/cli/cli.rubex +3 -0
- data/spec/fixtures/examples/array_to_hash.rubex +1 -1
- data/spec/fixtures/examples/rcsv.rubex +10 -6
- data/spec/fixtures/loops/loops.rubex +1 -1
- data/spec/fixtures/ruby_strings/string_blank_bm.rb +7 -5
- data/spec/fixtures/struct/struct.rubex +7 -2
- data/spec/fixtures/temp_allocation/temp_allocation.rubex +8 -0
- data/spec/if_else_spec.rb +3 -7
- data/spec/implicit_lib_include_spec.rb +1 -1
- data/spec/init_ruby_objects_with_literal_syntax_spec.rb +1 -1
- data/spec/loops_spec.rb +1 -1
- data/spec/recursion_spec.rb +18 -21
- data/spec/ruby_constant_method_calls_spec.rb +4 -4
- data/spec/ruby_operators_spec.rb +1 -1
- data/spec/ruby_raise_spec.rb +1 -1
- data/spec/ruby_strings_spec.rb +3 -3
- data/spec/ruby_symbols_spec.rb +1 -1
- data/spec/ruby_types_spec.rb +2 -2
- data/spec/spec_helper.rb +42 -10
- data/spec/statement_expression_spec.rb +3 -3
- data/spec/static_array_spec.rb +3 -3
- data/spec/string_literals_spec.rb +2 -2
- data/spec/struct_spec.rb +4 -4
- data/spec/temp_allocation_spec.rb +35 -0
- data/spec/typecasting_spec.rb +2 -2
- data/spec/var_declarions_spec.rb +2 -2
- metadata +168 -3
@@ -0,0 +1,110 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module TopStatement
|
4
|
+
class MethodDef
|
5
|
+
include Rubex::Helpers::Writers
|
6
|
+
# Ruby name of the method.
|
7
|
+
attr_reader :name
|
8
|
+
# Method arguments. Accessor because arguments need to be modified in
|
9
|
+
# case of auxillary C functions of attach classes.
|
10
|
+
attr_accessor :arg_list
|
11
|
+
# The statments/expressions contained within the method.
|
12
|
+
attr_reader :statements
|
13
|
+
# Symbol Table entry.
|
14
|
+
attr_reader :entry
|
15
|
+
# Instance of Scope::Local for this method.
|
16
|
+
attr_reader :scope
|
17
|
+
# Variable name that identifies 'self'
|
18
|
+
attr_reader :self_name
|
19
|
+
|
20
|
+
def initialize(name, arg_list, statements)
|
21
|
+
@name = name
|
22
|
+
@arg_list = arg_list
|
23
|
+
@statements = statements
|
24
|
+
@self_name = Rubex::ARG_PREFIX + 'self'
|
25
|
+
end
|
26
|
+
|
27
|
+
def analyse_statement(outer_scope)
|
28
|
+
@entry = outer_scope.find @name
|
29
|
+
@scope = @entry.type.scope
|
30
|
+
@scope.type = @entry.type
|
31
|
+
@scope.self_name = @self_name
|
32
|
+
@arg_list = @entry.type.arg_list
|
33
|
+
@statements.each do |stat|
|
34
|
+
stat.analyse_statement @scope
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Option c_function - When set to true, certain code that is not required
|
39
|
+
# for Ruby methods will be generated too.
|
40
|
+
def generate_code(code, c_function: false)
|
41
|
+
code.block do
|
42
|
+
generate_function_definition code, c_function: c_function
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def rescan_declarations(_scope)
|
47
|
+
@statements.each do |stat|
|
48
|
+
stat.respond_to?(:rescan_declarations) &&
|
49
|
+
stat.rescan_declarations(@scope)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def generate_function_definition(code, c_function:)
|
56
|
+
declare_types code, @scope
|
57
|
+
declare_args code unless c_function
|
58
|
+
declare_vars code, @scope
|
59
|
+
declare_carrays code, @scope
|
60
|
+
declare_ruby_objects code, @scope
|
61
|
+
declare_temps code, @scope
|
62
|
+
generate_arg_checking code unless c_function
|
63
|
+
init_args code unless c_function
|
64
|
+
declare_carrays_using_init_var_value code
|
65
|
+
generate_statements code
|
66
|
+
end
|
67
|
+
|
68
|
+
def declare_args(code)
|
69
|
+
@scope.arg_entries.each do |arg|
|
70
|
+
code.declare_variable type: arg.type.to_s, c_name: arg.c_name
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def generate_statements(code)
|
75
|
+
@statements.each do |stat|
|
76
|
+
stat.generate_code code, @scope
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def init_args(code)
|
81
|
+
@scope.arg_entries.each_with_index do |arg, i|
|
82
|
+
code << arg.c_name + '=' + arg.type.from_ruby_object("argv[#{i}]") + ';'
|
83
|
+
code.nl
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def declare_carrays_using_init_var_value(code)
|
88
|
+
@scope.carray_entries.reject do |s|
|
89
|
+
s.type.dimension.is_a?(Rubex::AST::Expression::Literal::Base)
|
90
|
+
end. each do |arr|
|
91
|
+
type = arr.type.type.to_s
|
92
|
+
c_name = arr.c_name
|
93
|
+
dimension = arr.type.dimension.c_code(@scope)
|
94
|
+
value = arr.value.map { |a| a.c_code(@scope) } if arr.value
|
95
|
+
code.declare_carray(type: type, c_name: c_name, dimension: dimension,
|
96
|
+
value: value)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def generate_arg_checking(code)
|
101
|
+
code << 'if (argc < ' + @scope.arg_entries.size.to_s + ')'
|
102
|
+
code.block do
|
103
|
+
code << %{rb_raise(rb_eArgError, "Need #{@scope.arg_entries.size} args, not %d", argc);\n}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module TopStatement
|
4
|
+
class CFunctionDef < MethodDef
|
5
|
+
attr_reader :type, :return_ptr_level
|
6
|
+
|
7
|
+
def initialize(type, return_ptr_level, name, arg_list, statements)
|
8
|
+
super(name, arg_list, statements)
|
9
|
+
@type = type
|
10
|
+
@return_ptr_level = return_ptr_level
|
11
|
+
end
|
12
|
+
|
13
|
+
def analyse_statement(outer_scope, extern: false)
|
14
|
+
super(outer_scope)
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_code(code)
|
18
|
+
code.write_c_method_header(type: @entry.type.type.to_s,
|
19
|
+
c_name: @entry.c_name, args: Helpers.create_arg_arrays(@arg_list))
|
20
|
+
super code, c_function: true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module TopStatement
|
4
|
+
class RubyMethodDef < MethodDef
|
5
|
+
attr_reader :singleton
|
6
|
+
|
7
|
+
def initialize(name, arg_list, statements, singleton: false)
|
8
|
+
super(name, arg_list, statements)
|
9
|
+
@singleton = singleton
|
10
|
+
end
|
11
|
+
|
12
|
+
def analyse_statement(local_scope)
|
13
|
+
super
|
14
|
+
@entry.singleton = @singleton
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_code(code)
|
18
|
+
code.write_ruby_method_header(type: @entry.type.type.to_s,
|
19
|
+
c_name: @entry.c_name)
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def ==(other)
|
24
|
+
self.class == other.class && @name == other.name &&
|
25
|
+
@c_name == other.c_name && @arg_list == other.arg_list &&
|
26
|
+
@statements == other.statements && @entry == other.entry &&
|
27
|
+
@type == other.type
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/rubex/cli.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'thor'
|
2
|
+
module Rubex
|
3
|
+
# Cli for rubex using Thor(http://whatisthor.com/)
|
4
|
+
class Cli < Thor
|
5
|
+
desc 'generate FILE', 'generates directory with name specified in the argument and creates an extconf.rb file which is required for C extensions'
|
6
|
+
option :force, aliases: '-f', desc: 'replace existing files and directories'
|
7
|
+
option :dir, aliases: '-d', desc: 'specify a directory for generating files', type: :string
|
8
|
+
option :install, aliases: '-i', desc: 'automatically run install command after generating Makefile'
|
9
|
+
option :debug, aliases: '-g', desc: 'enable debugging symbols when compiling with GCC'
|
10
|
+
def generate(file)
|
11
|
+
if (force = options[:force])
|
12
|
+
directory = (options[:dir] ? options[:dir].to_s : Dir.pwd) + "/#{Rubex::Compiler.extract_target_name(file)}"
|
13
|
+
STDOUT.puts "Warning! you are about to replace contents in the directory '#{directory}', Are you sure? [Yn] "
|
14
|
+
confirmation = STDIN.gets.chomp
|
15
|
+
force = (confirmation == 'Y')
|
16
|
+
end
|
17
|
+
Rubex::Compiler.compile file, directory: options[:dir], force: force, make: options[:install], debug: options[:debug]
|
18
|
+
end
|
19
|
+
|
20
|
+
desc 'install PATH', 'run "make" utility to generate a shared object file required for C extensions'
|
21
|
+
def install(path)
|
22
|
+
Rubex::Compiler.run_make path
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/rubex/code_writer.rb
CHANGED
@@ -34,7 +34,7 @@ module Rubex
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def write_ruby_method_header type: , c_name:
|
37
|
-
args = [["int", "argc"], ["VALUE*", "argv"],
|
37
|
+
args = [["int", "argc"], ["VALUE*", "argv"],
|
38
38
|
["VALUE", "#{Rubex::ARG_PREFIX + "self"}"]]
|
39
39
|
write_func_prototype type, c_name, args
|
40
40
|
end
|
data/lib/rubex/compiler.rb
CHANGED
@@ -1,64 +1,65 @@
|
|
1
|
+
require 'fileutils'
|
1
2
|
module Rubex
|
2
3
|
class Compiler
|
3
4
|
CONFIG = Rubex::CompilerConfig.new
|
4
5
|
|
5
6
|
class << self
|
6
|
-
def compile path, test: false, directory: nil
|
7
|
+
def compile path, test: false, directory: nil, force: false, make: false, debug: false
|
7
8
|
tree = ast path, test: test
|
8
9
|
target_name = extract_target_name path
|
9
10
|
code = generate_code tree, target_name
|
10
11
|
ext = extconf target_name, directory: directory
|
11
12
|
CONFIG.flush
|
12
|
-
|
13
|
+
CONFIG.debug = debug
|
14
|
+
|
13
15
|
return [tree, code, ext] if test
|
14
|
-
write_files target_name, code, ext, directory: directory
|
16
|
+
write_files target_name, code, ext, directory: directory, force: force
|
17
|
+
full_path = build_path(directory, target_name)
|
18
|
+
load_extconf full_path
|
19
|
+
run_make full_path if make
|
15
20
|
end
|
16
21
|
|
17
22
|
def ast path, test: false
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
error_msg << "Line: #{parser.string.split("\n")[parser.lineno-1]}\n"
|
30
|
-
error_msg << "Location: #{parser.location}\n"
|
31
|
-
error_msg << "Error:\n#{e}"
|
32
|
-
STDERR.puts error_msg
|
33
|
-
end
|
34
|
-
end
|
23
|
+
parser = Rubex::Parser.new
|
24
|
+
parser.parse(path)
|
25
|
+
parser.do_parse
|
26
|
+
rescue Racc::ParseError => e
|
27
|
+
raise e if test
|
28
|
+
|
29
|
+
error_msg = "\nPARSE ERROR:\n"
|
30
|
+
error_msg << "Line: #{parser.string.split("\n")[parser.lineno-1]}\n"
|
31
|
+
error_msg << "Location: #{parser.location}\n"
|
32
|
+
error_msg << "Error:\n#{e}"
|
33
|
+
STDERR.puts error_msg
|
35
34
|
end
|
36
35
|
|
37
36
|
def extconf target_name, directory: nil
|
38
|
-
path = directory
|
37
|
+
path = build_path(directory, target_name)
|
39
38
|
extconf = ""
|
40
39
|
extconf << "require 'mkmf'\n"
|
41
40
|
extconf << "$libs += \" #{CONFIG.link_flags}\"\n"
|
41
|
+
extconf << "$CFLAGS += \" -g \"\n" if CONFIG.debug
|
42
42
|
extconf << "create_makefile('#{path}/#{target_name}')\n"
|
43
43
|
extconf
|
44
44
|
end
|
45
45
|
|
46
46
|
def generate_code tree, target_name
|
47
47
|
code = Rubex::CodeWriter.new target_name
|
48
|
-
raise "Must be a Rubex::AST::Node, not #{tree.class}" unless
|
48
|
+
raise "Must be a Rubex::AST::Node, not #{tree.class}" unless
|
49
49
|
tree.is_a? Rubex::AST::Node
|
50
50
|
tree.process_statements target_name, code
|
51
51
|
code
|
52
52
|
end
|
53
53
|
|
54
54
|
def extract_target_name path
|
55
|
-
File.basename(path).split('.')[0]
|
55
|
+
File.basename(path).split('.')[0]
|
56
56
|
end
|
57
57
|
|
58
|
-
def write_files target_name, code, ext, directory: nil
|
59
|
-
path = directory
|
60
|
-
|
61
|
-
|
58
|
+
def write_files target_name, code, ext, directory: nil, force: false
|
59
|
+
path = build_path(directory, target_name)
|
60
|
+
FileUtils.rm_rf(path) if force && Dir.exist?(path)
|
61
|
+
Dir.mkdir(path) unless Dir.exist?(path)
|
62
|
+
|
62
63
|
code_file = File.new "#{path}/#{target_name}.c", "w+"
|
63
64
|
code_file.puts code.to_s
|
64
65
|
code_file.close
|
@@ -67,6 +68,26 @@ module Rubex
|
|
67
68
|
extconf_file.puts ext
|
68
69
|
extconf_file.close
|
69
70
|
end
|
71
|
+
|
72
|
+
def load_extconf path
|
73
|
+
Dir.chdir(path) do
|
74
|
+
system("ruby #{path}/extconf.rb")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def run_make path
|
79
|
+
Dir.chdir(path) do
|
80
|
+
system("make -C #{path}")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def build_path directory, target_name
|
85
|
+
directory = (directory ? directory.to_s : Dir.pwd)
|
86
|
+
unless directory.end_with?(target_name)
|
87
|
+
directory += "/#{target_name}"
|
88
|
+
end
|
89
|
+
directory
|
90
|
+
end
|
70
91
|
end
|
71
92
|
end
|
72
|
-
end
|
93
|
+
end
|
data/lib/rubex/constants.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Rubex
|
2
2
|
RUBEX_PREFIX = "__rubex_"
|
3
3
|
GLOBAL_PREFIX = "global_"
|
4
|
-
|
4
|
+
|
5
5
|
TEMP_PREFIX = RUBEX_PREFIX + "temp_"
|
6
6
|
RUBY_FUNC_PREFIX = RUBEX_PREFIX + "rb_f_"
|
7
7
|
C_FUNC_PREFIX = RUBEX_PREFIX + "c_f_"
|
@@ -50,75 +50,75 @@ module Rubex
|
|
50
50
|
CUSTOM_TYPES = {}
|
51
51
|
|
52
52
|
DEFAULT_CLASS_MAPPINGS = {
|
53
|
-
"Kernel"
|
54
|
-
"Comparable"
|
55
|
-
"Enumerable"
|
56
|
-
"Errno"
|
57
|
-
"FileTest"
|
58
|
-
"GC"
|
59
|
-
"Math"
|
60
|
-
"Process"
|
61
|
-
"WaitReadable"
|
62
|
-
"WaitWritable"
|
63
|
-
"BasicObject"
|
64
|
-
"Object"
|
65
|
-
"Array"
|
66
|
-
"Bignum"
|
67
|
-
"Binding"
|
68
|
-
"Class"
|
69
|
-
"Cont"
|
70
|
-
"Dir"
|
71
|
-
"Data"
|
72
|
-
"FalseClass"
|
73
|
-
"Encoding"
|
74
|
-
"Enumerator"
|
75
|
-
"File"
|
76
|
-
"Fixnum"
|
77
|
-
"Float"
|
78
|
-
"Hash"
|
79
|
-
"Integer"
|
80
|
-
"IO"
|
81
|
-
"Match"
|
82
|
-
"Method"
|
83
|
-
"Module"
|
84
|
-
"NameErrorMesg"
|
85
|
-
"NilClass"
|
86
|
-
"Numeric"
|
87
|
-
"Proc"
|
88
|
-
"Random"
|
89
|
-
"Range"
|
90
|
-
"Rational"
|
91
|
-
"Complex"
|
92
|
-
"Regexp"
|
93
|
-
"Stat"
|
94
|
-
"String"
|
95
|
-
"Struct"
|
96
|
-
"Symbol"
|
97
|
-
"Thread"
|
98
|
-
"Time"
|
99
|
-
"TrueClass"
|
100
|
-
"UnboundMethod"
|
101
|
-
"Exception"
|
102
|
-
"StandardError"
|
103
|
-
"SystemExit"
|
104
|
-
"Interrupt"
|
105
|
-
"Signal"
|
106
|
-
"Fatal"
|
107
|
-
"ArgumentError"
|
108
|
-
"EOFError"
|
109
|
-
"IndexError"
|
110
|
-
"StopIteration"
|
111
|
-
"KeyError"
|
112
|
-
"RangeError"
|
113
|
-
"IOError"
|
114
|
-
"RuntimeError"
|
115
|
-
"SecurityError"
|
116
|
-
"SystemCallError"
|
117
|
-
"ThreadError"
|
118
|
-
"TypeError"
|
119
|
-
"ZeroDivError"
|
120
|
-
"NotImpError"
|
121
|
-
"NoMemError"
|
53
|
+
"Kernel" => "rb_mKernel",
|
54
|
+
"Comparable" => "rb_mComparable",
|
55
|
+
"Enumerable" => "rb_mEnumerable",
|
56
|
+
"Errno" => "rb_mErrno",
|
57
|
+
"FileTest" => "rb_mFileTest",
|
58
|
+
"GC" => "rb_mGC",
|
59
|
+
"Math" => "rb_mMath",
|
60
|
+
"Process" => "rb_mProcess",
|
61
|
+
"WaitReadable" => "rb_mWaitReadable",
|
62
|
+
"WaitWritable" => "rb_mWaitWritable",
|
63
|
+
"BasicObject" => "rb_cBasicObject",
|
64
|
+
"Object" => "rb_cObject",
|
65
|
+
"Array" => "rb_cArray",
|
66
|
+
"Bignum" => "rb_cBignum",
|
67
|
+
"Binding" => "rb_cBinding",
|
68
|
+
"Class" => "rb_cClass",
|
69
|
+
"Cont" => "rb_cCont",
|
70
|
+
"Dir" => "rb_cDir",
|
71
|
+
"Data" => "rb_cData",
|
72
|
+
"FalseClass" => "rb_cFalseClass",
|
73
|
+
"Encoding" => "rb_cEncoding",
|
74
|
+
"Enumerator" => "rb_cEnumerator",
|
75
|
+
"File" => "rb_cFile",
|
76
|
+
"Fixnum" => "rb_cFixnum",
|
77
|
+
"Float" => "rb_cFloat",
|
78
|
+
"Hash" => "rb_cHash",
|
79
|
+
"Integer" => "rb_cInteger",
|
80
|
+
"IO" => "rb_cIO",
|
81
|
+
"Match" => "rb_cMatch",
|
82
|
+
"Method" => "rb_cMethod",
|
83
|
+
"Module" => "rb_cModule",
|
84
|
+
"NameErrorMesg" => "rb_cNameErrorMesg",
|
85
|
+
"NilClass" => "rb_cNilClass",
|
86
|
+
"Numeric" => "rb_cNumeric",
|
87
|
+
"Proc" => "rb_cProc",
|
88
|
+
"Random" => "rb_cRandom",
|
89
|
+
"Range" => "rb_cRange",
|
90
|
+
"Rational" => "rb_cRational",
|
91
|
+
"Complex" => "rb_cComplex",
|
92
|
+
"Regexp" => "rb_cRegexp",
|
93
|
+
"Stat" => "rb_cStat",
|
94
|
+
"String" => "rb_cString",
|
95
|
+
"Struct" => "rb_cStruct",
|
96
|
+
"Symbol" => "rb_cSymbol",
|
97
|
+
"Thread" => "rb_cThread",
|
98
|
+
"Time" => "rb_cTime",
|
99
|
+
"TrueClass" => "rb_cTrueClass",
|
100
|
+
"UnboundMethod" => "rb_cUnboundMethod",
|
101
|
+
"Exception" => "rb_eException",
|
102
|
+
"StandardError" => "rb_eStandardError",
|
103
|
+
"SystemExit" => "rb_eSystemExit",
|
104
|
+
"Interrupt" => "rb_eInterrupt",
|
105
|
+
"Signal" => "rb_eSignal",
|
106
|
+
"Fatal" => "rb_eFatal",
|
107
|
+
"ArgumentError" => "rb_eArgError",
|
108
|
+
"EOFError" => "rb_eEOFError",
|
109
|
+
"IndexError" => "rb_eIndexError",
|
110
|
+
"StopIteration" => "rb_eStopIteration",
|
111
|
+
"KeyError" => "rb_eKeyError",
|
112
|
+
"RangeError" => "rb_eRangeError",
|
113
|
+
"IOError" => "rb_eIOError",
|
114
|
+
"RuntimeError" => "rb_eRuntimeError",
|
115
|
+
"SecurityError" => "rb_eSecurityError",
|
116
|
+
"SystemCallError" => "rb_eSystemCallError",
|
117
|
+
"ThreadError" => "rb_eThreadError",
|
118
|
+
"TypeError" => "rb_eTypeError",
|
119
|
+
"ZeroDivError" => "rb_eZeroDivError",
|
120
|
+
"NotImpError" => "rb_eNotImpError",
|
121
|
+
"NoMemError" => "rb_eNoMemError",
|
122
122
|
"NoMethodError" => "rb_eNoMethodError",
|
123
123
|
"FloatDomainError" => "rb_eFloatDomainError",
|
124
124
|
"LocalJumpError" => "rb_eLocalJumpError",
|
@@ -138,7 +138,7 @@ module Rubex
|
|
138
138
|
|
139
139
|
C_MACRO_INT2BOOL = Rubex::RUBEX_PREFIX + "INT2BOOL"
|
140
140
|
C_FUNC_CHAR2RUBYSTR = Rubex::RUBEX_PREFIX + "char2rubystr"
|
141
|
-
|
141
|
+
|
142
142
|
ALLOC_FUNC_NAME = 'allocate'
|
143
143
|
DEALLOC_FUNC_NAME = 'deallocate'
|
144
144
|
MEMCOUNT_FUNC_NAME = 'memcount'
|