2006-12-31 18:02:22 +03:00
|
|
|
/**********************************************************************
|
|
|
|
|
|
|
|
insnhelper.h - helper macros to implement each instructions
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
created at: 04/01/01 15:50:34 JST
|
|
|
|
|
* blockinlining.c, compile.c, compile.h, debug.c, debug.h,
id.c, insnhelper.h, insns.def, thread.c, thread_pthread.ci,
thread_pthread.h, thread_win32.ci, thread_win32.h, vm.h,
vm_dump.c, vm_evalbody.ci, vm_opts.h: fix comments and
copyright year.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13920 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-11-14 01:13:04 +03:00
|
|
|
Copyright (C) 2004-2007 Koichi Sasada
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
2008-01-18 11:56:11 +03:00
|
|
|
#ifndef RUBY_INSNHELPER_H
|
|
|
|
#define RUBY_INSNHELPER_H
|
2006-12-31 18:02:22 +03:00
|
|
|
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
/**
|
|
|
|
* VM Debug Level
|
|
|
|
*
|
|
|
|
* debug level:
|
|
|
|
* 0: no debug output
|
|
|
|
* 1: show instruction name
|
|
|
|
* 2: show stack frame when control stack frame is changed
|
|
|
|
* 3: show stack status
|
|
|
|
* 4: show register
|
|
|
|
* 5:
|
|
|
|
* 10: gc check
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef VMDEBUG
|
|
|
|
#define VMDEBUG 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
#undef VMDEBUG
|
|
|
|
#define VMDEBUG 3
|
|
|
|
#endif
|
|
|
|
|
2008-10-12 07:28:49 +04:00
|
|
|
enum {
|
|
|
|
BOP_PLUS,
|
|
|
|
BOP_MINUS,
|
|
|
|
BOP_MULT,
|
|
|
|
BOP_DIV,
|
|
|
|
BOP_MOD,
|
|
|
|
BOP_EQ,
|
2009-08-12 09:55:06 +04:00
|
|
|
BOP_EQQ,
|
2008-10-12 07:28:49 +04:00
|
|
|
BOP_LT,
|
|
|
|
BOP_LE,
|
|
|
|
BOP_LTLT,
|
|
|
|
BOP_AREF,
|
|
|
|
BOP_ASET,
|
|
|
|
BOP_LENGTH,
|
2009-09-06 12:39:57 +04:00
|
|
|
BOP_SIZE,
|
2012-09-26 13:34:46 +04:00
|
|
|
BOP_EMPTY_P,
|
2008-10-12 07:28:49 +04:00
|
|
|
BOP_SUCC,
|
|
|
|
BOP_GT,
|
|
|
|
BOP_GE,
|
|
|
|
BOP_NOT,
|
|
|
|
BOP_NEQ,
|
2013-09-26 11:39:48 +04:00
|
|
|
BOP_MATCH,
|
2008-10-12 07:28:49 +04:00
|
|
|
|
2008-12-09 07:25:54 +03:00
|
|
|
BOP_LAST_
|
2008-10-12 07:28:49 +04:00
|
|
|
};
|
|
|
|
|
2013-09-26 11:39:48 +04:00
|
|
|
extern short ruby_vm_redefined_flag[BOP_LAST_];
|
2009-01-15 18:31:43 +03:00
|
|
|
extern VALUE ruby_vm_const_missing_count;
|
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2008-09-23 04:20:28 +04:00
|
|
|
|
2012-11-22 10:28:17 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
2012-10-04 16:31:05 +04:00
|
|
|
#define COLLECT_USAGE_INSN(insn) vm_collect_usage_insn(insn)
|
|
|
|
#define COLLECT_USAGE_OPERAND(insn, n, op) vm_collect_usage_operand((insn), (n), ((VALUE)(op)))
|
* probes.d: add DTrace probe declarations. [ruby-core:27448]
* array.c (empty_ary_alloc, ary_new): added array create DTrace probe.
* compile.c (rb_insns_name): allowing DTrace probes to access
instruction sequence name.
* Makefile.in: translate probes.d file to appropriate header file.
* common.mk: declare dependencies on the DTrace header.
* configure.in: add a test for existence of DTrace.
* eval.c (setup_exception): add a probe for when an exception is
raised.
* gc.c: Add DTrace probes for mark begin and end, and sweep begin and
end.
* hash.c (empty_hash_alloc): Add a probe for hash allocation.
* insns.def: Add probes for function entry and return.
* internal.h: function declaration for compile.c change.
* load.c (rb_f_load): add probes for `load` entry and exit, require
entry and exit, and wrapping search_required for load path search.
* object.c (rb_obj_alloc): added a probe for general object creation.
* parse.y (yycompile0): added a probe around parse and compile phase.
* string.c (empty_str_alloc, str_new): DTrace probes for string
allocation.
* test/dtrace/*: tests for DTrace probes.
* vm.c (vm_invoke_proc): add probes for function return on exception
raise, hash create, and instruction sequence execution.
* vm_core.h: add probe declarations for function entry and exit.
* vm_dump.c: add probes header file.
* vm_eval.c (vm_call0_cfunc, vm_call0_cfunc_with_frame): add probe on
function entry and return.
* vm_exec.c: expose instruction number to instruction name function.
* vm_insnshelper.c: add function entry and exit probes for cfunc
methods.
* vm_insnhelper.h: vm usage information is always collected, so
uncomment the functions.
12 19:14:50 2012 Akinori MUSHA <knu@iDaemons.org>
* configure.in (isinf, isnan): isinf() and isnan() are macros on
DragonFly which cannot be found by AC_REPLACE_FUNCS(). This
workaround enforces the fact that they exist on DragonFly.
12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-13 01:52:12 +04:00
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
#define COLLECT_USAGE_REGISTER(reg, s) vm_collect_usage_register((reg), (s))
|
|
|
|
#else
|
2012-11-22 10:28:17 +04:00
|
|
|
#define COLLECT_USAGE_INSN(insn) /* none */
|
|
|
|
#define COLLECT_USAGE_OPERAND(insn, n, op) /* none */
|
2012-10-04 16:31:05 +04:00
|
|
|
#define COLLECT_USAGE_REGISTER(reg, s) /* none */
|
|
|
|
#endif
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
/* deal with stack */
|
|
|
|
/**********************************************************/
|
|
|
|
|
|
|
|
#define PUSH(x) (SET_SV(x), INC_SP(1))
|
|
|
|
#define TOPN(n) (*(GET_SP()-(n)-1))
|
2007-06-05 21:39:52 +04:00
|
|
|
#define POPN(n) (DEC_SP(n))
|
|
|
|
#define POP() (DEC_SP(1))
|
2007-06-01 08:05:46 +04:00
|
|
|
#define STACK_ADDR_FROM_TOP(n) (GET_SP()-(n))
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
#define GET_TOS() (tos) /* dummy */
|
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
/* deal with registers */
|
|
|
|
/**********************************************************/
|
|
|
|
|
|
|
|
#define REG_CFP (reg_cfp)
|
|
|
|
#define REG_PC (REG_CFP->pc)
|
|
|
|
#define REG_SP (REG_CFP->sp)
|
2012-06-11 07:14:59 +04:00
|
|
|
#define REG_EP (REG_CFP->ep)
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2007-06-24 14:33:00 +04:00
|
|
|
#define RESTORE_REGS() do { \
|
2006-12-31 18:02:22 +03:00
|
|
|
REG_CFP = th->cfp; \
|
2007-06-24 14:33:00 +04:00
|
|
|
} while (0)
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
#define REG_A reg_a
|
|
|
|
#define REG_B reg_b
|
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
enum vm_regan_regtype {
|
|
|
|
VM_REGAN_PC = 0,
|
|
|
|
VM_REGAN_SP = 1,
|
|
|
|
VM_REGAN_EP = 2,
|
|
|
|
VM_REGAN_CFP = 3,
|
|
|
|
VM_REGAN_SELF = 4,
|
|
|
|
VM_REGAN_ISEQ = 5,
|
|
|
|
};
|
|
|
|
enum vm_regan_acttype {
|
|
|
|
VM_REGAN_ACT_GET = 0,
|
|
|
|
VM_REGAN_ACT_SET = 1,
|
|
|
|
};
|
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
#if VM_COLLECT_USAGE_DETAILS
|
|
|
|
#define COLLECT_USAGE_REGISTER_HELPER(a, b, v) \
|
|
|
|
(COLLECT_USAGE_REGISTER((VM_REGAN_##a), (VM_REGAN_ACT_##b)), (v))
|
2006-12-31 18:02:22 +03:00
|
|
|
#else
|
2012-10-04 16:31:05 +04:00
|
|
|
#define COLLECT_USAGE_REGISTER_HELPER(a, b, v) (v)
|
2006-12-31 18:02:22 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* PC */
|
2012-10-04 16:31:05 +04:00
|
|
|
#define GET_PC() (COLLECT_USAGE_REGISTER_HELPER(PC, GET, REG_PC))
|
|
|
|
#define SET_PC(x) (REG_PC = (COLLECT_USAGE_REGISTER_HELPER(PC, SET, (x))))
|
2006-12-31 18:02:22 +03:00
|
|
|
#define GET_CURRENT_INSN() (*GET_PC())
|
|
|
|
#define GET_OPERAND(n) (GET_PC()[(n)])
|
|
|
|
#define ADD_PC(n) (SET_PC(REG_PC + (n)))
|
|
|
|
|
2007-08-14 14:53:53 +04:00
|
|
|
#define GET_PC_COUNT() (REG_PC - GET_ISEQ()->iseq_encoded)
|
2006-12-31 18:02:22 +03:00
|
|
|
#define JUMP(dst) (REG_PC += (dst))
|
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
/* frame pointer, environment pointer */
|
2012-10-04 16:31:05 +04:00
|
|
|
#define GET_CFP() (COLLECT_USAGE_REGISTER_HELPER(CFP, GET, REG_CFP))
|
|
|
|
#define GET_EP() (COLLECT_USAGE_REGISTER_HELPER(EP, GET, REG_EP))
|
|
|
|
#define SET_EP(x) (REG_EP = (COLLECT_USAGE_REGISTER_HELPER(EP, SET, (x))))
|
2012-06-11 07:14:59 +04:00
|
|
|
#define GET_LEP() (VM_EP_LEP(GET_EP()))
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
/* SP */
|
2012-10-04 16:31:05 +04:00
|
|
|
#define GET_SP() (COLLECT_USAGE_REGISTER_HELPER(SP, GET, REG_SP))
|
|
|
|
#define SET_SP(x) (REG_SP = (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x))))
|
|
|
|
#define INC_SP(x) (REG_SP += (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x))))
|
|
|
|
#define DEC_SP(x) (REG_SP -= (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x))))
|
2006-12-31 18:02:22 +03:00
|
|
|
#define SET_SV(x) (*GET_SP() = (x))
|
|
|
|
/* set current stack value as x */
|
|
|
|
|
|
|
|
#define GET_SP_COUNT() (REG_SP - th->stack)
|
|
|
|
|
|
|
|
/* instruction sequence C struct */
|
|
|
|
#define GET_ISEQ() (GET_CFP()->iseq)
|
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
/* deal with variables */
|
|
|
|
/**********************************************************/
|
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
#define GET_PREV_EP(ep) ((VALUE *)((ep)[0] & ~0x03))
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2011-01-24 15:51:13 +03:00
|
|
|
#define GET_GLOBAL(entry) rb_gvar_get((struct rb_global_entry*)(entry))
|
|
|
|
#define SET_GLOBAL(entry, val) rb_gvar_set((struct rb_global_entry*)(entry), (val))
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2009-07-13 08:44:20 +04:00
|
|
|
#define GET_CONST_INLINE_CACHE(dst) ((IC) * (GET_PC() + (dst) + 2))
|
2007-07-01 22:16:02 +04:00
|
|
|
|
2006-12-31 18:02:22 +03:00
|
|
|
/**********************************************************/
|
|
|
|
/* deal with values */
|
|
|
|
/**********************************************************/
|
|
|
|
|
2012-10-04 16:31:05 +04:00
|
|
|
#define GET_SELF() (COLLECT_USAGE_REGISTER_HELPER(SELF, GET, GET_CFP()->self))
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
/* deal with control flow 2: method/iterator */
|
|
|
|
/**********************************************************/
|
|
|
|
|
2012-08-02 15:34:19 +04:00
|
|
|
#define COPY_CREF_OMOD(c1, c2) do { \
|
2012-10-08 18:02:46 +04:00
|
|
|
(c1)->nd_refinements = (c2)->nd_refinements; \
|
|
|
|
if (!NIL_P((c2)->nd_refinements)) { \
|
2012-08-02 15:34:19 +04:00
|
|
|
(c1)->flags |= NODE_FL_CREF_OMOD_SHARED; \
|
|
|
|
(c2)->flags |= NODE_FL_CREF_OMOD_SHARED; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2007-06-30 22:27:20 +04:00
|
|
|
#define COPY_CREF(c1, c2) do { \
|
2006-12-31 18:02:22 +03:00
|
|
|
NODE *__tmp_c2 = (c2); \
|
2012-08-02 15:34:19 +04:00
|
|
|
COPY_CREF_OMOD(c1, __tmp_c2); \
|
2011-01-24 15:51:13 +03:00
|
|
|
(c1)->nd_clss = __tmp_c2->nd_clss; \
|
|
|
|
(c1)->nd_visi = __tmp_c2->nd_visi;\
|
|
|
|
(c1)->nd_next = __tmp_c2->nd_next; \
|
2011-03-30 09:38:50 +04:00
|
|
|
if (__tmp_c2->flags & NODE_FL_CREF_PUSHED_BY_EVAL) { \
|
|
|
|
(c1)->flags |= NODE_FL_CREF_PUSHED_BY_EVAL; \
|
|
|
|
} \
|
2007-06-30 22:27:20 +04:00
|
|
|
} while (0)
|
|
|
|
|
* insns.def (send, invokesuper, invokeblock, opt_*), vm_core.h:
use only a `ci' (rb_call_info_t) parameter instead of using
parameters such as `op_id', 'op_argc', `blockiseq' and flag.
These information are stored in rb_call_info_t at the compile
time.
This technique simplifies parameter passings at related
function calls (~10% speedups for simple mehtod invocation at
my machine).
`rb_call_info_t' also has new function pointer variable `call'.
This `call' variable enables to customize method (block)
invocation process for each place. However, it always call
`vm_call_general()' at this changes.
`rb_call_info_t' also has temporary variables for method
(block) invocation.
* vm_core.h, compile.c, insns.def: introduce VM_CALL_ARGS_SKIP_SETUP
VM_CALL macro. This flag indicates that this call can skip
caller_setup (block arg and splat arg).
* compile.c: catch up above changes.
* iseq.c: catch up above changes (especially for TS_CALLINFO).
* tool/instruction.rb: catch up above chagnes.
* vm_insnhelper.c, vm_insnhelper.h: ditto. Macros and functions
parameters are changed.
* vm_eval.c (vm_call0): ditto (it will be rewriten soon).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-14 20:59:05 +04:00
|
|
|
#define CALL_METHOD(ci) do { \
|
|
|
|
VALUE v = (*(ci)->call)(th, GET_CFP(), (ci)); \
|
2007-06-30 22:27:20 +04:00
|
|
|
if (v == Qundef) { \
|
|
|
|
RESTORE_REGS(); \
|
|
|
|
NEXT_INSN(); \
|
|
|
|
} \
|
|
|
|
else { \
|
|
|
|
val = v; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2012-10-15 00:59:21 +04:00
|
|
|
/* set fastpath when cached method is *NOT* protected
|
|
|
|
* because inline method cache does not care about receiver.
|
|
|
|
*/
|
2012-10-15 21:40:50 +04:00
|
|
|
|
|
|
|
#ifndef OPT_CALL_FASTPATH
|
|
|
|
#define OPT_CALL_FASTPATH 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if OPT_CALL_FASTPATH
|
|
|
|
#define CI_SET_FASTPATH(ci, func, enabled) do { \
|
|
|
|
if (LIKELY(enabled)) ((ci)->call = (func)); \
|
2012-10-15 00:59:21 +04:00
|
|
|
} while (0)
|
2012-10-15 21:40:50 +04:00
|
|
|
#else
|
|
|
|
#define CI_SET_FASTPATH(ci, func, enabled) /* do nothing */
|
|
|
|
#endif
|
2012-10-15 00:59:21 +04:00
|
|
|
|
2012-06-11 07:14:59 +04:00
|
|
|
#define GET_BLOCK_PTR() ((rb_block_t *)(GC_GUARDED_PTR_REF(GET_LEP()[0])))
|
2006-12-31 18:02:22 +03:00
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
/* deal with control flow 3: exception */
|
|
|
|
/**********************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
/* others */
|
|
|
|
/**********************************************************/
|
|
|
|
|
|
|
|
/* optimize insn */
|
2011-08-25 02:02:03 +04:00
|
|
|
#define FIXNUM_REDEFINED_OP_FLAG (1 << 0)
|
|
|
|
#define FLOAT_REDEFINED_OP_FLAG (1 << 1)
|
|
|
|
#define STRING_REDEFINED_OP_FLAG (1 << 2)
|
|
|
|
#define ARRAY_REDEFINED_OP_FLAG (1 << 3)
|
|
|
|
#define HASH_REDEFINED_OP_FLAG (1 << 4)
|
|
|
|
#define BIGNUM_REDEFINED_OP_FLAG (1 << 5)
|
|
|
|
#define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
|
|
|
|
#define TIME_REDEFINED_OP_FLAG (1 << 7)
|
2013-09-26 11:39:48 +04:00
|
|
|
#define REGEXP_REDEFINED_OP_FLAG (1 << 8)
|
2011-08-25 02:02:03 +04:00
|
|
|
|
|
|
|
#define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((ruby_vm_redefined_flag[(op)]&(klass)) == 0))
|
2012-08-23 11:22:40 +04:00
|
|
|
|
|
|
|
#define FIXNUM_2_P(a, b) ((a) & (b) & 1)
|
|
|
|
#if USE_FLONUM
|
|
|
|
#define FLONUM_2_P(a, b) (((((a)^2) | ((b)^2)) & 3) == 0) /* (FLONUM_P(a) && FLONUM_P(b)) */
|
|
|
|
#else
|
|
|
|
#define FLONUM_2_P(a, b) 0
|
|
|
|
#endif
|
2006-12-31 18:02:22 +03:00
|
|
|
|
2009-09-07 00:42:50 +04:00
|
|
|
#ifndef USE_IC_FOR_SPECIALIZED_METHOD
|
|
|
|
#define USE_IC_FOR_SPECIALIZED_METHOD 1
|
|
|
|
#endif
|
|
|
|
|
2013-08-31 09:45:10 +04:00
|
|
|
#define CALL_SIMPLE_METHOD(recv_) do { \
|
* insns.def (send, invokesuper, invokeblock, opt_*), vm_core.h:
use only a `ci' (rb_call_info_t) parameter instead of using
parameters such as `op_id', 'op_argc', `blockiseq' and flag.
These information are stored in rb_call_info_t at the compile
time.
This technique simplifies parameter passings at related
function calls (~10% speedups for simple mehtod invocation at
my machine).
`rb_call_info_t' also has new function pointer variable `call'.
This `call' variable enables to customize method (block)
invocation process for each place. However, it always call
`vm_call_general()' at this changes.
`rb_call_info_t' also has temporary variables for method
(block) invocation.
* vm_core.h, compile.c, insns.def: introduce VM_CALL_ARGS_SKIP_SETUP
VM_CALL macro. This flag indicates that this call can skip
caller_setup (block arg and splat arg).
* compile.c: catch up above changes.
* iseq.c: catch up above changes (especially for TS_CALLINFO).
* tool/instruction.rb: catch up above chagnes.
* vm_insnhelper.c, vm_insnhelper.h: ditto. Macros and functions
parameters are changed.
* vm_eval.c (vm_call0): ditto (it will be rewriten soon).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-14 20:59:05 +04:00
|
|
|
ci->blockptr = 0; ci->argc = ci->orig_argc; \
|
2013-08-31 09:45:10 +04:00
|
|
|
vm_search_method(ci, ci->recv = (recv_)); \
|
* insns.def (send, invokesuper, invokeblock, opt_*), vm_core.h:
use only a `ci' (rb_call_info_t) parameter instead of using
parameters such as `op_id', 'op_argc', `blockiseq' and flag.
These information are stored in rb_call_info_t at the compile
time.
This technique simplifies parameter passings at related
function calls (~10% speedups for simple mehtod invocation at
my machine).
`rb_call_info_t' also has new function pointer variable `call'.
This `call' variable enables to customize method (block)
invocation process for each place. However, it always call
`vm_call_general()' at this changes.
`rb_call_info_t' also has temporary variables for method
(block) invocation.
* vm_core.h, compile.c, insns.def: introduce VM_CALL_ARGS_SKIP_SETUP
VM_CALL macro. This flag indicates that this call can skip
caller_setup (block arg and splat arg).
* compile.c: catch up above changes.
* iseq.c: catch up above changes (especially for TS_CALLINFO).
* tool/instruction.rb: catch up above chagnes.
* vm_insnhelper.c, vm_insnhelper.h: ditto. Macros and functions
parameters are changed.
* vm_eval.c (vm_call0): ditto (it will be rewriten soon).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-14 20:59:05 +04:00
|
|
|
CALL_METHOD(ci); \
|
2007-06-24 17:05:51 +04:00
|
|
|
} while (0)
|
|
|
|
|
* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
vm_method.c: Implement class hierarchy method cache invalidation.
[ruby-core:55053] [Feature #8426] [GH-387]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-04 09:25:06 +04:00
|
|
|
#define NEXT_CLASS_SEQUENCE() (++ruby_vm_sequence)
|
* insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h, vm_method.c: split
ruby_vm_global_state_version into two separate counters - one for the
global method state and one for the global constant state. This means
changes to constants do not affect method caches, and changes to
methods do not affect constant caches. In particular, this means
inclusions of modules containing constants no longer globally
invalidate the method cache.
* class.c, eval.c, include/ruby/intern.h, insns.def, vm.c, vm_method.c:
rename rb_clear_cache_by_class to rb_clear_method_cache_by_class
* class.c, include/ruby/intern.h, variable.c, vm_method.c: add
rb_clear_constant_cache
* compile.c, vm_core.h, vm_insnhelper.c: rename vmstat field in
rb_call_info_struct to method_state
* vm_method.c: rename vmstat field in struct cache_entry to method_state
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43455 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-29 04:52:38 +04:00
|
|
|
#define GET_METHOD_STATE_VERSION() (ruby_vm_method_state_version)
|
|
|
|
#define INC_METHOD_STATE_VERSION() (++ruby_vm_method_state_version)
|
|
|
|
#define GET_CONSTANT_STATE_VERSION() (ruby_vm_constant_state_version)
|
|
|
|
#define INC_CONSTANT_STATE_VERSION() (++ruby_vm_constant_state_version)
|
2011-06-13 15:25:44 +04:00
|
|
|
|
2011-10-06 15:51:55 +04:00
|
|
|
static VALUE make_no_method_exception(VALUE exc, const char *format,
|
2011-10-06 11:29:33 +04:00
|
|
|
VALUE obj, int argc, const VALUE *argv);
|
|
|
|
|
|
|
|
|
2008-01-18 11:56:11 +03:00
|
|
|
#endif /* RUBY_INSNHELPER_H */
|