From 0a02ad5e2e2cdd7e3dcb33f40eae056a8dfdc639 Mon Sep 17 00:00:00 2001 From: ko1 Date: Sun, 19 Aug 2007 04:16:13 +0000 Subject: [PATCH] * compile.c (iseq_compile_each/NODE_RESBODY): fix to add additional nop to prevent tailcall optimization. * vm_opts.h: clean up comments. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13112 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ compile.c | 3 +++ vm_opts.h | 29 ++++++++++++++++------------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3ca2261b31..836e15c2df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sun Aug 19 13:13:52 2007 Koichi Sasada + + * compile.c (iseq_compile_each/NODE_RESBODY): fix to add + additional nop to prevent tailcall optimization. + + * vm_opts.h: clean up comments. + Sun Aug 19 12:58:39 2007 Koichi Sasada * insnhelper.ci (vm_call_bmethod): fix to propagate information diff --git a/compile.c b/compile.c index a5e997bd92..6e9caba554 100644 --- a/compile.c +++ b/compile.c @@ -3119,6 +3119,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) ADD_INSNL(ret, nd_line(node), jump, label_miss); ADD_LABEL(ret, label_hit); COMPILE(ret, "resbody body", resq->nd_body); + if (iseq->compile_data->option->tailcall_optimization) { + ADD_INSN(ret, nd_line(node), nop); + } ADD_INSN(ret, nd_line(node), leave); ADD_LABEL(ret, label_miss); resq = resq->nd_head; diff --git a/vm_opts.h b/vm_opts.h index 32b00ac79a..dbb3d5c87a 100644 --- a/vm_opts.h +++ b/vm_opts.h @@ -14,31 +14,34 @@ #ifndef VM_OPTS_H_INCLUDED #define VM_OPTS_H_INCLUDED +/* Compile options. + * You can change these options at runtime by VM::CompileOption. + * Following definitions are default values. + */ + +#define OPT_TRACE_INSTRUCTION 0 +#define OPT_TAILCALL_OPTIMIZATION 0 +#define OPT_PEEPHOLE_OPTIMIZATION 1 +#define OPT_SPECIALISED_INSTRUCTION 1 +#define OPT_INLINE_CONST_CACHE 1 + + +/* Build Options. + * You can't change these options at runtime. + */ + /* C compiler depend */ #define OPT_DIRECT_THREADED_CODE 1 #define OPT_CALL_THREADED_CODE 0 -/* architecture independent */ - /* VM running option */ #define OPT_CHECKED_RUN 1 -#define OPT_TRACE_INSTRUCTION 0 /* default value */ - -/* at compile */ -#define OPT_INLINE_CONST_CACHE 1 -#define OPT_TAILCALL_OPTIMIZATION 0 /* default value */ -#define OPT_PEEPHOLE_OPTIMIZATION 1 -#define OPT_SPECIALISED_INSTRUCTION 1 - -/* at runtime */ #define OPT_INLINE_METHOD_CACHE 1 #define OPT_BLOCKINLINING 0 /* architecture independent, affects generated code */ #define OPT_OPERANDS_UNIFICATION 0 #define OPT_INSTRUCTIONS_UNIFICATION 0 - -/* code generation parameter */ #define OPT_UNIFY_ALL_COMBINATION 0 #define OPT_STACK_CACHING 0