From 97a17a51b8e6eca31fd6421511f1907e6e95b415 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Fri, 13 Dec 2019 17:26:12 +0900 Subject: readable function names for inline functions. Now, C functions written by __builtin_cexpr!(code) and others are named as "__builtin_inline#{n}". However, it is difficult to know what the function is. This patch rename them into "__builtin_foo_#{lineno}" when cexpr! is in 'foo' method. --- tool/mk_builtin_loader.rb | 72 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 20 deletions(-) (limited to 'tool') diff --git a/tool/mk_builtin_loader.rb b/tool/mk_builtin_loader.rb index 5419c1167f..b7d7c17291 100644 --- a/tool/mk_builtin_loader.rb +++ b/tool/mk_builtin_loader.rb @@ -5,7 +5,37 @@ def inline_text argc, prev_insn prev_insn[1].rstrip end -def collect_builtin base, iseq_ary, bs, inlines +def make_cfunc_name inlines, name, lineno + case name + when /\[\]/ + name = '_GETTER' + when /\[\]=/ + name = '_SETTER' + else + name = name.tr('!?', 'EP') + end + + base = "builtin_inline_#{name}_#{lineno}" + if inlines[base] + 1000.times{|i| + name = "#{base}_#{i}" + return name unless inlines[name] + } + raise "too many functions in same line..." + else + base + end +end + +def collect_builtin base, iseq_ary, name, bs, inlines + case type = iseq_ary[9] + when :method + name = iseq_ary[5] + when :class + name = 'class' + else + end + code = iseq_ary[13] params = iseq_ary[10] prev_insn = nil @@ -27,7 +57,7 @@ def collect_builtin base, iseq_ary, bs, inlines when :send ci = insn[1] if /\A__builtin_(.+)/ =~ ci[:mid] - func_name = $1 + cfunc_name = func_name = $1 argc = ci[:orig_argc] if /(.+)\!\z/ =~ func_name @@ -35,37 +65,39 @@ def collect_builtin base, iseq_ary, bs, inlines when 'cstmt' text = inline_text argc, prev_insn - func_name = "builtin_inline#{inlines.size}" - inlines << [func_name, [lineno, text, params]] + func_name = "_bi#{inlines.size}" + cfunc_name = make_cfunc_name(inlines, name, lineno) + inlines[cfunc_name] = [lineno, text, params, func_name] argc -= 1 - when 'cexpr', 'cconst' text = inline_text argc, prev_insn code = "return #{text};" - func_name = "builtin_inline#{inlines.size}" + func_name = "_bi#{inlines.size}" + cfunc_name = make_cfunc_name(inlines, name, lineno) + params = [] if $1 == 'cconst' - inlines << [func_name, [lineno, code, params]] + inlines[cfunc_name] = [lineno, code, params, func_name] argc -= 1 when 'cinit' text = inline_text argc, prev_insn func_name = nil - inlines << [nil, [lineno, text, nil]] + inlines[inlines.size] = [nil, [lineno, text, nil, nil]] argc -= 1 end end if bs[func_name] && - bs[func_name] != argc + bs[func_name] != [argc, cfunc_name] raise "same builtin function \"#{func_name}\", but different arity (was #{bs[func_name]} but #{argc})" end - bs[func_name] = argc if func_name + bs[func_name] = [argc, cfunc_name] if func_name end else insn[1..-1].each{|op| if op.is_a?(Array) && op[0] == "YARVInstructionSequence/SimpleDataFormat" - collect_builtin base, op, bs, inlines + collect_builtin base, op, name, bs, inlines end } end @@ -81,7 +113,7 @@ def mk_builtin_header file ofile = "#{file}inc" # bs = { func_name => argc } - collect_builtin(base, RubyVM::InstructionSequence.compile_file(file, false).to_a, bs = {}, inlines = []) + collect_builtin(base, RubyVM::InstructionSequence.compile_file(file, false).to_a, 'top', bs = {}, inlines = {}) begin f = open(ofile, 'w') @@ -99,9 +131,9 @@ def mk_builtin_header file lineno = 6 line_file = file.gsub('\\', '/') - inlines.each{|name, (body_lineno, text, params)| - if name - f.puts "static VALUE #{name}(rb_execution_context_t *ec, const VALUE self) {" + inlines.each{|cfunc_name, (body_lineno, text, params, func_name)| + if String === cfunc_name + f.puts "static VALUE #{cfunc_name}(rb_execution_context_t *ec, const VALUE self) {" lineno += 1 params.reverse_each.with_index{|param, i| @@ -135,10 +167,10 @@ def mk_builtin_header file table = "#{base}_table" f.puts " // table definition" f.puts " static const struct rb_builtin_function #{table}[] = {" - bs.each.with_index{|(func, argc), i| - f.puts " RB_BUILTIN_FUNCTION(#{i}, #{func}, #{argc})," + bs.each.with_index{|(func, (argc, cfunc_name)), i| + f.puts " RB_BUILTIN_FUNCTION(#{i}, #{func}, #{cfunc_name}, #{argc})," } - f.puts " RB_BUILTIN_FUNCTION(-1, NULL, 0)," + f.puts " RB_BUILTIN_FUNCTION(-1, NULL, NULL, 0)," f.puts " };" f.puts @@ -147,8 +179,8 @@ def mk_builtin_header file f.puts "#if GCC_VERSION_SINCE(5, 1, 0) || __clang__" f.puts "COMPILER_WARNING_ERROR(-Wincompatible-pointer-types)" f.puts "#endif" - bs.each{|func, argc| - f.puts " if (0) rb_builtin_function_check_arity#{argc}(#{func});" + bs.each{|func, (argc, cfunc_name)| + f.puts " if (0) rb_builtin_function_check_arity#{argc}(#{cfunc_name});" } f.puts "COMPILER_WARNING_POP" -- cgit v1.2.3