diff options
| author | realtradam <[email protected]> | 2022-03-10 02:36:43 -0500 |
|---|---|---|
| committer | realtradam <[email protected]> | 2022-03-10 02:36:43 -0500 |
| commit | 39db5fbee576ad02da3d1c07dd63c0183829be0d (patch) | |
| tree | 37b478715dcc3da7f0996f218d046f1b2092a149 | |
| parent | c2450b53b7c197332d25a76eceafd7f5f80e8f24 (diff) | |
| download | FelBind-39db5fbee576ad02da3d1c07dd63c0183829be0d.tar.gz FelBind-39db5fbee576ad02da3d1c07dd63c0183829be0d.zip | |
refactor built in type detection
| -rw-r--r-- | generate.rb | 98 | ||||
| -rw-r--r-- | templates.rb | 49 |
2 files changed, 91 insertions, 56 deletions
diff --git a/generate.rb b/generate.rb index f94e0ec..38edd9c 100644 --- a/generate.rb +++ b/generate.rb @@ -19,6 +19,9 @@ end.parse! options[:glue] ||= './glue.json' glue = JSON.parse(File.read(options[:glue])) +# configuration +Tplt.treated_as_int |= ['unsigned char'] + $phase1 = {} $phase2 = {} $phase3 = {} @@ -47,7 +50,7 @@ init_body = "" # convert types -# need to make this built in +# TODO need to make this built in # functionality(with scanner + generator) glue.first.keys.each do |k| rpart = k.rpartition(' ') @@ -103,9 +106,16 @@ end # generates structs +# TODO +# Auto generate struct accessors +# glue.last.each do |struct, params| defines += Tplt.init_struct_wrapper(struct) init_body += Tplt.init_class(struct, 'test') + + params.each do |param| + #puts param + end end # generates functions @@ -118,7 +128,12 @@ glue.first.each do |func, params| func_datatype = rpart.first func_name = rpart.last - next if ['long', 'void *'].include? func_datatype + # TODO: just treat longs and shorts as ints + # + # since void * can be anything just skip functions + # (by default) that use it + next if ['void *'].include? func_datatype + # if phase 1 or 2 if (func_datatype == 'void' && params[0] == 'void') || ((Tplt.non_struct_types.include? func_datatype) && (params[0] == 'void')) @@ -139,54 +154,49 @@ glue.first.each do |func, params| end end if no_struct_param - if true# Tplt.non_struct_types.include? func.rpartition(' ').first - #$phase3[func] = params - # --- - body = '' - #body = Tplt.return_format(func, params) - init_var_body = '' - init_array_body = '' - unwrapped_kwargs = '' - params.each_with_index do |param, index| - temp = param - temp_rpart = temp.rpartition(' ') - if temp_rpart.first == 'const char *' - temp = 'char *' + temp_rpart.last - end - init_var_body += temp + ";\n" - init_array_body += "mrb_intern_lit(mrb, \"#{temp_rpart.last}\"),\n" - unwrapped_kwargs += Tplt.unwrap_kwarg(index, "#{temp_rpart.last} = #{Tplt.to_c(temp_rpart.first, "kw_values[#{index}]")};", nil, "#{temp_rpart.last} Argument Missing") - end - - # if return isnt regular types, add struct to init - unless Tplt.non_struct_types.include? func_datatype - init_var_body += "#{func_datatype} *return_value = {0};\n" + #if true# Tplt.non_struct_types.include? func.rpartition(' ').first + #$phase3[func] = params + # --- + body = '' + #body = Tplt.return_format(func, params) + init_var_body = '' + init_array_body = '' + unwrapped_kwargs = '' + params.each_with_index do |param, index| + temp = param + temp_rpart = temp.rpartition(' ') + if temp_rpart.first == 'const char *' + temp = 'char *' + temp_rpart.last end + init_var_body += temp + ";\n" + init_array_body += "mrb_intern_lit(mrb, \"#{temp_rpart.last}\"),\n" + unwrapped_kwargs += Tplt.unwrap_kwarg(index, "#{temp_rpart.last} = #{Tplt.to_c(temp_rpart.first, "kw_values[#{index}]")};", nil, "#{temp_rpart.last} Argument Missing") + end - body = Tplt.get_kwargs(params.length, init_var_body, init_array_body) - body += unwrapped_kwargs + # if return isnt regular types, add struct to init + unless Tplt.non_struct_types.include? func_datatype + init_var_body += "#{func_datatype} *return_value = {0};\n" + end - # if return isnt regular types, use struct return format - if Tplt.non_struct_types.include? func_datatype - body += Tplt.return_format(func, params) - else - body += Tplt.get_module('Test') - body += Tplt.get_class(func_datatype, 'test') - body += Tplt.return_format_struct(func) - end + body = Tplt.get_kwargs(params.length, init_var_body, init_array_body) + body += unwrapped_kwargs - defines += "\n//#{func}" - defines += Tplt.function(func_name, body) - init_body += Tplt.init_module_function('test', Tplt.rubify_func_name(func_name), func_name, "MRB_ARGS_OPT(1)") # opt stuff isnt correct, need to look at this again - # --- - #puts func - debug_mark_binding(func, params) + # if return isnt regular types, use struct return format + if Tplt.non_struct_types.include? func_datatype + body += Tplt.return_format(func, params) else - #puts func - #puts params - #puts '---' - #$phase4[func] = params + body += Tplt.get_module('Test') + body += Tplt.get_class(func_datatype, 'test') + body += Tplt.return_format_struct(func) end + + defines += "\n//#{func}" + defines += Tplt.function(func_name, body) + init_body += Tplt.init_module_function('test', Tplt.rubify_func_name(func_name), func_name, "MRB_ARGS_OPT(1)") # opt stuff isnt correct, need to look at this again + # --- + #puts func + debug_mark_binding(func, params) + #end else #$phase5[func] = params end diff --git a/templates.rb b/templates.rb index 4b01897..981d79c 100644 --- a/templates.rb +++ b/templates.rb @@ -14,8 +14,33 @@ mrb_mruby_#{gem_name}_gem_final(mrb_state* mrb) { } end + attr_writer :treated_as_int + def treated_as_int + @treated_as_int ||= ['int', 'unsigned int', 'long', 'short'] + end + + attr_writer :treated_as_bool + def treated_as_bool + @treated_as_bool ||= ['bool'] + end + + attr_writer :treated_as_float + def treated_as_float + @treated_as_float ||= ['float', 'double'] + end + + attr_writer :treated_as_string + def treated_as_string + @treated_as_string ||= ['char *', 'const char *'] + end + + attr_writer :treated_as_void + def treated_as_void + @treated_as_void ||= ['void'] + end + def non_struct_types - @non_struct_types ||= ['bool', 'int', 'float', 'double', 'float', 'char *', 'const char *', 'unsigned int', 'void'] + treated_as_int | treated_as_bool | treated_as_float | treated_as_string | treated_as_void end def init_module(module_name) @@ -92,8 +117,8 @@ if (mrb_undef_p(kw_values[#{kwarg_iter}])) { def wrap_struct(var_name, target, mrb_type, type) %{ -#{var_name} = (#{type} *)DATA_PTR(#{target}) -if(#{var_name}) #{'{'} mrb_free(mrb, #{var_name}); #{'}'} + #{var_name} = (#{type} *)DATA_PTR(#{target}) + if(#{var_name}) #{'{'} mrb_free(mrb, #{var_name}); #{'}'} mrb_data_init(#{target}, NULL, &#{mrb_type}); #{var_name} = (#{type} *)mrb_malloc(mrb, sizeof(#{type})); } @@ -106,26 +131,26 @@ mrb_data_init(#{target}, NULL, &#{mrb_type}); # for converting mrb to C def to_c(type, variable) - if (type == 'int') || (type == 'unsigned int') || (type == 'bool') + if treated_as_int.include?(type) || treated_as_bool.include?(type) "mrb_as_int(mrb, #{variable})" - elsif (type == 'float') || (type == 'double') + elsif treated_as_float.include? type "mrb_as_float(mrb, #{variable})" - elsif (type == 'const char *') || (type == 'char *') + elsif treated_as_string.include? type "mrb_str_to_cstr(mrb, #{variable})" end end # for converting C to mrb def to_mrb(type, variable) - if (type == 'int') || (type == 'unsigned int') + if treated_as_int.include? type "mrb_fixnum_value(#{variable})" - elsif (type == 'float') || (type == 'double') + elsif treated_as_float.include? type "mrb_float_value(mrb, #{variable})" - elsif type == 'bool' + elsif treated_as_bool.include? type "mrb_bool_value(#{variable})" - elsif (type == 'const char *') || (type == 'char *') + elsif treated_as_string.include? type "mrb_str_new_cstr(mrb, #{variable})" - elsif type == 'NULL' + elsif treated_as_void.include? type 'mrb_nil_value()' end end @@ -205,7 +230,7 @@ mrb_free(mrb, ptr); } } end - } + } } end |
