[前][次][番号順一覧][スレッド一覧]

ruby-changes:59228

From: Koichi <ko1@a...>
Date: Fri, 13 Dec 2019 17:59:40 +0900 (JST)
Subject: [ruby-changes:59228] 97a17a51b8 (master): readable function names for inline functions.

https://git.ruby-lang.org/ruby.git/commit/?id=97a17a51b8

From 97a17a51b8e6eca31fd6421511f1907e6e95b415 Mon Sep 17 00:00:00 2001
From: Koichi Sasada <ko1@a...>
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.

diff --git a/builtin.h b/builtin.h
index 0d2b13e..f4d485e 100644
--- a/builtin.h
+++ b/builtin.h
@@ -13,7 +13,12 @@ struct rb_builtin_function { https://github.com/ruby/ruby/blob/trunk/builtin.h#L13
     const char * const name;
 };
 
-#define RB_BUILTIN_FUNCTION(_i, _name, _arity) { .name = #_name, .func_ptr = (void *)_name, .argc = _arity, .index = _i }
+#define RB_BUILTIN_FUNCTION(_i, _name, _fname, _arity) { \
+  .name = #_name, \
+  .func_ptr = (void *)_fname, \
+  .argc = _arity, \
+  .index = _i \
+}
 
 void rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table);
 
diff --git a/compile.c b/compile.c
index d8fff33..1e64004 100644
--- a/compile.c
+++ b/compile.c
@@ -6954,7 +6954,7 @@ compile_call(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, in https://github.com/ruby/ruby/blob/trunk/compile.c#L6954
                     strcmp("cexpr!", builtin_func) == 0) {
                   inlinec:;
                     int inline_index = GET_VM()->builtin_inline_index++;
-                    snprintf(inline_func, 0x20, "builtin_inline%d", inline_index);
+                    snprintf(inline_func, 0x20, "_bi%d", inline_index);
                     builtin_func = inline_func;
                     args_node = NULL;
                     goto retry;
diff --git a/mini_builtin.c b/mini_builtin.c
index 3db640c..ad289bf 100644
--- a/mini_builtin.c
+++ b/mini_builtin.c
@@ -18,8 +18,10 @@ builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *ta https://github.com/ruby/ruby/blob/trunk/mini_builtin.c#L18
 {
     VALUE name_str = 0;
     rb_ast_t *ast = rb_builtin_ast(feature_name, &name_str);
+    rb_vm_t *vm = GET_VM();
 
-    GET_VM()->builtin_function_table = table;
+    vm->builtin_function_table = table;
+    vm->builtin_inline_index = 0;
     const rb_iseq_t *iseq = rb_iseq_new(&ast->body, name_str, name_str, Qnil, NULL, ISEQ_TYPE_TOP);
     GET_VM()->builtin_function_table = NULL;
 
diff --git a/tool/mk_builtin_loader.rb b/tool/mk_builtin_loader.rb
index 5419c11..b7d7c17 100644
--- a/tool/mk_builtin_loader.rb
+++ b/tool/mk_builtin_loader.rb
@@ -5,7 +5,37 @@ def inline_text argc, prev_insn https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L5
   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 https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L57
     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 https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L65
           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 https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L113
   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 https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L131
     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 https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L167
     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 https://github.com/ruby/ruby/blob/trunk/tool/mk_builtin_loader.rb#L179
     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 v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]