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