1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
module Tplt # Template
class << self
def base(gem_name, init_body, final_body)
%{
void
mrb_mruby_#{gem_name}_gem_init(mrb_state* mrb) {
#{init_body}
}
void
mrb_mruby_#{gem_name}_gem_final(mrb_state* mrb) {
#{final_body}
}
}
end
def init_module_function(module_name, function_name, mrb_function_name, mrb_args)
%{
mrb_define_module_function(mrb, #{module_name}, "#{function_name}", mrb_#{mrb_function_name}, #{mrb_args});
}
end
def function(function_name, body)
%{
static mrb_value
mrb_#{function_name}(mrb_state* mrb, mrb_value self) {
#{body}
}
}
end
def init_function(class_name, function_name, mrb_function_name, mrb_args)
%{mrb_define_method(mrb, #{class_name}, "#{function_name}", mrb_#{mrb_function_name}, #{mrb_args});
}
end
def get_kwargs(kwarg_num, init_var_body, init_array_body)
%{
#{init_var_body}
uint32_t kw_num = #{kwarg_num};
const mrb_sym kw_names[] = {
#{init_array_body}
};
mrb_value kw_values[kw_num];
const mrb_kwargs kwargs = { kw_num, 0, kw_names, kw_values, NULL };
mrb_get_args(mrb, "|:", &kwargs);
}
end
def unwrap_kwarg(kwarg_iter, body_if_defined, body_if_undefined = nil, no_argument_error_message = 'Missing Keyword Argument')
%{
if (mrb_undef_p(kw_values[#{kwarg_iter}])) {
#{body_if_undefined || "mrb_load_string(mrb, \"raise ArgumentError.new \\\"#{no_argument_error_message}\\\"\");"}
} else {
#{body_if_defined}
}
}
end
def unwrap_struct(var_name, target, mrb_type, type)
%{#{var_name} = DATA_GET_PTR(mrb, #{target}, &#{mrb_type}, #{type})}
end
def define_module(module_name)
%{struct RClass *#{module_name.downcase} = mrb_define_module(mrb, "#{module_name}");
}
end
# for converting mrb to C
def to_c(type, variable)
if (type == 'int') || (type == 'unsigned int') || (type == 'bool')
"mrb_as_int(mrb, #{variable})"
elsif (type == 'float') || (type == 'double')
"mrb_as_float(mrb, #{variable})"
elsif (type == 'const char *') || (type == 'char *')
"mrb_str_to_cstr(mrb, #{variable})"
end
end
# for converting C to mrb
def to_mrb(type, variable)
if (type == 'int') || (type == 'unsigned int')
"mrb_fixnum_value(#{variable})"
elsif (type == 'float') || (type == 'double')
"mrb_float_value(mrb, #{variable})"
elsif type == 'bool'
"mrb_bool_value(#{variable})"
elsif (type == 'const char *') || (type == 'char *')
"mrb_str_new_cstr(mrb, #{variable})"
elsif type == 'NULL'
'mrb_nil_value()'
end
end
end
end
|