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,40 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class ActualArgList < Base
|
5
|
+
include Enumerable
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :@args, :empty?, :[], :size, :<<
|
9
|
+
|
10
|
+
def each(&block)
|
11
|
+
@args.each(&block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def map!(&block)
|
15
|
+
@args.map!(&block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize args
|
19
|
+
@args = args
|
20
|
+
@subexprs = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def analyse_types(local_scope)
|
24
|
+
@args.each do |arg|
|
25
|
+
arg.analyse_types local_scope
|
26
|
+
@subexprs << arg
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_evaluation_code(code, local_scope)
|
31
|
+
@args.each { |a| a.generate_evaluation_code(code, local_scope) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def generate_disposal_code(code)
|
35
|
+
@args.each { |a| a.generate_disposal_code(code) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class AnalysedElementRef < Base
|
5
|
+
def initialize(element_ref)
|
6
|
+
@element_ref = element_ref
|
7
|
+
@pos = @element_ref.pos
|
8
|
+
@entry = @element_ref.entry
|
9
|
+
@name = @element_ref.name
|
10
|
+
@subexprs = @element_ref.subexprs
|
11
|
+
@type = @element_ref.type
|
12
|
+
end
|
13
|
+
|
14
|
+
def analyse_types(local_scope)
|
15
|
+
@pos.analyse_types local_scope
|
16
|
+
end
|
17
|
+
|
18
|
+
def c_code(local_scope)
|
19
|
+
code = super
|
20
|
+
code << @c_code
|
21
|
+
code
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class CVarElementRef < AnalysedElementRef
|
5
|
+
def analyse_types(local_scope)
|
6
|
+
@pos.analyse_types local_scope
|
7
|
+
@subexprs << @pos
|
8
|
+
end
|
9
|
+
|
10
|
+
def generate_evaluation_code(code, local_scope)
|
11
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
12
|
+
@c_code = "#{@entry.c_name}[#{@pos.c_code(local_scope)}]"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate_element_ref_code(_expr, code, local_scope)
|
17
|
+
generate_evaluation_code code, local_scope
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate_assignment_code(rhs, code, local_scope)
|
21
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
22
|
+
code << "#{@entry.c_name}[#{@pos.c_code(local_scope)}] = "
|
23
|
+
code << "#{rhs.c_code(local_scope)};"
|
24
|
+
code.nl
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class RubyObjectElementRef < AnalysedElementRef
|
5
|
+
def analyse_types(local_scope)
|
6
|
+
super
|
7
|
+
@has_temp = true
|
8
|
+
@pos = @pos.to_ruby_object
|
9
|
+
@pos.allocate_temps local_scope
|
10
|
+
@pos.release_temps local_scope
|
11
|
+
@subexprs << @pos
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_evaluation_code(code, local_scope)
|
15
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
16
|
+
code << "#{@c_code} = rb_funcall(#{@entry.c_name}, rb_intern(\"[]\"), 1, "
|
17
|
+
code << "#{@pos.c_code(local_scope)});"
|
18
|
+
code.nl
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_element_ref_code(expr, code, local_scope)
|
23
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
24
|
+
str = "#{@c_code} = rb_funcall(#{expr.c_code(local_scope)}."
|
25
|
+
str << "#{@entry.c_name}, rb_intern(\"[]\"), 1, "
|
26
|
+
str << "#{@pos.c_code(local_scope)});"
|
27
|
+
code << str
|
28
|
+
code.nl
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def generate_assignment_code(rhs, code, local_scope)
|
33
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
34
|
+
code << "rb_funcall(#{@entry.c_name}, rb_intern(\"[]=\"), 2,"
|
35
|
+
code << "#{@pos.c_code(local_scope)}, #{rhs.c_code(local_scope)});"
|
36
|
+
code.nl
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class ArgDeclaration < Base
|
5
|
+
# Keep data_hash attr_reader because this node is coerced into
|
6
|
+
# specialized ArgDecl nodes in the parser.
|
7
|
+
attr_reader :data_hash
|
8
|
+
def initialize(data_hash)
|
9
|
+
@data_hash = data_hash
|
10
|
+
end
|
11
|
+
|
12
|
+
# TODO: Support array of function pointers and array in arguments.
|
13
|
+
def analyse_types(local_scope, extern: false)
|
14
|
+
var, dtype, ident, ptr_level, value = fetch_data
|
15
|
+
name = ident
|
16
|
+
c_name = Rubex::ARG_PREFIX + ident
|
17
|
+
@type = Helpers.determine_dtype(dtype, ptr_level)
|
18
|
+
value&.analyse_types(local_scope)
|
19
|
+
add_arg_to_symbol_table name, c_name, value, extern, local_scope
|
20
|
+
@has_temp = true if @type.object?
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def add_arg_to_symbol_table(name, c_name, value, extern, local_scope)
|
26
|
+
unless extern
|
27
|
+
@entry = local_scope.add_arg(name: name, c_name: c_name, type: @type, value: value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def fetch_data
|
32
|
+
var = @data_hash[:variables][0]
|
33
|
+
dtype = @data_hash[:dtype]
|
34
|
+
ident = var[:ident]
|
35
|
+
ptr_level = var[:ptr_level]
|
36
|
+
value = var[:value]
|
37
|
+
|
38
|
+
[var, dtype, ident, ptr_level, value]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
# Binary expression Base class.
|
5
|
+
class Binary < Base
|
6
|
+
include Rubex::Helpers::NodeTypeMethods
|
7
|
+
def initialize left, operator, right
|
8
|
+
@left, @operator, @right = left, operator, right
|
9
|
+
@subexprs = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def analyse_types local_scope
|
13
|
+
@left.analyse_types local_scope
|
14
|
+
@right.analyse_types local_scope
|
15
|
+
if type_of(@left).object? || type_of(@right).object?
|
16
|
+
@left = @left.to_ruby_object
|
17
|
+
@right = @right.to_ruby_object
|
18
|
+
@has_temp = true
|
19
|
+
end
|
20
|
+
@type = Rubex::Helpers.result_type_for(type_of(@left), type_of(@right))
|
21
|
+
@subexprs << @left
|
22
|
+
@subexprs << @right
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_evaluation_code code, local_scope
|
26
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
27
|
+
if @has_temp
|
28
|
+
code << "#{@c_code} = rb_funcall(#{@left.c_code(local_scope)}," +
|
29
|
+
"rb_intern(\"#{@operator}\")," +
|
30
|
+
"1, #{@right.c_code(local_scope)});"
|
31
|
+
code.nl
|
32
|
+
else
|
33
|
+
@c_code = "( #{@left.c_code(local_scope)} #{@operator} #{@right.c_code(local_scope)} )"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def c_code local_scope
|
39
|
+
super + @c_code
|
40
|
+
end
|
41
|
+
|
42
|
+
def == other
|
43
|
+
self.class == other.class && @type == other.type &&
|
44
|
+
@left == other.left && @right == other.right &&
|
45
|
+
@operator == other.operator
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def type_of expr
|
51
|
+
t = expr.type
|
52
|
+
return (t.c_function? ? t.type : t)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class BinaryBoolean < Binary
|
5
|
+
def analyse_types(local_scope)
|
6
|
+
@left.analyse_types local_scope
|
7
|
+
@right.analyse_types local_scope
|
8
|
+
if type_of(@left).object? || type_of(@right).object?
|
9
|
+
|
10
|
+
@left = @left.to_ruby_object
|
11
|
+
@right = @right.to_ruby_object
|
12
|
+
@type = Rubex::DataType::Boolean.new
|
13
|
+
@has_temp = true
|
14
|
+
else
|
15
|
+
@type = Rubex::DataType::CBoolean.new
|
16
|
+
end
|
17
|
+
@subexprs << @left
|
18
|
+
@subexprs << @right
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class BinaryBooleanSpecialOp < BinaryBoolean
|
5
|
+
def generate_evaluation_code(code, local_scope)
|
6
|
+
generate_and_dispose_subexprs(code, local_scope) do
|
7
|
+
if @has_temp
|
8
|
+
code << "#{@c_code} = " + Rubex::C_MACRO_INT2BOOL +
|
9
|
+
"(RTEST(#{@left.c_code(local_scope)}) #{@operator} " \
|
10
|
+
"RTEST(#{@right.c_code(local_scope)}));"
|
11
|
+
code.nl
|
12
|
+
else
|
13
|
+
@c_code = "#{@left.c_code(local_scope)} #{@operator} #{@right.c_code(local_scope)}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class BinaryAdd < Binary
|
5
|
+
end
|
6
|
+
|
7
|
+
class BinaryMinus < Binary
|
8
|
+
end
|
9
|
+
|
10
|
+
class BinaryMultiply < Binary
|
11
|
+
end
|
12
|
+
|
13
|
+
class BinaryDivide < Binary
|
14
|
+
end
|
15
|
+
|
16
|
+
class BinaryExpo < Binary
|
17
|
+
end
|
18
|
+
|
19
|
+
class BinaryMod < Binary
|
20
|
+
end
|
21
|
+
|
22
|
+
class BinaryAnd < Binary
|
23
|
+
end
|
24
|
+
|
25
|
+
class BinaryOr < Binary
|
26
|
+
end
|
27
|
+
|
28
|
+
class BinaryXor < Binary
|
29
|
+
end
|
30
|
+
|
31
|
+
class BinaryLShift < Binary
|
32
|
+
end
|
33
|
+
|
34
|
+
class BinaryRShift < Binary
|
35
|
+
end
|
36
|
+
|
37
|
+
class BinaryBoolEq < BinaryBoolean
|
38
|
+
end
|
39
|
+
|
40
|
+
class BinaryBoolNEq < BinaryBoolean
|
41
|
+
end
|
42
|
+
|
43
|
+
class BinaryBoolLt < BinaryBoolean
|
44
|
+
end
|
45
|
+
|
46
|
+
class BinaryBoolLtEq < BinaryBoolean
|
47
|
+
end
|
48
|
+
|
49
|
+
class BinaryBoolGt < BinaryBoolean
|
50
|
+
end
|
51
|
+
|
52
|
+
class BinaryBoolGtEq < BinaryBoolean
|
53
|
+
end
|
54
|
+
|
55
|
+
class BinaryBoolAnd < BinaryBooleanSpecialOp
|
56
|
+
end
|
57
|
+
|
58
|
+
class BinaryBoolOr < BinaryBooleanSpecialOp
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class CoerceObject < Base
|
5
|
+
attr_reader :expr
|
6
|
+
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegators :@expr, :generate_evaluation_code, :generate_disposal_code,
|
10
|
+
:generate_assignment_code, :allocate_temp, :allocate_temps,
|
11
|
+
:release_temp, :release_temps, :type
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class CommandCall < Base
|
5
|
+
def initialize(expr, command, arg_list)
|
6
|
+
@expr = expr
|
7
|
+
@command = command
|
8
|
+
@arg_list = arg_list
|
9
|
+
end
|
10
|
+
|
11
|
+
def analyse_types(local_scope)
|
12
|
+
@entry = local_scope.find(@command)
|
13
|
+
if @expr.nil? # Case for implicit 'self' when a method in the class itself is being called.
|
14
|
+
@expr = (@entry && !@entry.extern) ? Expression::Self.new : Expression::Empty.new
|
15
|
+
end
|
16
|
+
@expr.analyse_types(local_scope)
|
17
|
+
analyse_command_type local_scope
|
18
|
+
@subexprs = [@expr, @command]
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_evaluation_code(code, local_scope)
|
23
|
+
@expr.generate_evaluation_code(code, local_scope)
|
24
|
+
@command.generate_evaluation_code code, local_scope
|
25
|
+
@c_code = @command.c_code(local_scope)
|
26
|
+
end
|
27
|
+
|
28
|
+
def generate_disposal_code(code)
|
29
|
+
@expr.generate_disposal_code code
|
30
|
+
@command.generate_disposal_code code
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_assignment_code(rhs, code, local_scope)
|
34
|
+
generate_evaluation_code code, local_scope
|
35
|
+
code << "#{c_code(local_scope)} = #{rhs.c_code(local_scope)};"
|
36
|
+
code.nl
|
37
|
+
end
|
38
|
+
|
39
|
+
def c_code(local_scope)
|
40
|
+
code = super
|
41
|
+
code << @c_code
|
42
|
+
code
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def struct_member_call?
|
48
|
+
((@expr.type.cptr? && @expr.type.type.struct_or_union?) ||
|
49
|
+
@expr.type.struct_or_union?)
|
50
|
+
end
|
51
|
+
|
52
|
+
def ruby_method_call?
|
53
|
+
@entry.type.ruby_method?
|
54
|
+
end
|
55
|
+
|
56
|
+
def c_function_call?
|
57
|
+
@entry && @entry.type.base_type.c_function?
|
58
|
+
end
|
59
|
+
|
60
|
+
def analyse_command_type(local_scope)
|
61
|
+
if struct_member_call?
|
62
|
+
@command = Expression::StructOrUnionMemberCall.new @expr, @command, @arg_list
|
63
|
+
elsif c_function_call?
|
64
|
+
@command = Expression::CFunctionCall.new @expr, @command, @arg_list
|
65
|
+
else
|
66
|
+
@command = Expression::RubyMethodCall.new @expr, @command, @arg_list
|
67
|
+
end
|
68
|
+
@command.analyse_types local_scope
|
69
|
+
@type = @command.type
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|