summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common.mk4
-rw-r--r--template/call_iseq_optimized.inc.tmpl68
-rw-r--r--tool/mk_call_iseq_optimized.rb73
3 files changed, 70 insertions, 75 deletions
diff --git a/common.mk b/common.mk
index 811ccf0851..053b9b4f69 100644
--- a/common.mk
+++ b/common.mk
@@ -1085,9 +1085,9 @@ known_errors.inc: $(srcdir)/template/known_errors.inc.tmpl $(srcdir)/defs/known_
$(ECHO) generating $@
$(Q) $(BASERUBY) $(tooldir)/generic_erb.rb -c -o $@ $(srcdir)/template/known_errors.inc.tmpl $(srcdir)/defs/known_errors.def
-vm_call_iseq_optimized.inc: $(tooldir)/mk_call_iseq_optimized.rb
+vm_call_iseq_optimized.inc: $(srcdir)/template/call_iseq_optimized.inc.tmpl
$(ECHO) generating $@
- $(Q) $(BASERUBY) $(tooldir)/mk_call_iseq_optimized.rb > $@
+ $(Q) $(BASERUBY) $(tooldir)/generic_erb.rb -c -o $@ $<
$(MINIPRELUDE_C): $(COMPILE_PRELUDE) $(BUILTIN_RB_SRCS)
$(ECHO) generating $@
diff --git a/template/call_iseq_optimized.inc.tmpl b/template/call_iseq_optimized.inc.tmpl
new file mode 100644
index 0000000000..f8883a1d95
--- /dev/null
+++ b/template/call_iseq_optimized.inc.tmpl
@@ -0,0 +1,68 @@
+/* -*- c -*- */
+% P = (0..3)
+% L = (0..5)
+%
+% def fname param, local
+% "vm_call_iseq_setup_normal_0start_#{param}params_#{local}locals"
+% end
+#if 1 /* enable or disable this optimization */
+
+/* DO NOT EDIT THIS FILE DIRECTLY
+ *
+ * This file is generated by tool/generic_erb.rb
+ * with template/call_iseq_optimized.inc.tmpl
+ */
+
+% P.each{|param|
+% L.each{|local|
+static VALUE
+<%= fname(param, local) %>(rb_execution_context_t *ec, rb_control_frame_t *cfp, struct rb_calling_info *calling, struct rb_call_data *cd)
+{
+ RB_DEBUG_COUNTER_INC(ccf_iseq_fix);
+ return vm_call_iseq_setup_normal(ec, cfp, calling, vm_cc_cme(cd->cc), 0, <%= param %>, <%= local %>);
+}
+
+% }
+% }
+/* vm_call_iseq_handlers[param][local] */
+static const vm_call_handler vm_call_iseq_handlers[][<%= L.to_a.size %>] = {
+% P.each{|param|
+ {
+% L.each{|local|
+ <%= fname(param, local) %>,
+% }
+ },
+% }
+};
+
+static inline vm_call_handler
+vm_call_iseq_setup_func(const struct rb_callinfo *ci, const int param_size, const int local_size)
+{
+ if (UNLIKELY(vm_ci_flag(ci) & VM_CALL_TAILCALL)) {
+ return &vm_call_iseq_setup_tailcall_0start;
+ }
+ else if (0) { /* to disable optimize */
+ return &vm_call_iseq_setup_normal_0start;
+ }
+ else if (param_size <= <%= P.end %> && local_size <= <%= L.end %>) {
+ VM_ASSERT(local_size >= 0);
+ return vm_call_iseq_handlers[param_size][local_size];
+ }
+ else {
+ return &vm_call_iseq_setup_normal_0start;
+ }
+}
+
+#else
+
+static inline vm_call_handler
+vm_call_iseq_setup_func(const struct rb_callinfo *ci, const int param_size, const int local_size)
+{
+ if (UNLIKELY(vm_ci_flag(ci) & VM_CALL_TAILCALL)) {
+ return &vm_call_iseq_setup_tailcall_0start;
+ }
+ else {
+ return &vm_call_iseq_setup_normal_0start;
+ }
+}
+#endif
diff --git a/tool/mk_call_iseq_optimized.rb b/tool/mk_call_iseq_optimized.rb
deleted file mode 100644
index 448d44039f..0000000000
--- a/tool/mk_call_iseq_optimized.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-
-puts <<EOS
-/* -*- c -*- */
-#if 1 /* enable or disable this optimization */
-
-/* DO NOT EDIT THIS FILE DIRECTLY
- *
- * This file is generated by tool/mk_call_iseq_optimized.rb
- */
-
-EOS
-
-P = (0..3)
-L = (0..5)
-
-def fname param, local
- "vm_call_iseq_setup_normal_0start_#{param}params_#{local}locals"
-end
-
-P.each{|param|
- L.each{|local|
- puts <<EOS
-static VALUE
-#{fname(param, local)}(rb_execution_context_t *ec, rb_control_frame_t *cfp, struct rb_calling_info *calling, struct rb_call_data *cd)
-{
- RB_DEBUG_COUNTER_INC(ccf_iseq_fix);
- return vm_call_iseq_setup_normal(ec, cfp, calling, vm_cc_cme(cd->cc), 0, #{param}, #{local});
-}
-
-EOS
- #
- }
-}
-
-puts <<EOS
-/* vm_call_iseq_handlers[param][local] */
-static const vm_call_handler vm_call_iseq_handlers[][#{L.to_a.size}] = {
-#{P.map{|param| '{' + L.map{|local| fname(param, local)}.join(",\n ") + '}'}.join(",\n")}
-};
-
-static inline vm_call_handler
-vm_call_iseq_setup_func(const struct rb_callinfo *ci, const int param_size, const int local_size)
-{
- if (UNLIKELY(vm_ci_flag(ci) & VM_CALL_TAILCALL)) {
- return &vm_call_iseq_setup_tailcall_0start;
- }
- else if (0) { /* to disable optimize */
- return &vm_call_iseq_setup_normal_0start;
- }
- else {
- if (param_size <= #{P.end} &&
- local_size <= #{L.end}) {
- VM_ASSERT(local_size >= 0);
- return vm_call_iseq_handlers[param_size][local_size];
- }
- return &vm_call_iseq_setup_normal_0start;
- }
-}
-
-#else
-
-static inline vm_call_handler
-vm_call_iseq_setup_func(const struct rb_callinfo *ci, const int param_size, const int local_size)
-{
- if (UNLIKELY(vm_ci_flag(ci) & VM_CALL_TAILCALL)) {
- return &vm_call_iseq_setup_tailcall_0start;
- }
- else {
- return &vm_call_iseq_setup_normal_0start;
- }
-}
-#endif
-EOS